本节书摘来自异步社区出版社《MATLAB图像处理超级学习手册》一书中的第2章,第2.7节,作者:MATLAB技术联盟 , 张岩 更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.7 符号运算
MATLAB图像处理超级学习手册
在MATLAB中,符号数学工具箱(Symbolic Math Toolbox)用于实现符号运算。和别的工具箱有所不同,该工具箱不是基于矩阵的数值分析,而是使用字符串来进行符号分析与运算的。
2.7.1 创建符号变量
参与符号运算的整个过程的是符号变量,即使在符号运算中所出现的数字也按符号变量处理。MATLAB中,sym和syms函数用于建立符号变量。
使用前应先对其予以声明,然后再使用符号变量。sym函数调用方法如下:
sym ('变量名')
例如: sym(' y ')。
syms函数调用方法如下:
syms 变量名列表(每个变量名需用空格分隔,而不能用逗号分隔)
例如:syms x a。
经上述定义后,x,y,a已成为符号变量。
MATLAB中的符号表达式和符号方程是两种不同的操作对象。它们的区别在于:符号表达式不包含等号“=”,而符号方程必须带等号。例如: A=' sin(x)^2 ' 表示符号表达式;Bq=' ax^2+bx+c=0 '表示符号方程。
2.7.2 数值与符号的转换
在MATLAB中,可利用Sym函数将数值结果转换为符号表达式。调用方法如下。
Sym(r,' f '):表示返回符号浮点表示式。
Sym(r,' r '):表示返回符号有理数表示式。
Sym(r,' e '):表示返回符号有理数表示式。
Sym(r,' d '):表示返回符号十进制小数。
**
2.7.3 数值矩阵转换为符号矩阵**
在MATLAB中,必须事先定义符号矩阵,然后才能对矩阵进行符号运算。将数值矩阵转换成符号矩阵的调用格式为:
Sym(矩阵名)
【例2-20】将数值矩阵A转成了符号矩阵。
>> A=hilb(3)
A =
1.0000 0.5000 0.3333
0.5000 0.3333 0.2500
0.3333 0.2500 0.2000
>> A=sym(A)
A =
[ 1 , 1/2, 1/3]
[ 1/2, 1/3, 1/4]
[ 1/3, 1/4, 1/5]
2.7.4 符号替换
在MATLAB中,subs函数用于符号变量的替换,该命令适用单个符号矩阵、符号表达式、符号代数方程和微分方程中的变量替换,该函数的调用方法如下。
subs(S, new):表示用新变量new替换S中的默认变量。
subs(S, new, old):表示用新变量new替换S中的指定变量old。
如果新变量是符号变量,则必须将新变量名以' new' 形式给出。
【例2-21】以符号变量'5'替换符号表达式f中的'A' 。
>> f=sym('sin(1/3*A*pi)');
>> subs(f, '5','A')
ans =
sin((pi*A)/3)
在ans中,2仍然是符号变量。
2.7.5 常用的符号运算
符号变量和数字变量之间可以转换,也可以用数字代替符号得到数值。符号运算的种类很多,出于篇幅的考虑,下面仅对常用的符号运算进行介绍,其他的使用方法大同小异。
1.diff函数
在MATLAB中,diff函数是用于求微分的符号函数。该函数的调用方法如下。
diff(f):表示对符号表达式f进行微分运算。
diff(f,a):表示f对指定变量a进行微分运算。
diff(f,a,n):表示计算f对默认变量或指定变量a 的n 阶导数,n 是正整数。
【例2-22】对符号进行微分运算。
>>syms x n %定义符号变量x和n
>>f=x^n; %定义符号表达式f
>>diff(f,x) %符号表达式f对x求导
>>diff(f,n) %注意,是f对符号变量n求导
>>df2=diff(f,x,2) %计算f对符号变量x的二阶导数
ans =
n*x^(n - 1)
ans =
x^n*log(x)
df2 =
n*x^(n - 2)*(n - 1)
2.int函数
在MATLAB中,int函数是用于求积分的符号函数。该函数的调用方法如下。
int(f):表示对于符号变量f 代表的符号表达式,求f 关于默认变量的不定积分。
int(f,v):表示计算f 关于变量v的不定积分。
int(f,a,b)或int(f,v,a,b):表示计算f 关于默认变量或指定变量v 从a 到b 的定积分。
【例2-23】对于函数s(x,y)=xe-xy,先求s 关于x 的不定积分,再求所得结果关于y 的不定积分。
>>syms x y
s='x*exp(-x*y)';
f=int(int(s),y)
运行结果如下:
f =1/y*exp(-x*y)
3.simplify与simple函数
在MATLAB中,simplify 函数用于包含和式、根式、分数、乘方、指数、对数、三角函数等的表达式的化简;simple 函数用于寻找最少字符的表达式。
4.solve函数
在MATLAB中,solve函数用于解代数方程组,该函数的调用方法如下:
solve(S1,S2)
其中,S1,S2是方程的符号表达式。
syms x y alpha
[x,y] = solve(x^2*y^2,x-y/2-alpha)
运行后将返回符号变量x、y的解,各4个。返回的解即使是数字量,也仍然是符号变量。
5.limit函数
在MATLAB中,limit是用于求极限的符号函数。该函数的调用方法如下。
limit (F,x,a) :表示取符号表达式F 在 x 趋于a 时的极限。
limit (F,a) :表示按前面说过的规定自动搜索F 中的符号变量,求其趋于a 时F 的极限。
limit (F) :表示指定了 a = 0 为极限点。
limit (F,x,a, ‘right’) 或 LIMIT(F,x,a, ‘left’) :表示规定了x 趋于a 的方向,也即用于取左极限或右极限。
6.dsolve函数
在MATLAB中,dsolve函数既可以解符号微分方程,也可以解普通微分方程。由于规定用符号“D”表示微分,“D2,D3,…,Dn”相应表示2阶,3阶,…,n阶微分。如不加声明,则默认符号变量为t。D2y代表frac{{d^2 y}}{{dt^2 }} ,Dy代表frac{{dy}}{{dt}}。在解微分方程时,D不用作符号变量。如果还有初始条件,则需作另外的方程说明。
【例2-24】利用dsolve函数解微分方程。
>> y = dsolve('Dy=1+y^2','y(0)=1') %符号变量y对默认变量t的一阶方程。
y =
tan(pi/4 + t)