syms a b c x
eq=’a*x^2+b*x+c=0’ %创建符号方程赋给变量eq
4.1.3 定义抽象函数和符号数学函数
如果要创建抽象函数f(x),可以使用: f=sym(‘f(x)’)
则f就象f(x)一样参与运算。
在Symbolic Math Toolbox中可利用符号表达式创建符号数学函数。 例如,下面的命令将产生符号表达式r、t和f: syms x y z
r=sqrt(x^2+y^2+z^2) 或者r=sym(‘sqrt(x^2+y^2+z^2)’) t=atan(y/x)
f=sin(x*y)/(x*y)
4.2 符号算术运算
在数值计算中,加、减、乘、除等运算很简单直观。但在符号运算中,所有涉及符号的运算都要借助专用函数进行,下面这些符号运算指令,适用于符号矩阵和符号表达式。
4.2.1 定义符号矩阵
如下命令建立一个符号矩阵A: syms a b c;
A=[a b c;b c a;c a b] 结果为: A= [a,b,c] [b,c,a] [c,a,b]
另外,在MATLAB中,利用sym 函数可以直接建立符号矩阵。符号矩阵中的各符号元素的长度允许不相等,各符号元素间用逗号(,)隔开。矩阵行间的元素用分号(;)隔开。其格式为:
sym(‘a11,a12,?,a1n;?;an1,an2,?,ann’)这里,a11,a12,?,a1n;?;an1,an2,?,ann为矩阵元素,矩阵中的元素按行排列。
MATLAB中的数值矩阵不能直接参与符号运算。函数sym可以将矩阵A中数值元素转化为符号元素,使之可以参与符号运算。调用格式为:
sym(‘A’)
29
当调用Symbolic Math Toolbox时,默认地调用有理算术运算。当使用sym函数创建符号变量时,有理算术运算将被启动。
例如,对于双精度矩阵A,sym函数将转化为对应的符号矩阵形式。 A=[1.1000 1.2000 1.3000 2.1000 2.2000 2.3000 3.1000 3.2000 3.3000]; A=sym(A) A=
[11/10, 6/5, 13/10] [21/10, 11/5, 23/10] [31/10, 16/5, 33/10]
对于非数值的符号矩阵,通过sym函数,可用与普通矩阵定义类似的格式来定义。
例如,下面的例子将产生符号矩阵A、符号矩阵B和符号矩阵C。 syms a b c d x A=('[a b;c d]') A=
[a b;c d]
B=sym(‘[2*a+b,3*b;5*c+d,2*d]’)
B=
[2*a+b, 3*b] [5*c+d, 2*d]
C=sym(’[1/(1+a),sin(x),(b-x)/(a+x);1,exp(x),x^2]’) C=
[1/(1+a), sin(x),(b-x)/(a+x)] [ 1, exp(x), x^2]
4.2.2 符号矩阵的加、减运算
实现符号矩阵的加(add)、减(subtract)的指令是: symadd(A,B) %给出两个符号矩阵的和A+B symsub(A,B) %给出两个符号矩阵的差A-B 参与符号加、减运算的矩阵应具有相同的维数。
例如,对于上面定义的符号矩阵A和B,利用symadd和symsub的结果是: symadd(A,B) ans=
[3*a+b, 4*b] [6*c+d, 3*d] symsub(A,B) ans=
30
[-a-b, -2*b] [-4*c-d, -d]
对于具有数值的符号矩阵加减法,使用同样计算方法。
4.2.3 符号矩阵的乘、除运算
实现符号矩阵乘、除的指令是:
symmul(A,B) %给出两个符号矩阵的乘积A*B; symdiv(A,B) %给出两个符号矩阵的商A/B;
4.2.4 符号变量替换
若需要将一个符号解或者一个符号表达式中的一些符号变量替换成数字或其他符号,在MATLAB的符号运算中可利用subs函数实现。
subs函数适用于单个符号矩阵、符号表达式、符号代数方程和微分方程。subs函数的用法如下:
? subs(S,NEW) 用新变量NEW替换S中的默认变量。
? subs(S,NEW,OLD) 用新变量NEW替换S中的指定变量OLD。 例如,对于下面的符号矩阵G, 用’pi/3’替换G中的默认变量x。 G=sym(‘[a*sin(b+x),a+b,exp(a*x),sqrt(x)]’); G1=subs(G,’pi/3’) G1=
[a*sin(b+pi/3), a+b, exp(a*pi/3), sqrt(pi/3)]
例如,对于下面的符号表达式f, 用2替换f中默认变量a。 f=sym(‘sin(1/3*a*pi)’); subs(f,’2’,’a’) 结果为: ans=
sin(1/3*2*pi)
如果用数值替换符号表达式中的变量,将得到相应变量由数值替代的表达式或数值。
f=sym(‘sin(1/3*a*pi)’); subs(f,2,’a’) 结果为: ans=
0.8660
4.2.5 简化
1. simple函数
simple函数的目的是寻求表达式的最简形式,使之包含最少数目的字符。函数的
31
用法为:
(1)simple(S):对符号表达S应用不同的简化方法,显示简化的中间过程,包括每种简化方法和相应的简化结果,最后,simple函数从中选择一个最短的结果作为返回值。如果S是矩阵,则返回结果是整个矩阵的最短表示形式,但不一定是每个单独元素的最短表示。
(2) [r,how]=simple(S):不显示简化的中间过程,返回最短的结果给参数r。同时返回最短的形式所用简化方法给参数how 。
2. simplify函数
simplify函数是一个强有力的、具有普遍意义的工具。它应用于包含和式、方根、分数的乘方,指数函数,对数函数,三角函数,Bessel函数,超越函数等的表达式,对表达式进行化简。
例:simplify 函数用法 syms x y
f=x*(x*(x-6)+11)-6; simplify(f) ans=
x^3-6*x^2+11*x-6 f=(1-x^2)/(1-x); simplify(f) ans= x+1
f=cos(x)^2+sin(x)^2; simplify(f) ans= 1
4.3 符号微积分运算
4.3.1 确定符号变量
当进行数学运算时,对应变量的选取很容易得到。例如,对于函数f=xn,当我们对f求导数时,自然的是对x求导数,n看成参数。而在MATLAB中,如何知道是对x而不是对n求导呢?它是通过符号表达式中隐含的符号变量来确定的。 在Symbolic Math Toolboxs中,确定一个符号表达式中的符号变量的规则是: (1)只对(除i, j之外的)单个小写英文字母进行检索。 (2) 小写字母x是首选符号变量。
(3) 其余小写字母被选为符号变量的次序:在英文字母表中,靠近“x”的优先,在“x”之后的优先。
工具箱还提供了findsym函数来确定表达式中符号变量。例如,findsym(f,1)寻找
32
第一个符号变量。findsym函数中的的第二个参数,代表了在符号对象中想要寻找的符号变量的个数。如果默认,将给出符号表达式中的所有符号变量。
4.3.2 符号微分运算
符号数学工具箱的微分函数是diff,该函数有三种调用格式。 例:建立一个符号表达式f: syms a x f=sin(a*x); (1) diff(f)
对f进行微分运算,微分变量使用数学约定,在此为x, df=diff(f) df=
cos(a*x)*a (2) diff(f,a)
以a 为自变量进行微分,命令形式如下: dfa=diff(f,a) dfa=
cos(a*x)*x
(3) diff(f,n)或diff(f,a,n)
计算f对默认变量或指定变量的n阶导数。为了分别计算f对于x和a的二阶导数,使用如下命令:
diff(f,2) %等价于diff(f,x,2) ans=
-sin(a*x)*a^2 diff(f,a,2) ans=
-sin(a*x)*x^2
diff函数也可以使用符号矩阵作为它的输入,在这种情况下,微分运算按矩阵的元素逐个进行。考虑下面的例子:
syms a x
A=[cos(a*x),sin(a*x);-sin(a*x),cos(a*x)] A=
[ cos(a*x), sin(a*x)] [-sin(a*x), cos(a*x)] dy=diff(A) dy=
[-sin(a*x)*a, cos(a*x)*a] [-cos(a*x)*a, -sin(a*x)*a]
33