第四章符号数学基础计算机及信息工程学院•MATLAB的符号数学工具箱的主要功能包括:符号表达式的创建、符号矩阵的运算、符号表达式的化简和替换、符号微积分、符号代数方程、符号微分方程、符号函数绘图等。•4.1符号对象的创建•4.1.1创建符号变量和表达式•MATLAB的符号数学工具箱提供了两个基本函数,用来创建符号变量和表达式,分别是sym和syms。•函数sym的调用形式为:lx=sym(‘x’)创建一个符号变量x,它可以是字符、字符串、表达式或字符表达式。•函数syms用于方便地一次创建多个符号变量,其调用形式为:lsymsabc…•【例4-1】使用sym函数创建符号变量。•a=sym('a')•b=sym('hello')•c=sym('(1+sqrt(5))/2')•y=sym('x^3+5*x^2+12*x+20')•【例4-2】使用syms函数创建符号变量。•symsabcd•4.1.2创建符号矩阵•【例4-3】创建一个循环矩阵。•在命令窗口输入:•symsabcd•n=[abcd;bcda;cdab;dabc]•n=•[a,b,c,d]•[b,c,d,a]•[c,d,a,b]•[d,a,b,c]【例4-4】将3阶Hilbert矩阵转换为符号矩阵。•在命令窗口创建Hibert矩阵,然后用sym函数转换为符号矩阵。•h=hilb(3)•h=•1.00000.50000.3333•0.50000.33330.2500•0.33330.25000.2000•hi=sym(h)•hi=•[1,1/2,1/3]•[1/2,1/3,1/4]•[1/3,1/4,1/5]**注意符号矩阵与普通数值矩阵的区别.在命令窗口显示时,数值矩阵只显示数值,而符号矩阵的每行元素放在一对方括号内.在WORKSPACE中的图标也不一样.•4.1.3默认符号变量•在MATLAB中,以最接近x的顺序排列默认自变量的顺序,使用函数findsym对默认自变量进行查询。•由于i和j通常表示虚数单位,在符号运算中不能作为自变量。•【例4-6】查询符号函数中的默认自变量。•在命令窗口创建符号变量a、b、n、x、y和t,建立函数,然后求f的默认自变量。•symsabntxy•f=a*x^n+b*y+c*t•findsym(f,6)•ans=x,y,t,n,c,b%按最接近x顺序排序•findsym(f)•ans=•a,b,c,n,t,x,y%按字母排序ctbyaxfn•4.2符号表达式的化简和替换•4.2.1符号表达式的化简•符号数学工具箱提供了符号表达式的因式分解、展开、合并、化简、通分等操作。•1.因式分解•符号表达式的因式分解函数为factor,其调用格式为:•factor(S)因式分解符号表达式S的各个元素,如果S的所有元素为整数,则计算其最佳因数分解。•【例4-7】对表达式进行因式分解。•在命令窗口创建符号矢量x,对表达式•进行因式分解。•symsx•f=factor(x^9-1)•pretty(f)%将表达式按照类似书写习惯的方式显示。•f=•(x-1)*(x^2+x+1)*(x^6+x^3+1)•(x-1)(x2+x+1)(x6+x3+1)19xf19xf•【例4-8】对大整数12345678901234567890进行因式分解。•在命令窗口输入命令,进行因式分解:•factor(sym('12345678901234567890'))%先把数值转换成符号•ans=•(2)*(3)^2*(5)*(101)*(3803)*(3607)*(27961)*(3541)•对整数120进行因式分解。•factor(sym('120'))•ans=•(2)^3*(3)*(5)•2.符号表达式的展开•符号表达式的展开函数为expand,其调用格式为:lexpand(S)因式展开符号表达式S。•【例4-9】展开表达式和。•在命令窗口创建符号变量x和y,展开表达式•和•symsxy•f=(x+1)^5;•expand(f)•ans=x^5+5*x^4+10*x^3+10*x^2+5*x+1•f=sin(x+y);•expand(f)•ans=sin(x)*cos(y)+cos(x)*sin(y)5)1(xf)sin(yxf)sin(yxf5)1(xf•3.符号表达式的同类项合并•符号表达式的同类项合并函数为collect,其调用格式为:lcollect(S,n)将符号表达式S中自变量n的同次幂项的系数合并。缺省按x合并同类项。•【例4-10】对于表达式f=x(x(x-6)+12)t,分别将自变量x和t的同类项合并。•在命令窗口创建符号变量x和t,合并按x和t合并表达式f=x(x(x-6)+12)t的同类项:•symsxt•f=x*(x*(x-6)+12)*t;•collect(f)%缺省按x合并同类项•ans=•t*x^3-6*t*x^2+12*t*x••collect(f,t)%按t合并同类项•ans=•x*(x*(x-6)+12)*t•若表达式为f=x*(t*(t-6)-33)*t;•f=x*(t*(t-6)-33)*t;•collect(f)•ans=•x*(t*(t-6)-33)*t•collect(f,t)•ans=•x*t^3-6*x*t^2-33*t*x4.符号表达式的化简MATLAB的符号数学工具箱提供了两个化简函数,分别为simple和simplify。函数simplify的调用格式为:lsimplify(S)化简函数,使用Maple的化简规则可用于化简各种表达式。%1980年9月,加拿大Waterloo大学的符号计算机研究小组成立,开始了符号计算在计算机上实现的研究项目,数学软件Maple是这个项目的产品.【例4-11】对表达式进行化简:在命令窗口创建符号变量x,对表达式进行化简。symsxf=sin(x)^2+cos(x)^2;simplify(f)ans=122cossinxxf22cossinxxf•函数simple通过对表达式尝试多种不同的算法进行化简,以寻求符号表达式S的最简形式,其调用格式为:l[r,how]=simple(S)返回S的最简化形式,r为返回的简化形式,how为化简过程中使用的主要方法,simple函数综合使用了下列化简方法:lsimplify函数对表达式进行化简;lradsimp函数对含根式的表达式进行化简;lcombine函数将表达式中以求和、乘积、幂运算等形式出现的项进行合并;lcollect合并同类项;lfactor函数实现因式分解lconvert函数完成表达式形式的转换。•表4-1使用simple函数的一些示例表达式简化形式化简方法cos(x)^2+sin(x)^21simplify2*cos(x)^2-sin(x)^23*cos(x)^2-1simplifycos(x)^2-sin(x)^2cos(2*x)combinecos(x)+(-sin(x)^2)^(1/2)cos(x)+i*sin(x)radsimpcos(x)+i*sin(x)exp(i*x)convert(exp)(x+1)*x*(x-1)x^3-xcollect(x)X^3+3*x^2+3*x+1(x+1)^3factorcos(3*acos(x))4*x^3-3*xexpand•5.符号表达式的分式通分•符号表达式的分式通分函数为numden,其调用格式为:•[n,d]=numden(S)将符号表达式S转换为分子和分母都是整系数的最佳多项式。•【例4-12】对表达式进行通分。•在命令窗口创建符号变量x,y,对表达式•进行通分:•symsxy•f=x/y+y/x;•[n,d]=numden(f)•n=x^2+y^2•d=y*xxyyxfxyyxf•6.符号表达式的嵌套形式重写•符号表达式的嵌套形式重写函数为horner,其调用格式为:lhorner(S)将符号表达式S转换为嵌套形式。【例4-13】对表达式进行嵌套形式重写。在命令窗口创建符号变量,对表达式进行嵌套形式重写。symsxf=x^3+6*x^2+11*x-6;horner(f)ans=-6+(11+(6+x)*x)*x611623xxxf611623xxxf4.2.2符号表达式的替换MATLAB的符号数学工具箱提供了两个符号表达式的替换函数subexpr和subs,可以通过符号替换使表达式的输出形式简化,以得到一个简单的表达式。•将表达式中重复出现的字符串用变量代替的函数为subexpr,其调用格式为:l[Y,SIGMA]=subexpr(S,SIGMA)此函数用变量SIGMA(字符或字符串)的值代替符号表达式S中重复出现的字符串.Y返回结果•【例4-14】求解并化简三次方程的符号解。•t=solve('x^3+a*x+1=0')%函数solve为求代数方程的符号解•t=•[1/6*(-108+12*(12*a^3+81)^(1/2))^(1/3)-2*a/(-108+12*(12*a^3+81)^(1/2))^(1/3)]•[-1/12*(-108+12*(12*a^3+81)^(1/2))^(1/3)+a/(-108+12*(12*a^3+81)^(1/2))^(1/3)+1/2*i*3^(1/2)*(1/6*(-108+12*(12*a^3+81)^(1/2))^(1/3)+2*a/(-108+12*(12*a^3+81)^(1/2))^(1/3))]013axx•[-1/12*(-108+12*(12*a^3+81)^(1/2))^(1/3)+a/(-108+12*(12*a^3+81)^(1/2))^(1/3)-1/2*i*3^(1/2)*(1/6*(-108+12*(12*a^3+81)^(1/2))^(1/3)+2*a/(-108+12*(12*a^3+81)^(1/2))^(1/3))]•[r,s]=subexpr(t,'s')%s=-108+12*(12*a^3+81)^(1/2)•r=•[1/6*s^(1/3)-2*a/s^(1/3)]•[1/12*s^(1/3)+a/s^(1/3)+1/2*i*3^(1/2)*(1/6*s^(1/3)+2*a/s^(1/3))]•[-1/12*s^(1/3)+a/s^(1/3)-1/2*i*3^(1/2)*(1/6*s^(1/3)+2*a/s^(1/3))]•s=•-108+12*(12*a^3+81)^(1/2)•函数subs用指定符号替换符号表达式中的某一特定符号,其调用格式为:•R=subs(S,old,new)用新的符号变量new替换原来符号表达式S中的变量old。•【例4-15】分别用新变量替代表达式a+b和cosa+sinb中的变量。•在命令窗口创建符号变量a和b,输入变量替换命令:•symsab•subs(a+b,a,4)•ans=•4+b•subs(cos(a)+sin(b),{a,b},{sym('alpha'),2})•ans=•cos(alpha)+sin(2)•4.3符号微积分•4.3.1符号极限•极限是微积分的基础。在MATLAB中,极限的求解有limit函数实现,其调用格式为:•limit(F,x,a)计算符号表达式F在条件下的极限•limit(F,a)计算符号表达式F中默认自变量趋向于a条件下的极限。•limit(F)计算符号表达式F在默认自变量趋向于0时的极限。•limit(F,x,a,‘right’)和limit(F,x,a,’left’)计算符号表达式F在条件下的右极限和左极限。ax•【例4-16】分别计算表达式、、•和的极限。•在命令窗口创建符号变量a和x,分别计算上面可表达式的极限:•symsxa;•limit(sin(x)/x)•limit(1/x,x,0,'right')•limit(1/x,x,0,'left')•v=[(1+a/x)^x,ex