1、MATLAB 6.1实用指南(上册) 苏金明等编著第 3 章 符号运算MATLAB 的强大之处不仅在于其强大的数值运算功能,而且也在于其强大的符号运算功能。MATLAB 的符号运算是通过集成在 MATLAB 中的符号数学工具箱(Symbolic MathToolbox)来实现的。MATLAB 的符号数学工具箱用途广泛,它可用于数学、物理、力学等各种学科的科研、工程应用中。而且,它使用字符串来进行符号分析与运算,而不是基于矩阵的数值分析与运算。实际上,MATLAB 中的符号数学工具箱是建立在功能强大的由加拿大滑铁卢大学开发的 Maple 软件的基础上。当进行 MATLAB符号运算时,它就请求 M
2、aple 软件去计算并将结果返回给 MATLAB。MATLAB 的符号数学工具箱可完成几乎所有的符号运算功能。这些功能主要包括:符号表达式的运算,符号表达式的复合、化简,符号矩阵的运算,符号微积分、符号函数画图,符号代数方程求解,符号微分方程求解等。此外,工具箱还支持可变精度运算,即支持符号运算并以指定的精度返回结果。31 符号表达式的生成在 MATLAB 符号工具箱中,符号表达式是代表数字、函数和变量的 MATLAB 字符串或字符串数组,它不要求变量要有预先确定的值。符号表达式包括符号函数与符号方程。其中,符号函数没有等号,而符号方程必须要带有等号。MATLAB 在内部把符号表达式表示成字符
3、串,以与数字相区别。符号表达式的创建可通过以下几种方法:1用单引号来生成符号表达式在 MATLAB 中,所有的字符串都用单引号来设定输入或输出。为此符号表达式也可用中引号来生成。例如,例 1 f=exp(x)f=exp(x)例 2 f=a*x2+b*x+c=0f=a*x2+b*x+c=0例 3 f=D2y-2*Dy-3*y=0f=D2y-2*Dy-3*y=0其中,上面的第一个例子生成一般的符号函数,第二个例子生成符号代数方程,第三个例子生成符号微分方程.(具有整体认读功能)2用函数 sym 来生成符号表达式在 MATLAB 可以自己确定变量类型的情况下,可以不用 sym 函数来显式的生成符号表
4、达式。但在某些情况下,特别是在建立符号数组时,必须要用 sym 函数来将字符串(char array)转换成符号表达式(sym object)。例 4 A=sym(a b c;e f g)A=a, b, ce, f, g例 5 f=sym(a*x+b=0)f=a*x+b=03用函数 syms 来生成符号表达式用 syms 函数只能用来生成符号函数,而不能用来生成符号方程。例 6syms y u; p=exp(-y/u)p=exp(-y/u)在符号表达式中,哪些变量是符号变量,可用函数 symvar 来获知。有意义的是,symvar函数会自动把i, j , pi, inf, nan ,eps等特
5、殊字母不当成符号变量。例 7 symvar(sin(omega)ans=omega例 8 symvar(a*x+y)ans=axy当利用符号函数进行运算时,若没有指定独立变量,则 MATLAB 会把 x 当成独立变量。例 9diff(sym( xn) )ans xn*nx % n x n-1上例表示,以 x 作为默认的独立变量,对 x 求导。例 10diff(xn, n )ans xn*log(x)上例表示,以 n 作为默认的独立变量,对 n 求导。(显式说明)32 符号表达式的运算在 MATLAB 符号工具箱中,符号表达式的运算主要是通过符号函数对其进行运算的。所有的符号函数作用到符号表达式
6、和符号数组,返回的仍是符号表达式或符号数组(即字符串)。可以运用 MATLAB 中的函数 isstr 来判断返回的表达式是数字还是字符串。如果是字符串,isstr 函数返回 1;否则,返回 0。符号表达式的运算主要包括以下几种:321 提取分子、分母如果符号表达式是有理分式形式或可展开为有理分式的形式,则可通过函数 numden 来提取符号表达式中的分子与分母(Numerator and denominator)。numden 函数可将符号表达式 合并 、有理化 ,并返回所得的分子与分母。numden 函数的调用格式如下:n,d=numden(a) 提取符号表达式 a 的分子与分母,并分别把其
7、存放在 n 与 d 中;n=numden(a) 提取符号表达式 a 的分子与分母,但只把把分子存放在 n 中。例 11 f=sym(a*x2/(b-x)n,d=numden(f)n - a*x2d -b+x例 12 f=sym(a*x2/(b-x) )n=numden(f)n -a*x2322 符号表达式的基本代数运算符号表达式的加、减、乘、除四则运算及幂运算等基本的代数运算,与矩阵的数值运算几乎完全一样。其中,符号表达式的加、减、乘、除运算可分别由函数 symadd、symsub、symmul、symdiv(注:新版本已经不用这些函数了)来实现,也可与矩阵的数值运算一样,用“+”、“-”、“
8、*”、“”符号进行运算,而符号表达式的幂运算可以由函数 sympow 来实现,也刘以由幂运算符“”来实现。例 13 f=sym(4*x+5);g=sym(2*x2+5*x+6);f+gans=9*x+11+2*x2例 14B=sym(x+1);C=sym(x2-1); D=B+CDx+x2例 15 f=sym(4*x+5+6*y);g=sym(2*x2+5*x+6);f-g例 16f*g例 17f/g 例 18fg例 19BC323 符号表达式的高级运算符号表达式的高级运算主要是指符号表达式的复合函数运算、反函数运算以及求表达式的符号和,下面分别来介绍。1符号表达式的复合函数运算在 MATLA
9、B 中,符号表达式的复合函数运算主要是通过函数 compose 来实现的。compose 函数的调用格式如下:compose(f,g) 返回复合函数 f(g(y))。在这里 f=f(x),g=g(y)。其中 x 是 findsym定义的 f 函数的符号变量,y 是 findsym 定义的 g 函数的符号变量。compose(f,g,z) 返回自变量为 z 的复合函数加 f(g(z))。在这里 f=f(x),g=g(y),x、y 分别是 findsym 定义的 f 函数和 g 函数的符号变量。compose(f,g,x,z) 返回复合函数 f(g(z)),并且使 x 成为 f 函数的独立变量。即
10、,如果 fcos(xt),则 compose(f,g,x,z)返回 cos(g(z)t),而 compose(f,g,t,z)返回 cos(xg(z))compose(f,g,x,y,z) 返回复合函数加 f(g(z)),并且使佼 x 与 y 分别成为 f 与 g 函数的独立变量。即,如果 fcos(x/t),gsin(y/u),compose(f,g,x,y,z)返回 cos(sin(z/u)/t),而 compose(f,g,x,u,z)返回 cos(sin(y/z)/t)。例 20syms x y; f=1/x3;g=tan(y);compose(f,g)1tan(y)3例 21syms
11、 x y t; f=1/x3;g=tan(y);compose(f,g,t)1tan(t)3例 22syms x y t z;g=tan(y);h=xt;compose(h,g,x,z)tan(z)t例 23syms x y t z;g=tan(y);h=xt;compose(h,g,x,y,z)tan(z)t2符号表达式的反函数运算在 MATLAB 中,符号表达式的反函数运算主要是通过函数 finverse 来实现的。函数的调用格式如下:gfinverse(f) 返回符号函数 f 的反函数。其中 f 是 一个符号函数表达式,其中变量为 x。求得的反函数是一个满足 g(f(x)x 的符号函数。
12、g=finverse (f,v) 返回自变量为 v 的符号函数 f 的反函数。求得的反函数 g 是一个满足g(f(v)v 的符号函数。当 f 包含不止一个符号变量时,往往使用这种求反函数的调用格式。需要注意的是,当函数 finverse 求得的解不惟一时,MATLAB 会给出警告信息。例 24f=sym(1/sin(x);finverse(f)asin(1/x)例 25 f=sym(x2-1);finverse(f)(-1+x )(1/2)上例就是因为求得的解不惟一而给出的警告。3求表达式的符号和在 MATLAB 中,求表达式的符号和主要是通过函数 symsum 来实现的, symsum 函数
13、的调用格式如下:symsum(S) 返回的 结果10)(xssymsum(S,v) 返回 的结果10)(xvssymsum(S,a,b) 返回 的结果baxs)(symsum(S,v,a,b) 返回 的结果bavs)(例 26k=sym(k);symsum(k)1/2*k2-1/2*k % 0+1+2+(k-1)例 27 k=sym(k); n=sym(n);symsum(k,0,n-1)1/2*n2-1/2*n % 0+1+2+(n-1)例 28 k=sym(k);symsum(1/k2,1,inf)1/6*pi233 符号与数值间的转换及符号的可变精度运算在 MATLAB 中,有许多的函数
14、可实现将符号表达式转换成数值表达式或将数值表达式转换成符号表达式。其中,将符号表达式转换成数值表达式可以通过函数 eval 来实现;而将数值表达式转换成符号表达式可以通过函数 sym 来实现。另外,函数 sym2poly实现将符号多项式转换成它的 MATLAB 等价系数向量;而函数 poly2sym 的功能正好相反,实现将 MATLAB 等价系数向量转换成符号多项式。 MATLAB 的符号数学工具箱还支持可变精度运算,即支持符号运算并以指定的精度返回结果,这可通过函数 digits 或 vpa 来实现,这两个函数往往与变量替换函数 subs 配合使用。 331 将符号表达式转换成数值表达式将符
15、号表达式转换成数值在达式主要是通过函数 numeric 或 eval 来实现。例 29p=1+sqrt(2)/2p= 1 十 sqrt(2)2例 31eval(p)ans 1707l另外,函数 sym2poly 实现将符号多项式转换成它的 MATLAB 等价系数向量。例 32sym2poly(3*x4+4*x3+2*x2+x+1)3 4 2 1 1 %x=roots(ans) 求方程全部根332 将数值转换成符号表达式将数值表达式转换成符号表达式主要通过函数 sym 来实现。例 33p=1.7071;n=sym(p)n 1707l10000另外,函数 poly2sym 实现将 MATLAB 等
16、价系数向量转换成它的符号多项式;例 34 a=1 2 3 4 5 1;poly2sym(a)ans =x5+2*x4+3*x3+4*x2+5*x+1333 可变精度运算因为数值的精度受每次操作所保留的位数限制,所以数值的任何运算都会引入误差。而符号表达式的运算由于不涉及到数值运算,因此它的运算结果是很精确的。MATLAB 对数值的运算完全依靠计算机的浮点运算,一般地,MATLAB 数值运算的相对精度大约是 16位。而 MATLAB 的符号数学工具箱可实现任何位数的运算。符号数学工具箱的默认位数为16 位,其默认位数可以由函数 digits 与 vpa 来调整。其中,digits 函数的调用会对
17、所有的符号表达式都有影响,而 vpa 函数的调用只对单个的符号表达式有影响。例 35digits %查看现在系统中的算术运算精度digits 25例 36vpa(pi)例 37digits(15)vpa(pi)例 38 vpa(pi,50)另外,函数 subs 可对符号表达式中的变量进行替换,其调用格式如下:subs(f,new,o1d) f 为符号表达式,new 与 old 是字符、字符串或其他的符号表达式,new 字符串将替换符号表达式 f 中的 old 字符串。例 39f=a*x2+b*x+c;subs(f, (x+1) , x)34 符号表达式的化简当通过 MATLAB 的符号函数运算
18、生成的符号表达式难于看懂时,可以通过 MATLAB 的符号数学工具箱中提供的函数,来对符号表达式进行化简,把它化成易于看懂的形式。这方面的函数主要有:pretty、collect、horner、factor、expand、simple、simplify。下面对上述函数分别作一介绍。pretty函数 pretty 与高等数学课本上显示符号表达式的形式相类似。例 40syms x;f=taylor(exp(-x) %显示指数函数的 Taylor 多项式f =1-x+1/2*x2-1/6*x3+1/24*x4-1/120*x5pretty(f)collectcollect 函数用于合并符号表达式的同类项。例 41syms x;f=sym(x-1)2*(x-3)*(x-5)*(x-7)collect(f)hornerhorner 函数用于将一般的符号表达式转换成嵌套形式的符号表达式例 42syms x;f=sym(x5-17*x4+102*x3-262*x2+281*x-105);horner(f)-105+(281+(-262+(102+(-17+x)*x)*x)*x)*xfactorfactor 函数用于对符号表达式进行因式分解。例 43 syms x;f=sym(x12-1);factor(f)expandexpand 函数用于对符号表达式进行展开