第4章符号运算4.1符号对象的创建和使用4.2符号对象的运算4.3符号表达式的变换4.4符号微积分、极限和级数4.5符号积分变换4.6符号方程的求解4.7符号函数的可视化MATLAB2006b对应的是SymbolicMathToolbox3.1.5。符号运算的对象是非数值的符号对象,对于像公式推导和因式分解等抽象的运算都可以通过符号运算来解决。符号工具箱能够实现微积分运算、线性代数、表达式的化简、求解代数方程和微分方程、不同精度转换和积分变换,符号计算的结果可以以图形化显示,MATLAB的符号运算功能十分完整和方便。符号运算的特点:(1)符号运算以推理解析的方式进行,计算的结果不受计算累积误差影响;(2)符号计算可以得出完全正确的封闭解和任意精度的数值解;(3)符号计算命令调用简单;(4)符号计算所需要的时间较长。4.1符号对象的创建和使用创建符号对象都可以使用sym和syms函数来实现。1.sym函数S=sym(s,参数)%由数值创建符号对象S=sym(‘s’,参数)%由字符串创建符号对象当被转换的s是数值时,参数可以是'd'、'f'、'e'或'r'四种格式,当被转换的's'是字符串时,参数可以是'real'、'unreal'和'positive'三种格式4.1.1创建符号对象2.syms函数syms(s1,s2,s3,…,参数)或symss1,s2,s3,…,参数%创建多个符号变量syms与sym的关系是:syms(s1,s2,s3,…,参数)等同于s1=sym('s1',参数),s2=sym('s2',参数)……3.class函数s=class(x)%返回对象x的数据类型4.1.2符号常量和符号变量符号常量是不含变量的符号表达式,用sym函数来创建;符号变量使用sym和syms函数来创建。例如:a1=sym(sin(2))%用数值创建符号常量a2=sym(sin(2),'f')%用十六进制浮点表示a1=sym('a','unreal')%用字符串创建符号变量练习4.1.3符号表达式符号表达式是由符号常量和符号变量等构成的表达式,使用sym和syms函数来创建。例4-3分别使用sym和syms函数创建符号表达式。symsabcxf1=a*x^2+b*x+cf1=a*x^2+b*x+cf2=sym('y^2+y+1')%创建符号表达式f2=y^2+y+1f3=sym('sin(z)^2+cos(z)^2=1')%创建符号方程f3=sin(z)^2+cos(z)^2=14.1.4符号矩阵符号矩阵的元素是符号对象,符号矩阵可以用sym和syms函数来创建。A=sym('[a,b;c,d]')A=[a,b][c,d]4.2符号对象的运算4.2.1符号对象的基本运算1.算术运算(1)“+”,“-”,“*”,“\”,“/”,“^”(2)“.*”,“./”,“.\”,“.^”(3)“′”,“.′”2.关系运算只有运算符“==”、“~=”分别对符号对象进行“相等”、“不等”的比较。3.三角函数、双曲函数和相应的反函数三角函数包括sin、cos和tan,双曲函数包括sinh、cosh和tanh4.指数和对数函数5.复数函数6.矩阵代数命令例:A=sym('[a,b;c,d]');B=sym('[12;34]');C=A+BC=[a+1,b+2][c+3,d+4]练习4.2.2任意精度的算术运算1.符号工具箱的算术运算方式(1)数值型(2)有理数型(3)VPA型2.不同类型对象的转换(1)获得VPA型对象digits(n)%设定n位有效位数的精度S=vpa(s,n)%将s按n位有效位数计算得出符号对象S例:digits%显示默认精度Digits=32q=sym('sqrt(2)')q=sqrt(2)q=vpa(q)%按默认精度计算并显示q=1.4142135623730950488016887242097(2)获得数值型对象n=double(s)%将符号对象s转换为双精度数值对象n(3)不同类型对象转换关系数值型有理数型VPA型doubledoublesymvpavpa4.3符号表达式的变换4.3.1符号表达式中的自由符号变量1.自由符号变量的确定以下原则来选择一个自由符号变量:符号表达式中的多个符号变量,按以下顺序来选择自由符号变量:首先选择x,如果没有x,则选择在字母表顺序中最接近x的字符变量,如果字母与x的距离相同,则在x后面的优先;字母pi、i和j不能作为自由符号变量;大写字母比所有的小写字母都靠后。2.findsym函数findsym(S,n)%确定符号对象S中的n个自由符号变量练习4.3.2符号表达式的化简多项式的符号表达式有多种形式,例如,f(x)=x3+6x2+11x-6可以表示为:合并同类项形式:f(x)=x3+6x2+11x-6因式分解形式:f(x)=(x-1)(x-2)(x-3)嵌套形式:f(x)=x(x(x-6)+11)-61.collect函数collect函数用来将符号表达式中同类项合并:S=collect(s,符号变量)%将s中符号变量的同次幂合并2.expand函数expand函数将符号表达式中的各项进行展开,展开成多项式和的形式,多用于多项式、三角函数、指数函数和对数函数的展开。symsxyf1=(x-1)*(x-2)*(x-3);g1=collect(f1)%按x合并同类项f2=cos(x-y);g2=expand(f2)%多项式展开3.horner函数horner函数将符号表达式化简成嵌套的形式。4.factor函数factor函数将符号多项式进行因式分解,将多项式分解成低阶多项式相乘,如果不能分解则返回原来的符号多项式。symsxtf1=x^3-6*x^2+11*x-6;g1=horner(f1)%转换为嵌套形式g1=-6+(11+(-6+x)*x)*xg12=factor(f1)g12=(x-1)*(x-2)*(x-3)5.pretty函数pretty函数将符号表达式给出排版形式的输出结果。6.simplify函数simplify函数是一个功能强大的函数,利用各种形式的代数恒等式对符号表达式进行化简,包括求和、分解、积分、幂、三角、指数、对数、Bessel以及超越函数等方法来简化表达式。7.simple函数找出字符最少的简化表达式,simple函数适用于三角函数化简。例:symsxyf2=cos(x)^2+sin(x)^2;g2=simplify(f2)simple(f2)练习4.3.4计算反函数和复合函数1.反函数函数f(x)存在一个反函数g(.),g(f(x))=x,则g和f互为反函数g=finverse(f,v)%对f(v)按指定自变量v求反函数例:symsxyf=5*sin(x)+y;g1=finverse(f,'y')%对y求反函数g1=-5*sin(x)+y2.复合函数MATLAB7.3提供了compose函数可以求出f(x)和g(y)的复合函数f(g(y))。compose(f,g,x,y,z)%计算f和g的复合函数例:symsxytvnf=x+y;g=t*v;y1=compose(f,g)%以x为符号变量求复合函数y1=t*v+yy4=compose(f,g,y,t,'n')%以n代替t求复合函数f(g(n))y4=x+n*v4.3.5多项式符号表达式1.多项式符号表达式的通分[N,D]=numden(s)%提取多项式符号表达式s的分子和分母2.符号表达式与多项式的互换c=sym2poly(s)%将符号表达式s转换为行向量cr=poly2sym(c,v)%将行向量c转换为符号表达式r例:f1=sym('1/(x-1)+1/(x+1)+3');[N1,D1]=numden(f1)N1=2*x+3*x^2-331111xx132322sss4.4.1符号表达式的微积分1.微分diff(f,t,n)%计算f对符号变量t的n阶微分例4-18计算符号表达式f=sin(ax)+y2cos(x)的微分。symsaxyf=sin(a*x)+y^2*cos(x);dfdx=diff(f)%对默认自由变量x求一阶微分dfdx=cos(a*x)*a-y^2*sin(x)dfdy2=diff(f,y,2)%对符号变量y求二阶微分dfdy2=2*cos(x)4.4符号微积分、极限和级数2.积分int(f,t,a,b)%计算符号变量t的积分说明:f为符号表达式;t为积分符号变量,可以省略,当t省略时则指默认自由符号变量;a和b是为积分上下限[ab],可以省略,省略时计算的是不定积分。例:symsarphig=r^2*(sin(phi))^2;f=int(int(f,r,0,a),phi,0,2*pi)f=2*sin(a*x)*a*pi+2*y^2*cos(x)*a*piddrrfa02220sin练习4.4.2符号表达式的极限极限:limt(f,x,a)例4-22使用limit函数计算符号表达式的极限,和symstf1=exp(-t)*sin(t);ess=limit(f1,t,inf)%计算趋向无穷大的极限ess=0limitf2_l=limit(f2,'t','0','left')%计算趋向0的左极限limitf2_l=-Inflimitf2_r=limit(f2,'t','0','right')%计算趋向0的右极限limitf2_r=Inflimitf2=limit(f2)%计算趋向0的极限limitf2=NaN左右极限不相等,极限不存在表示为NaN)sin(tett14.4.3符号表达式的级数1.级数求和symsum(s,x,a,b)%计算表达式s当x从a到b的级数和例4-23使用symsum函数对符号表达式进行级数求和。2.taylor级数taylor(f,x,n,x0)%求泰勒级数以符号变量x在x0点展开n项2)0(!2)0('')0)(0(')0()(xxxfxxxfxfxf例4-24使用taylor函数对符号表达式cos(x)在x=1展开前3项,对进行泰勒级数展开。)sin(tet4.5符号积分变换4.5.1Fourier变换F=fourier(f,t,w)%求以t为符号变量的f的fourier变换Ff=ifourier(F,w,t)%求以w为符号变量的F的fourier反变换f例4-25使用fourier和ifourier函数对符号表达式sin(x)进行积分变换。symsxf1=sin(x);ff1=fourier(f1)%fourier变换ff1=i*pi*(-dirac(w-1)+dirac(w+1))if1=ifourier(ff1)%fourier反变换if1=sin(x)4.5.2Laplace变换F=laplace(f,t,s)%求以t为变量f的Laplace变换Ff=ilaplace(F,s,t)%求以s为变量的F的Laplace反变换f例:symstwsf2=t;lf1=laplace(heaviside(t))%对单位阶跃函数求laplace变换lf1=1/s4.5.3Z变换F=ztrans(f,n,z)%求以n为变量的f的Z变换Ff=iztrans(F,z,n)%求以z为变量的F的z反变换f例:symsknztzf1=ztrans(heaviside(t),n,z)%对单位阶跃函数求Z变换zf1=heaviside(t)*z/(z-1)4.6符号方程的求解4.6.1代数方程的求解一般的代数方程包括线性方程、非线性方程和超越方程。当方程不存在解析解又无其他自由参数时,MATLAB提供了solve函数得出方程的数值解。solve('eqn','v')%求方程关于指定变量v的解solve