MATLAB 之 符号计算基础

这里写目录标题

  • 一、符号计算基础
    • 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=[a3b3x5y15xy3x2sin2α+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λ)x12x2+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 时,原方程组有非零解。

你可能感兴趣的:(MATLAB,matlab,开发语言,算法)