1MATLAB基础与应用北京化工大学信息科学与技术学院主讲教师:郭青guoqing@mail.buct.edu.cn第5章符号运算2主要内容•5.1符号变量和符号表达式•5.2符号函数的极限及微积分运算•5.3符号方程的求解3《数学分析》实验课Matlab符号工具箱简介Matlab系统本无符号运算功能,符号运算工具箱(SymbolicMathToolbox)则扩充了Matlab这方面的功能,它是由Maple软件的核心来完成的这个工具箱在Matlab安装的Toolbox/Symbolic子文件夹下5.1符号变量和符号表达式1.符号变量的创建【1.1】sym函数创建单个符号变量创建符号变量和表达式有两个基本指令:sym、syms。常用sym函数来创建单个符号变量,一般调用格式为a=sym('x')该指令用来创建一个符号变量x,x可为字符、字符串、表达式或字符表达式。此后,用户可以在表达式中使用变量x进行各种运算。5【例5-1】【例5-1】使用sym函数创建符号变量。a=sym('x')b=sym('matlab')c=sym('(1+sqrt(3))/2')y=sym('x^3+2*x^2+3*x+4')a=xb=matlabc=(1+sqrt(3))/2y=x^3+2*x^2+3*x+46【例5-2】把字符表达式转换为符号变量7y=sym('4*sin(x)*cos(x)')y=4*sin(x)*cos(x)y=simple(y)%简化y的形式y=2*sin(2*x)【例5-3】使用sym指令创建符号矩阵。A=sym('[a,2*b;3*c,4]')A=[a,2*b][3*c,4]由于函数sym一次只能定义一个符号变量,使用不太方便,MATLAB还提供了另一个函数syms,一次可以定义多个符号变量。8【1.2】syms函数定义多个符号变量MATLAB还提供了另一个函数syms,一次可以定义多个符号变量。syms函数的一般调用格式为syms(‘a’,‘b’,‘c’,…)或直接简写为symsabc…9【例5-4】使用syms函数定义符号变量。symsabcxf=sym('a*x^2+b*x+c')f=a*x^2+b*x+cg=f^2+4*f-2g=(a*x^2+b*x+c)^2+4*a*x^2+4*b*x+4*c-2注意:使用这种简写形式定义符号变量时,各个变量要用空格来进行分隔,而不能使用逗号或分号等。比如symsa,b,c,x为错误的格式。2.符号变量的基本操作①使用findsym指令确定符号变量常用格式有如下两种:findsym(e),确定表达式e中所有自由符号变量findsym(e,n),确定表达式e中离x最近的n个独立变量11【例5-6】用findsym指令确定独立自由符号变量。symsabxythetafindsym(a+b+theta)%确定表达式中的所有独立自由符号变量ans=a,b,thetafindsym(cos(theta)*b*x+2*y,2)%确定表达式中离x最近的2个(含x本身)独立自由变量ans=x,yfindsym(y*(1+2*i)+3*j)%表达式中出现事先没有定义的变量i、jans=y%所确定的独立自由变量只有已定义的y,没有i、j12②使用vpa指令确定任意精度的符号变量vpa指令的常用调用格式为a=vpa(x,n),表示在n位相对精度下,给出x的数值型符号结果a;如果省略n,则数值结果的默认精度为32位。13【例5-8】用vpa指令确定符号变量的精度。a=vpa(pi)a=3.1415926535897932384626433832795q=vpa(hilb(2))%以32位精度确定2阶Hilbert矩阵的符号变量q=[1.,.50000000000000000000000000000000][.50000000000000000000000000000000,.33333333333333333333333333333333]b=vpa(pi,64)%设置数值结果的精度为64位b=3.141592653589793238462643383279502884197169399375105820974944592c=vpa(hilb(2),10)c=[1.,.5000000000][.5000000000,.3333333333]14Hilbert矩阵的分量满足H(i,j)=1/(i+j-1)③使用sym指令进行数值变量与符号变量的转换【例5-9】数值变量与符号变量的转换。a=0.01sym(a)%默认为有理数形式ans=1/100sym(a,'r')%设置为有理数形式ans=1/100sym(a,'f')%设置为浮点数形式ans=(2^-7+1261007895663739*2^-59)sym(a,'e')%设置为指数形式ans=1/100+eps/1067sym(a,'d')%设置为数值精度形式ans=.10000000000000000208166817117217e-1153.符号表达式的基本操作①符号表达式的四则运算【例5-10】符号表达式的四则运算。symsabxytheta;y1=a+by2=sin(2*theta)-cos(x)+exp(-y)y1*y2%y1和y2相乘ans=(a+b)*(sin(2*theta)-cos(x)+exp(-y))y2/y1%y2除以y1ans=(sin(2*theta)-cos(x)+exp(-y))/(a+b)16②合并符号表达式的同类项合并符号表达式的同类项使用collect指令,其调用格式为collect(e,‘s’),其中的e表示所需合并的符号表达式,s为所需合并的项,省略情况下默认为x。【例5-11】合并符号表达式的同类项。symsxy;f1=sym('x^3-x*y^2+x*y+x');collect(f1)%默认合并x同幂项系数ans=x^3+(-y^2+y+1)*xf2=sym('y^3+x*y^2+x^3*y^2+y^2');collect(f2,'y^2')%合并y^2同幂项系数ans=y^3+(x+x^3+1)*y^217③符号多项式的分解MATLAB使用factor指令对符号多项式进行因式分解,其调用格式为factor(e)。还可以使用horner指令把多项式分解成嵌套形式,其调用格式为horner(e)。【例5-12】符号多项式的因式分解。symsxy;f1=x^4+6*x^3+3*x^2-26*x-24;factor(f1)ans=(x-2)*(x+4)*(x+3)*(x+1)f2=x^3+2*x^2*y-x*y^2-2*y^3;factor(f2)ans=(-y+x)*(2*y+x)*(y+x)factor(770)%利用factor指令把一个正整数进行质数分解ans=2571118④符号表达式的化简在MATLAB中,使用simplify及simple指令对符号表达式进行化简。simplify指令的调用格式为simplify(e),e为需化简的表达式,其功能是运用多种恒等式转换对表达式进行综合化简,但使用该指令有时并不能得到一个最简短的结果。simple指令的调用格式为simple(e)其功能是运用包括simplify函数在内的各种指令把表达式转换成最简短的形式。19【例5-14】运用simplify指令化简符号多项式。symsx;f1=(1/x+2/x^2+3/x+4)^(1/3)f1=(4/x+2/x^2+4)^(1/3)y1=simplify(f1)y1=2^(1/3)*((2*x+1+2*x^2)/x^2)^(1/3)y2=simplify(y1)y2=2^(1/3)*((2*x+1+2*x^2)/x^2)^(1/3)simplify(sin(x)^2+cos(x)^2)ans=120⑤符号表达式的替换求值在MATLAB中使用subs指令进行符号表达式的替换求值。【例5-16】使用subs指令进行符号表达式的替换求值。symsxy;f=x^2*y+3*x*sqrt(y)f=x^2*y+3*x*y^(1/2)subs(f,x,1)%求x=1时f的值ans=y+3*y^(1/2)subs(f,y,3)%求y=3时f的值ans=3*x^2+3*x*3^(1/2)21subs(f,[x,y],[1,3])结果如何⑥复合函数的运算函数的复合是指对于函数f(x)和x=g(y),构造函数f(g(y))。完成复合操作的指令是compose,其调用格式为compose(f,g)或compose(f,g,u,v,t),如果使用后者,则表示对f(u)和u=g(v)求复合函数f(g(v))|v=t。【例5-17】符号函数的复合。symsxyzuv;f=x/(1+x+x^2);g=exp(y);h=cos(u);k=x^v;compose(f,g)%构造复合函数f(g(y))ans=exp(y)/(1+exp(y)+exp(y)^2)22⑥复合函数的运算compose(f,g,u)%构造复合函数f(g(u))ans=exp(u)/(1+exp(u)+exp(u)^2)compose(k,h,x,z)ans=cos(z)^vcompose(k,h,v,z)ans=x^cos(z)compose(k,g,v,u,z)ans=x^exp(y)compose(k,g,x,y,z)ans=exp(z)^v23⑦符号函数的求反函数的求反是指对于函数f(x)求一个函数g(·),使得g(f(x))=x成立。完成求反操作的指令是finverse,其调用格式为finverse(f)或finverse(f,t),如果使用后者,则表示对指定自变量t的函数f(t)求其反函数g(t)。【例5-18】符号函数的求反。symsx;f1=2*x+3;finverse(f1)%求f1的反函数ans=-3/2+1/2*xf2=x^2;finverse(f2)Warning:finverse(x^2)isnotunique.%x2的反函数不是唯一的ans=x^(1/2)245.2符号函数的极限及微积分运算1.符号函数求极限•函数求极限是一种常用的数学运算。MATLAB中使用limit指令来求符号函数的极限值,调用格式为•limit(f,x,a)或limit(f,x,a,‘s’)。•limit(f,x,a)指令表示对符号函数f求其变量x趋于a时的极限值,对于只含独立变量x的函数f而言,x可省略;•但对于含多个变量的函数,x通常是不可省略的。•limit(f,x,a,‘s’)指令•当s赋值为right时,表示求函数f在a点的右极限;•s赋值为left时,表示求函数f在a点的左极限。25【例5-19】符号函数求极限。symsxabc;f1=sin(x)/(x^3+3*x);limit(f1,x,0)ans=1/3limit(f1,0)ans=1/3limit(1/x,x,0,'right')ans=Inf%函数的右极限为无穷大limit(1/x,x,0,'left')ans=-Inf%函数的左极限为负无穷大f2=a^2+a*b+b*c;findsym(f2,3)%确定自由符号变量26ans=c,b,a%3个变量的排序顺序limit(f2,a,1)%自定义a为自变量,求a趋于1时f2的极限值ans=1+b+b*climit(f2,c,1)%定义c为自变量,求c趋于1时f2的极限值ans=a^2+a*b+blimit(f2,1)%在没有定义自变量的情况下,默认排序离x最近的c为自变量ans=a^2+a*b+bf3=(1+2*a/x)^(3*x);limit(f3,x,inf)%求x趋于无穷大时f3的极限ans=exp(6*a)272.符号微分与Jacobian矩阵在高等数学中,求函数的导数、偏导数和多元向量函数的Jacobian矩阵是很重要的一部分内容。MATLAB中实现这两种运算的指令格式分别为diff(f,v,n)和jacobian(f