这里写目录标题
- 一、符号计算基础
-
- 1. 建立符号对象
-
- 1.1 建立符号变量和符号常量
- 1.2 建立符号表达式
- 2. 基本的符号运算
-
- 2.1 符号表达式的四则运算
- 2.2 符号对象的关系运算
- 2.3 符号对象的逻辑运算
- 2.4 符号表达式的基本运算
- 3. 符号运算中变量的确定
- 4. 符号矩阵的运算
一、符号计算基础
- MATLAB 为用户提供了一种符号数据类型,相应的运算对象称为符号对象。例如,符号常量、符号变量、符号函数以及有它们参与的符号表达式等。在进行符号运算前首先要建立符号对象,然后才可以进行符号对象的运算。
1. 建立符号对象
1.1 建立符号变量和符号常量
- MATLAB 提供了建立符号对象的函数
sym
和命令 syms
,它们的用法并不相同。
- (1) sym 函数。
sym
函数用来建立单个符号对象,常用的调用格式如下:
符号对象名=sym(A)
- 该函数由 A 来建立符号对象,A 可以是一个数值常量、数值矩阵或数值表达式(不加单引号),这时sym 函数将数值对象转换为符号对象。
- A 也可以是一个变量名(加单引号),这时 sym 函数将创建一个符号变量。
- 应用 sym 函数可以定义符号常量,使用符号常量进行数学运算时和数值常量进行的运算不同。下面的程序用于比较符号常量与数值常量在数学运算时的差别。
>> t=sym(2); %定义符号常量t
>> t+1/2 %符号计算
ans =
5/2
>> sin(sym(pi/3)) %符号计算
ans =
3^(1/2)/2
>> sin(pi/3) %数值计算
ans =
0.8660
- 从命令执行情况可以看出,用符号常量进行计算更像在进行数学演算,所得到的结果是精确的数学表达式,而数值计算将结果近似为一个有限小数。
- 使用
sym
函数还可以建立符号变量,此后,用户可以在表达式中使用符号变量进行各种运算。符号变量和在其他过程中建立的非符号变量是不同的。
- 一个非符号变量在参与运算前必须赋值,变量的运算实际上是该变量所对应值的运算,其运算结果是一个和变量类型对应的值,而符号变量参与运算前无须赋值,其结果是一个由参与运算的变量名组成的表达式。下面的程序,说明了符号变量和数值变量的差别。
>> a=sym('a'); %定义符号变量a
>> b=sym('b'); %定义符号变量b
>> x=5; %定义数值变量x
>> y=-8; %定义数值变量y
>> w=(a+b)*(a-b) %符号运算
w =
(a + b)*(a - b)
>> w=(x+y)*(x-y) %数值运算
w =
-39
>> whos %查看内存变量
Name Size Bytes Class Attributes
a 1x1 8 sym
b 1x1 8 sym
w 1x1 8 double
x 1x1 8 double
y 1x1 8 double
- 从命令执行情况可以看出,定义了两个符号变量 a、b,两个数值变量 x、y,w 开始为符号变量,重新被赋值后,变为数值变量。
- (2) syms 函数。
- 函数
sym
一次只能定义一个符号变量,使用不方便。MATLAB 提供了命令 syms,一次可以定义多个符号变量。
syms
命令的一般调用格式如下:
syms 符号变量名1 符号变量名2 ... 符号变量名n
- 用这种格式定义符号变量时不要在变量名上加单引号,变量间用空格而不要用逗号分隔。
- 例如,我们用 syms 函数定义 3 个符号变量 a、b、pi,并进行计算,程序如下:
>> syms a b pi
>> sin(pi/3)+a*a+b*b
ans =
a^2 + b^2 + sin(pi/3)
1.2 建立符号表达式
- 通过 +、-、*、/、^ 等运算符将已经定义的符号对象连接起来就组成符号表达式。例如如下程序:
>> x=sym(2/3)
x =
2/3
>> y=x+1 %建立符号表达式
y =
5/3
>> a=sym('a');
>> b=sym('b');
>> f=a*a+b*b==100 %建立符号方程
f =
a^2 + b^2 == 100
>> syms x y;
>> V=3*x^2-5*y+2*x*y+6 %建立符号表达式
V =
3*x^2 + 2*y*x - 5*y + 6
>> w=[1,x,y;2,x*x,y*y] %建立符号矩阵
w =
[1, x, y]
[2, x^2, y^2]
2. 基本的符号运算
2.1 符号表达式的四则运算
- 符号表达式的四则运算与数值运算一样,用 +、-、*、/、^ 运算符实现,其运算结果依然是一个符号表达式。例如下面的程序。
>> syms x y z;
>> f=2*x^2+3*x-5;
>> g=x^2-x+7;
>> f+g
ans =
3*x^2 + 2*x + 2
>> f-g
ans =
x^2 + 4*x - 12
>> f=(x*x-y*y)/(x-y)
f =
(x^2 - y^2)/(x - y)
- 有时候,MATLAB 并未将结果化为最简形式。例如,上面最后一个符号表达式的结果不是 x+y,而是 (x^2 - y^2)/(x - y)。
2.2 符号对象的关系运算
- MATLAB 提供的 6 种关系运算符 < 、 ≤ 、 > 、 ≥ 、 = = 、 ≠ \lt、\le、\gt、\ge、== 、\ne <、≤、>、≥、==、= 和对应得函数 lt、le、gt、ge、eq、ne 也可用于符号对象。
- 若参与运算的是符号表达式,其结果是一个符号关系表达式;若参与运算的是符号矩阵,其结果是由符号关系表达式组成的矩阵。例如下面的程序。
>> syms x y a b c d;
>> A=[x,10*x;y,10*x];
>> B=[a,b;c,d];
>> A==b
ans =
[x == b, 10*x == b]
[y == b, 10*x == b]
- 在进行符号对象的运算前,可用
assume
函数对符号对象设置值域,该函数调用格式如下:
assume(condition)
assume(expr,set)
- 第一种格式指定变量满足条件 condition,第二种格式指定表达式 expr 属于数据集 set。例如下面的程序。
>> syms x
>> assume(x<0)
>> abs(x)==x
ans =
-x == x
>> assume(x,'positive')
>> abs(x)
ans =
x
- 其中,positive 是限定为正的符号变量类型。
- MATLAB 还提供了
isequaln
函数,用于判断两个或多个符号对象是否一致,函数的调用格式如下。
- (1)
isequaln(A,B)
:若 A 和 B 一致,则返回 1,否则返回 0。判断时,所有 NaN 都当成相同。
- (2)
isequaln(A1,A2,...,An)
:若 A1、A2、…、An 都一致,则返回 1,否则返回 0。
- 例如下面程序所示。
>> syms x
>> isequaln(abs(x),x)
ans =
logical
0
>> assume(x>0)
>> isequaln(abs(x),sqrt(x*x),x)
ans =
logical
1
2.3 符号对象的逻辑运算
- MATLAB 提供的 3 种逻辑运算符:&(与)、|(或)和 ~(非),以及 4 个逻辑运算函数:and(a,b)、or(a,b)、not(a) 和 xor(a,b),也可用于符号对象。例如下面程序所示。
>> syms x
>> y=x>0 & x<10 %或y=and(x>0,x<10)
y =
0 < x & x < 10
2.4 符号表达式的基本运算
- (1) 符号表达式的提取分子和分母运算。
- 如果符号表达式是一个有理分式或可以展开为有理分式,可利用
numden
函数来提取符号表达式中的分子或分母,其调用格式为:
[n,d]=numden(s)
- 该函数提取符号表达式 s 的分子和分母,分别将它们存放在 n 和 d 中。例如下面程序所示。
>> syms a b x
>> f=a*x^2/(b+x)
f =
(a*x^2)/(b + x)
>> [n,d]=numden(f)
n =
a*x^2
d =
b + x
numden
函数在提取各部分之前,将符号表达式有理化后,返回所得的分子和分母。例如下面程序所示。
>> syms x
>> g={x^2+3}/(2*x-1)+3*x/(x-1)
g =
(3*x)/(x - 1) + (x^2 + 3)/(2*x - 1)
>> [n,d]=numden(g)
n =
x^3 + 5*x^2 - 3
d =
(2*x - 1)*(x - 1)
- 如果符号表达式是一个符号矩阵,
numden
返回两个新矩阵 n 和 d,其中 n 是分子矩阵,d 是分母矩阵。例如下面程序所示。
>> syms a x y
>> h=[3/2,(2*x+1)/3;a/x+a/y,3*x+4]
h =
[ 3/2, (2*x)/3 + 1/3]
[a/x + a/y, 3*x + 4]
>> [n,d]=numden(h)
n =
[ 3, 2*x + 1]
[a*(x + y), 3*x + 4]
d =
[ 2, 3]
[x*y, 1]
- (2) 符号表达式的因式分解与展开。
- MATLAB 提供了符号表达式的因式分解与展开的函数,函数的调用格式如下。
- ①
factor(s)
:对符号表达式 s 分解因式。
- ②
expand(s)
:对符号表达式 s 进行展开。
- ③
collect(s)
:对符号表达式 s 合并同类项。
- ④
collect(s,v)
:对符号表达式 s 按变量 v 合并同类项。
- 例如下面程序所示。
>> syms a b x y;
>> A=a^3-b^3;
>> factor(A) %对A分解因式
ans =
[a - b, a^2 + a*b + b^2]
>> factor(sym(420)) %对符号整数分解素因式
ans =
[2, 2, 3, 5, 7]
>> s=(-7*x^2-8*y^2)*(-x^2+3*y^2);
>> expand(s) %对s展开
ans =
7*x^4 - 13*x^2*y^2 - 24*y^4
>> collect(s,x) %对s按变量x合并同类项(无同类项)
ans =
7*x^4 - 13*x^2*y^2 - 24*y^4
- (3) 符号表达式系数的提取。
- 如果符号表达式是一个多项式,可利用
coeffs
函数来提取符号表达式中的系数,函数的调用格式如下。
c=coeffs(s[,x])
- 该函数返回多项式中按指定变量升幂顺序排列的系数,若没有指定变量,则返回所有项的常系数,且按离字符 x 近原则确定主变量。例如下面程序所示。
>> syms x y
>> s=5*x*y^3+3*x^2*y^2+2*y+1;
>> coeffs(s) %求所有项的常系数,按x的升幂排列
ans =
[1, 2, 3, 5]
>> coeffs(s,y) %求变量y的系数
ans =
[1, 2, 3*x^2, 5*x]
- (4) 符号表达式的化简。
- MATLAB 提供
simplify(s)
函数对符号表达式 s 进行化简。例如下面程序所示。
>> syms x y a
>> s=log(2*x/y);
>> simplify(s)
ans =
log((2*x)/y)
>> s=(-a^2+1)/(1-a);
>> simplify(s)
ans =
a + 1
- (5) 符号表达式与数值表达式之间的转换。
- 利用函数
sym
可以将数值表达式变换成它的符号表达式。例如下面程序所示。
>> sym(1.5)
ans =
3/2
>> sym(3.14)
ans =
157/50
- 函数
eval
可以将符号表达式变换成数值表达式。例如下面程序所示。
>> x=sym('a');
>> a=20;
>> y=x+10
y =
a + 10
>> eval(y)
ans =
30
- (6) 符号多项式与多项式系数向量之间的转换。
- 利用函数
sym2poly
可以将符号多项式转换为多项式系数向量,而函数 poly2sum 可以将多项式系数向量转换为符号多项式。例如下面程序所示。
>> syms x
>> u=sym2poly(x^3-2*x-5)
u =
1 0 -2 -5
>> v=poly2sym(u)
v =
x^3 - 2*x - 5
- 调用
poly2sym
函数时,若未指定自变量,则采用系统默认自变量 x。
3. 符号运算中变量的确定
symvar
函数可以帮助用户查找一个符号表达式中的符号变量,其调用格式如下:
symvar[s[,n]]
- 该函数以向量形式返回符号表达式 s s s 中 n n n 个符号变量,若没有指定 n n n,则返回 s s s 中的全部符号变量。例如下面程序所示。
>> syms x a y z b; %定义5个符号变量
>> s1=3*x+y; %定义s1表达式
>> s2=a*y+b; %定义s2表达式
>> symvar(s1)
ans =
[x, y]
>> symvar(s2,1)
ans =
y
>> symvar(s1+s2)
ans =
[a, b, x, y]
- 在求函数的极限、导数和积分时,如果用户没有明确指定自变量,MATLAB 将按以下原则确定主变量并对其进行相应微积分运算。
- (1) 找寻除 i、j 之外,在字母顺序表上最接近 x 的小写字符。
- (2) 若表达式中有两个符号变量与 x 的距离相等,则 ASCII 大者优先。
- 可用
symvar(s,1)
查找表达式 s 的主变量。例如下面程序所示。
>> syms a b w y z
>> symvar(a*z+b*w,1)
ans =
w
>> symvar(a*y+b*w,1)
ans =
y
4. 符号矩阵的运算
- 符号矩阵也是一种符号表达式,所以前面介绍的符号表达式运算都可以在矩阵意义行。但应注意这些函数作用于符号矩阵时,是分别作用于矩阵的每一个元素。 例如,建立如下符号矩阵并化简。 m = [ a 3 − b 3 sin 2 α + cos 2 α 15 x y − 3 x 2 x − 5 y 78 ] m=\begin{bmatrix} a^{3}-b^{3}& \sin^{2} \alpha+\cos^{2} \alpha \\ \frac{15xy-3x^{2}}{x-5y} &78 \end{bmatrix} m=[a3−b3x−5y15xy−3x2sin2α+cos2α78]
>> syms a b x y alp
>> m=[a^3-b^3,sin(alp)^2+cos(alp)^2;(15*x*y-3*x^2)/(x-5*y),78]
m =
[ a^3 - b^3, cos(alp)^2 + sin(alp)^2]
[(- 3*x^2 + 15*y*x)/(x - 5*y), 78]
>> simplify(m) %对符号矩阵化简处理
ans =
[a^3 - b^3, 1]
[ -3*x, 78]
- 由于符号矩阵是一个矩阵,所以符号矩阵还能进行有关矩阵的运算。
- 前面我们介绍过的应用于数值矩阵的点运算符和函数,如 diag、triu、tril、inv、det、rank、eig 等,也可直接应用于符号矩阵。
- 下面我们定义一个符号矩阵,并进行各种符号运算。
>> syms x
>> A=[sin(x),cos(x);acos(x),asin(x)]
A =
[ sin(x), cos(x)]
[acos(x), asin(x)]
>> B=A.' %求转置矩阵,注意有点运算符
B =
[sin(x), acos(x)]
[cos(x), asin(x)]
>> C=diag(A,1) %求矩阵对角线元素
C =
cos(x)
>> C=diag(A)
C =
sin(x)
asin(x)
>> C=diag(A,-1)
C =
acos(x)
>> D=triu(A) %求上三角元素
D =
[sin(x), cos(x)]
[ 0, asin(x)]
>> n=rank(A) %求秩
n =
2
- 例如,我们求解当 λ \lambda λ 取何值时,以下齐次线性方程组有非零解。 { ( 1 − λ ) x 1 − 2 x 2 + 4 x 3 = 0 2 x 1 + ( 3 − λ ) x 2 + x 3 = 0 x 1 + x 2 + ( 1 − λ ) x 3 = 0 \left\{\begin{matrix}(1-\lambda )x_{1}-2x_{2}+4x_{3}=0 \\2x_{1}+(3-\lambda )x_{2}+x_{3}=0 \\x_{1}+x_{2}+(1-\lambda )x_{3}=0 \end{matrix}\right. ⎩ ⎨ ⎧(1−λ)x1−2x2+4x3=02x1+(3−λ)x2+x3=0x1+x2+(1−λ)x3=0
- 对于齐次线性方程组 A x = 0 Ax=0 Ax=0,当 rank( A A A) < n <n 或 ∣ A ∣ = 0 \left | A \right | =0 ∣A∣=0 时,齐次方程组有非零解。具体程序如下:
>> syms lamda
>> A=[1-lamda,-2,4;2,3-lamda,1;1,1,1-lamda]
A =
[1 - lamda, -2, 4]
[ 2, 3 - lamda, 1]
[ 1, 1, 1 - lamda]
>> D=det(A)
D =
- lamda^3 + 5*lamda^2 - 6*lamda
>> factor(D)
ans =
[-1, lamda, lamda - 2, lamda - 3]
- 从而得知,当 λ = 0 \lambda=0 λ=0, λ = 2 \lambda=2 λ=2 或 λ = 3 \lambda=3 λ=3 时,原方程组有非零解。