
MATLAB具有符号数学工具箱,可以对符号表达式进行运算和处理。基本运算包括复合、化简、微分、积分以及求解代数方程式、微分方程式等。另外,还可以求解线性代数问题,如求解符号矩阵的逆、行列式、正则行的精确结果,找出符号矩阵的特征值而没有由数值计算引入的误差。工具箱还支持可变精度运算,由于符号运算不产生数值运算产生的运算误差,可以在运算最后将数字代入结果,因此避免了中间运算的误差,能够以指定的精度返回结果。
符号数学工具箱的功能建立在Maple软件的基础上。该软件最初是由加拿大的滑铁卢 (Waterloo) 大学开发的。当用户要求 MATLAB 进行符号运算时,它就转入Maple去计算并将结果返回到MATLAB命令窗口。因此,MATLAB中的符号运算是MATLAB处理数字功能的自然扩展。
1 符号表达式
符号表达式是包括数字、代数或有理运算和符号变量的 MATLAB 字符串。它不要求变量有预先确定的值。符号方程式是含有等号的符号表达式。符号矩阵是数组,其元素是符号表达式。符号运算是使用已知的数学规则和给定的符号恒等式求解这些符号方程,它与代数和微积分所学到的求解方法完全一样。
(1)创建符号表达式
MATLAB用sym(‘ ’) 命令建立符号表达式。符号表达式表示成字符串,用单引号‘ ’括起来,以与数字变量或运算相区别。否则,这些符号表达式几乎完全像 MATLAB 命令。表B-1列有几则符号表达式和MATLAB等效表达式的例子。
表B-1 符号表达式与等效的 MATLAB 表达式
| 符号表达式 MATLAB 符号表达式 |
| ‘1/(2*x^n)’ ‘1/sqrt(2*x)’ ‘cos(x^2)-sin(2*x)’ m=sym(‘[a,b;c,d]’) f=int(‘x^3/sqrt(1-x)’,’a’,’b’) |
y=sym('cos(x)')
y =
cos(x)
对符号表达式进行运算
c1=diff(y) % 求微分
c1 =
-sin(x)
(2)符号常量
不含变量的符号表达式叫做符号常量。例如
f=sym('2*4-6') % 定义符号表达式,不含符号变量
f =
2*4-6
求f的数值(进行数值运算):
f1=numeric(f)
f1 =
2
进行符号运算:
f2=f+1
f2 =
3
(3)符号变量
当字符表达式中含有多于一个的变量时,只有一个变量是变量,其余的文字符号作为常量处理。如果用户不指定哪一个变量是变量, MATLAB 将基于以下规则选择一个变量:
除去i和j的小写字母,表达式中如果没有其他字母,选择 x 作为变量;
如果有多个字符变量,选择在字母顺序中最接近 x 的字符变量;
如果有相连的字母,选择在字母表中较后的那一个。
例如,键入:
diff('sin(x)+1') % 只含有一个字符变量,该字符就是变量
ans =
cos(x)
键入:
diff('sin(a)+b') % 含有两个字符变量,字母表中靠后的是变量
ans =
1
键入:
diff('3*y+z') % 含有两个字符变量,接近x的是变量
ans =
3
2 符号表达式运算
一旦建立了一个符号表达式,符号运算功能可以完成如提取表达式的一部分、合并两个表达式、求表达式的数值以及表达式的加、减、乘、除等运算。
(1)提取分子和分母
如果表达式是一个有理分式(两个多项式之比),或是可以展开为有理分式(包括那些分母为 1 的分式)可利用 numden命令来提取分子或分母,必要时还可以进行表达式合并。例如,
m=sym('x^2') % 定义有理分式m
m =
x^2
(2)代数运算
很多标准的代数运算可以在符号表达式上执行,命令symadd,symsub,symmul 和 symdiv 可以加、减、乘、除两个表达式,sympow 将一个表达式表示为另一个表达式的幂次。例如,
f='2*x-5' % 定义符号表达式f
f =
2*x-5
g='x^2-x+7' % 定义符号表达式g
g =
x^2-x+7
symadd(f,g) % 求f+g
ans =
x+2+x^2
(3)高级运算
符号表达式的高级运算包括表达式的复合、求逆函数、求前n-1项和等。其中,
命令compose把f(x)和g(x)复合成f((g(x))。
例如,
f=sym('cos(x)')
f =
cos(x)
命令finverse 求表达式的逆函数。
表达式f(x)的逆函数g(x)满足g(f(x))=x。命令finverse给出表达式的逆函数,如果解不唯一,就给出警告。例如,
p=sym('e^x')
p =
e^x
键入:finverse(p)
ans =
log(x)/log(e)
结果相当于ln(x),因为ln(e^x)=x。
命令symsum 求表达式的前n-1项和。有下面四种形式:
f=sym('x^2')
f =
x^2
键入:symsum(f) % 求前x-1项和
ans =
1/3*x^3-1/2*x^2+1/6*x
(4)函数变换
MATLAB的符号运算功能,可以将符号表达式变换成数值或反之。有些符号函数可返回数值。
命令sym可将MATLAB的一般(数值)表达式转换为符号表达式,前面已经作过介绍。函数numeric的功能正好相反,它把一个符号常数(无变量符号表达式)变换为一个数值。例如,
numeric('1+2^2')
ans =
5
3 微分和积分
微分和积分是微积分学研究和应用的核心,并广泛地用在许多工程学科。MATLAB符号运算功能可以解决许多这类问题。
(1)微分
符号表达式的微分利用命令diff完成,有下面四种形式:
p='a*x^2+b*x' % 定义符号表达式p
p =
a*x^2+b*x
键入:diff(p) % 对缺省变量x求微分
ans =
2*a*x+b
(2)积分
符号运算的积分命令为int(f),其中f是一个符号表达式。积分的目的是求出另一个符号表达式P,使其微分满足diff(P)=f。积分命令有多种表达形式,例如:
f='cos(2*x)+s^2' % 建立符号表达式f
f =
cos(2*x)+s^2
键入:int(f) % 对x求积分
ans =
1/2*sin(2*x)+s^2*x
4 符号表达式画图
MATLAB 提供了命令ezplot,将符号表达式可视化。对于一个自变量的函数,可视化实际上是求解自变量各点上的函数值并绘图的过程。例如,
y='2*x^2-3*x+10'
y =
2*x^2-3*x+10
键入不同命令:
ezplot(y) % 程序自动选择自变量范围绘图
ezplot(y,[-10 10]) % 确定自变量范围绘图
绘图结果如图B-1,图B-2所示,表明了同一个函数不同的自变量范围的图形。
图B-1 符号表达式画图,自动选择小x范围 图B-2 符号表达式画图,给定范围
5 符号表达式的简化
对于一些冗长繁复、难以理解的符号表达式,MATLAB提供了许多方法可以将其进行简化、约分、合并同类项等处理,使表达式变得更简洁易懂。包括:
pretty命令,该命令以类似于数学课本上的形式(如有理分式)来显示符号表达式。
collect命令可以合并同类项,给出降幂排列形式
horner命令可将降幂排列的多项式变成嵌套形式
factor命令将表达式分解因式
expand命令展开表达式,给出降幂排列形式
simplify命令将表达式进行简化
Simplify是一个功能强大、通用的工具。它利用各种类型的代数恒等式,包括求和、积分和分数幂、三角、指数和 log 函数等来简化表达式。
simple命令可在简化基础上进一步给出多种简化形式
符号表达式的简化是很有用的工具,但由于简化方式不同,有时会产生不同的答案。在符号工具箱内的simple命令可以试用几种方式进行简化,然后选择最简形式。
6 可变精度算术运算
计算机内的数值计算精度受到每次计算结果所保留的位数(字长、字节数)的,例如如果保留位数是16位,则第17位以后的数据将被舍去,所以任何数值运算都会引入舍入误差,重复多次的数值运算还会造成累计误差。而MATLAB的符号运算是对符号表达式的运算,结果是非常准确的,因为它们不需要进行数值运算,所以无舍入误差。对符号运算结果用函数 eval 或 numeric求其数值,所以仅在结果转换时会引入一次性的舍入误差。原理上,符号运算可以实现任何数位的运算,但当保留位数增加时,每次计算就需要附加时间和计算机内存。
Maple的缺省位数为16位精度,命令digits 给出保留位数的当前值。命令digits(n)可以改变缺省位数,其中 n 是所期望精度的数位。用这种方法增加精度的副作用是,每个随后进行的Maple函数的计算都以新的精度为准,增加了计算时间。计算结果的显示不会改变,只有所用的Maple函数的缺省精度受到影响。
另外一个函数vpa可以用缺省的精度或任何指定的精度实行单个符号表达式的计算,以同样的精度来显示结果,而使全局的digits参数不变。
7 符号方程求解
用MATLAB所具有的符号工具箱可以求解符号方程。
(1)解单个代数方程
MATLAB用solve命令求解符号方程。如果表达式不是一个方程式(不含等号),则在求解之前自动将表达式置成等于0。它可以求解f(x)=0或y(x)=f(x)两种形式的代数方程。
如果键入命令:
solve('a*x^2+b*x+c') % 求二次方程的根
ans =
[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]
[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]
(2)代数方程组求解
solve命令还可以同时求解若干代数方程,语句形式为:
solve(sl,s2,…,sn)对缺省变量求解 n 个方程;
solve(s1,s2,……,sn,′v1,v2 … vn′)对n个未知数v1,v2 … vn求解 n 个方程。
(3)解单个微分方程
用MATLAB符号工具箱的dsovle命令可以求解微分方程。由于用符号运算解微分方程可以得到解析解,比起一般的数值解,更具有理论研究意义。
在微分方程的表达式中,包含微分符号。Dsovle命令中用大写字母D 来表示求微分,D2、D3 等等表示二次、三次重复求微分。
(4)解微分方程组
命令dsolve也可同时处理若干个微分方程式。
8 线性代数和矩阵
MATLAB用线性代数求解符号矩阵问题。
(1)建立符号矩阵
符号矩阵和向量是数组,其元素为符号表达式,用sym命令产生。建立的符号矩阵,用行向量表示。例如,
s=sym('[cos(x),a-b;cd,2+x]')
s =
[ cos(x), a-b]
[ cd, 2+x]
(2)矩阵代数运算
用symadd,symsub,symmul和symdiv命令,可以进行符号矩阵的加法、减法、乘法、除法等代数运算,用sympow可计算乘幂,用transpose可以给出符号矩阵的转置。
(3)线性代数运算
在MATLAB 5以上的版本中,符号矩阵运算的命令形式与数值矩阵运算命令相同,即同一个命令既可以用于数值矩阵,也可以用于符号矩阵。但得出的解的形式不同,对于数值矩阵,得出数值解;而对于符号矩阵,得出符号表达式。例如,
inv(a) 求矩阵的逆矩阵。
det(a)可计算符号矩阵a的行列式。
poly 求解矩阵的特征多项式。
[v,e]=eig(a)可以求得符号矩阵的特征根和特征向量,但要求矩阵元素是有理数。
[v,j]=jordan(A)可以得到矩阵的约当(Jordan) 标准型。得到的v是A的特征向量矩阵,j是特征值的对角矩阵。
jacobian(f,x)可求解函数f(x)对x的雅可比(Jacobia)矩阵。其结果的第(i,j) 项是df(i)/dx(j)。缺省自变量是t。当f是标量时,f的雅可比值是f的梯度。
下面的几个表综合给出了符号工具箱的命令和应用。
表B-2 符号表达式的运算
| 命 令 说 明 |
| Numeric 符号到数值的转换 Pretty 显示悦目的符号输出 Subs 替代子表达式 sym 建立符号矩阵或表达式 symadd 符号加法 symdiv 符号除法 symmul 符号乘法 symop 符号运算 sympow 符号表达式的幂运算 symrat 有理近似 symsub 符号减法 |
| 命 令 说 明 |
| colleet 合并同类项 xepand 展开 factor 因式 simple 求解最简形式 simplify 简化 symsum 和级数 |
| 命 令 说 明 |
| charpoly 特征多项式 horner 嵌套多项式表示 numden 分子或分母的提取 poly2sym 多项式向量到符号的转换 sym2poly 符号到多项式向量的转换 |
| 命 令 说 明 |
| diff 微分 int 积分 jordan 约当标准型 taylor 泰勒级数展开 |
| 命 令 说 明 |
| digits 设置可变精度 vpa 可变精度计算 |
| 命 令 说 明 |
| compose 函数的复合 dsolve 微分方程的求解 finverse 逆函数 linsolve 齐次线性方程组的求解 solve 代数方程的求解 |
| 命 令 说 明 |
| ploy 特征多项式 det 矩阵行列式的值 eig 特征值和特征向量 inv 逆矩阵 jordan 约当标准型 linsolve 齐次线性方程组的解 transose 矩阵的转置 |
