第六讲MATLAB符号运算MATLAB不仅具有数值运算功能,还开发了在MATLAB环境下实现符号计算的工具包SymbolicMathToolbox和大量的符号运算函数,符号运算的主要功能有(1)符号表达式、符号矩阵的创建;(2)符号线性代数;(3)因式分解、展开和简化;(4)符号代数方程求解;(5)符号微积分;(6)符号微分方程。第一节符号运算的基本操作一、概述1、什么是符号运算符号运算与数值运算的区别:(1)数值运算中必须先对变量赋值,然后才能参与运算;(2)符号运算无须事先对独立变量赋值,运算结果以标准的符号形式表达。2、特点(1)运算对象可以是没赋值的符号变量;(2)可以获得任意精度的解析解。二、符号矩阵的创建数值矩阵A=[1,2;3,4]可以,A=[a,b;c,d]不可以。MATLAB提供了两个建立符号对象的函数:sym和syms,两个函数的用法不同。1、sym函数sym函数用来建立单个符号量,一般调用格式为:符号量名=sym('符号字符串')该函数可以建立一个符号量,符号字符串可以是常量、变量、函数或表达式。应用sym函数还可以定义符号常量,使用符号常量进行代数运算时和数值常量进行的运算不同。例:A=sym('[a,2*b;3*a,0]')A=[a,2*b][3*a,0]这就完成了一个符号矩阵的创建。注意:符号矩阵的每一行的两端都有方括号,这是与MATLAB数值矩阵的一个重要区别。把字符表达式转换为符号变量。例:y=sym('2*sin(x)*cos(x)')y=2*cos(x)*sin(x)y=simple(y)y=sin(2*x)2、syms函数函数sym一次只能定义一个符号变量,使用不方便。MATLAB提供了另一个函数syms,一次可以定义多个符号变量。syms函数的一般调用格式为:syms符号变量名1符号变量名2…符号变量名n用这种格式定义符号变量时不要在变量名上加字符串分界符(‘),变量间用空格而不要用逗号分隔。例:①用符号计算验证三角等式。symsfai1fai2;y=simple(sin(fai1)*cos(fai2)-cos(fai1)*sin(fai2))y=sin(fai1-fai2)②求矩阵的行列式值、逆和特征根。symsa11a12a21a22;A=[a11,a12;a21,a22]A=[a11,a12][a21,a22]DA=det(A),IA=inv(A),EA=eig(A)DA=a11*a22-a12*a21IA=[a22/(a11*a22-a12*a21),-a12/(a11*a22-a12*a21)][-a21/(a11*a22-a12*a21),a11/(a11*a22-a12*a21)]EA=a11/2+a22/2-(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)/2a11/2+a22/2+(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)/2符号常数形成中的差异a1=[1/3,pi/7,sqrt(5),pi+sqrt(5)]%a1是数值常数1a2=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)])%最接近的有理表示2a3=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)],'e')%带估计误差的有理表示3a4=sym('[1/3,pi/7,sqrt(5),pi+sqrt(5)]')%绝对准确的符号数值表示4a24=a2-a4a1=0.33330.44882.23615.3777a2=[1/3,pi/7,5^(1/2),189209612611719/35184372088832]a3=[1/3-eps/12,pi/7-(13*eps)/165,(137*eps)/280+5^(1/2),189209612611719/35184372088832]a4=[1/3,pi/7,5^(1/2),pi+5^(1/2)]a24=[0,0,0,189209612611719/35184372088832-5^(1/2)-pi]第二节因式分解、展开和简化一、因式分解1、factor指令的使用symsax;f1=x^4-5*x^3+5*x^2+5*x-6;factor(f1)ans=(x-1)*(x-2)*(x-3)*(x+1)f2=x^2-a^2;factor(f2)ans=-(a-x)*(a+x)2、对多项式进行嵌套型分解clear;symsax;f1=x^4-5*x^3+5*x^2+5*x-6;horner(f1)ans=x*(x*(x*(x-5)+5)+5)-6二、多项式展开clear;symsax;f1=x^4-5*x^3+5*x^2+5*x-6;horner(f1)ans=x*(x*(x*(x-5)+5)+5)-6expand(ans)ans=x^4-5*x^3+5*x^2+5*x-6三、多项式简化①简化。symsx;f=(1/x^3+6/x^2+12/x+8)^(1/3);sfy1=simplify(f),sfy2=simplify(sfy1)sfy1=((2*x+1)^3/x^3)^(1/3)sfy2=((2*x+1)^3/x^3)^(1/3)g1=simple(f),g2=simple(g1)g1=((2*x+1)^3/x^3)^(1/3)g2=((2*x+1)^3/x^3)^(1/3)②简化。symsx;ff=cos(x)+sqrt(-sin(x)^2);ssfy1=simplify(ff),ssfy2=simplify(ssfy1)ssfy1=cos(x)+(-sin(x)^2)^(1/2)ssfy2=cos(x)+(-sin(x)^2)^(1/2)gg1=simple(ff),gg2=simple(gg1)gg1=cos(x)+(-sin(x)^2)^(1/2)gg2=cos(x)+(-sin(x)^2)^(1/2)第三节符号微积分一、极限limit函数的调用格式为:limit(f,x,a):求符号函数f(x)的极限值。即计算当变量x趋近于常数a时,f(x)函数的极限值;limit(f,a):求符号函数f(x)的极限值。由于没有指定符号函数f(x)的自变量,则使用该格式时,符号函数f(x)的变量为函数findsym(f)确定的默认自变量,即变量x趋近于a;limit(f):求符号函数f(x)的极限值。符号函数f(x)的变量为函数findsym(f)确定的默认变量;没有指定变量的目标值时,系统默认变量趋近于0,即a=0的情况;limit(f,x,a,'right'):求符号函数f的极限值。'right'表示变量x从右边趋近于a;limit(f,x,a,‘left’):求符号函数f的极限值。‘left’表示变量x从左边趋近于a。例:symsamx;f=(x*(exp(sin(x))+1)-2*(exp(tan(x))-1))/(x+a);limit(f,x,a)ans=(a-2*exp(sin(a)/cos(a))+a*exp(sin(a))+2)/(2*a)symsxt;limit((1+2*t/x)^(3*x),x,inf)ans=exp(6*t)symsx;f=x*(sqrt(x^2+1)-x);limit(f,x,inf,'left')ans=1/2symsx;f=(sqrt(x)-sqrt(2)-sqrt(x-2))/sqrt(x*x-4);limit(f,x,2,'right')ans=-1/2二、符号导数diff函数用于对符号表达式求导数。该函数的一般调用格式为:diff(s):没有指定变量和导数阶数,则系统按findsym函数指示的默认变量对符号表达式s求一阶导数;diff(s,'v'):以v为自变量,对符号表达式s求一阶导数;diff(s,n):按findsym函数指示的默认变量对符号表达式s求n阶导数,n为正整数;diff(s,'v',n):以v为自变量,对符号表达式s求n阶导数。例:求、和。symsatx;f=[a,t^3;t*cos(x),log(x)];df=diff(f)dfdt2=diff(f,t,2)dfdxdt=diff(diff(f,x),t)df=[0,0][-t*sin(x),1/x]dfdt2=[0,6*t][0,0]dfdxdt=[0,0][-sin(x),0]三、符号积分符号积分由函数int来实现。该函数的一般调用格式为:int(s):没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数或符号表达式s求不定积分;int(s,v):以v为自变量,对被积函数或符号表达式s求不定积分;int(s,v,a,b):求定积分运算。a,b分别表示定积分的下限和上限。该函数求被积函数在区间[a,b]上的定积分。a和b可以是两个具体的数,也可以是一个符号表达式,还可以是无穷(inf)。当函数f关于变量x在闭区间[a,b]上可积时,函数返回一个定积分结果。当a,b中有一个是inf时,函数返回一个广义积分。当a,b中有一个符号表达式时,函数返回一个符号函数。例:①求。演示:积分指令对符号函数矩阵的作用。symsabx;f=[a*x,b*x^2;1/x,sin(x)];int(f)ans=[(a*x^2)/2,(b*x^3)/3][log(x),-cos(x)]②求积分。注意:内积分上下限都是函数。symsxyzF2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2)VF2=vpa(F2)Warning:Explicitintegralcouldnotbefound.F2=(14912*2^(1/4))/4641-(6072064*2^(1/2))/348075+(64*2^(3/4))/225+1610027357/6563700VF2=224.92153573331143159790710032805四、数值积分1、数值积分基本原理求解定积分的数值方法多种多样,如简单的梯形法、辛普生(Simpson)法、牛顿-柯特斯(Newton-Cotes)法等都是经常采用的方法。它们的基本思想都是将整个积分区间[a,b]分成n个子区间[xi,xi+1],i=1,2,…,n,其中x1=a,xn+1=b。这样求定积分问题就分解为求和问题。2、数值积分的实现方法基于变步长辛普生法,MATLAB给出了quad函数来求定积分。该函数的调用格式为:[I,n]=quad('fname',a,b,tol,trace)其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0.001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。例:求,其精确值为。(1)符号解析法symsx;IS=int('exp(-x*x)','x',0,1)vpa(IS)IS=(pi^(1/2)*erf(1))/2ans=0.74682413281242702539946743613185(2)数值法fun=inline('exp(-x.*x)','x')Isim=quad(fun,0,1),IL=quadl(fun,0,1)fun=Inlinefunction:fun(x)=exp(-x.*x)Isim=0.7468IL=0.7468第四节符号方程求解一、符号代数方程求解在MATLAB中,求解用符号表达式表示的代数方程可由函数solve实现,其调用格式为:solve(s):求解符号表达式s的代数方程,求解变量为默认变量;solve(s,v):求解符号表达式s的代数方程,求解变量为v;solve(s1,s2,…,sn,v1,v2,…,vn):求解符号表达式s1,s2,…,