Matlab符号对象与符号运算

本文最后更新于:2023年9月13日 下午

Matlab符号对象与符号运算

 符号对象(Symbolic Objects)不同于普通的数值计算)是Matlab中的一种特殊数据类型,它可以用来表示符号变量、表达式以及矩阵,利用符号对象能够在不考虑符号所对应的具体数值的情况下能够进行代数分析和符号计算(symbolic math operations),例如解代数方程、微分方程、进行矩阵运算等。

Matlab

一、符号对象的定义

  在matlab中,使用 syms 语句可以直接定义符号变量。

(1)sym函数

  对于sym函数,sym函数用于建立单个符号对象,其常用调用格式为:符号对象名=sym(A)。

1
x=sym('x'); y=sym('y'); z=sym('z')

  不加单引号:A是数值常量、数值矩阵或数值表达式,此时符号对象为一个符号常量;

  加单引号:A是变量名,这时符号对象为一个符号变量。

(2)syms命令

  syms命令可以一次定义多个符号变量,其一般调用格式为:syms 符号变量名1 符号变量名2 … 符号变量名n。

1
syms x y z

二、符号对象的运算

  利用符号变量可以构建符号表达式、符号函数、符号方程和符号矩阵等,然后可以进行因式分解、求导、求方程、求矩阵函数值的解等操作

(1)符号表达式的展现形式

1.对符号表达式s分解因式

1
2
3
4
5
>> syms a b;
>> s=a^3-b^3;
>> factor(s)
ans =
[ a - b, a^2 + a*b + b^2]

2.对符号表达式s进行展开

1
2
3
4
5
>> syms a b;
>> s=(3*a + 1)*(3*b^2 + 2*b + 2);
>> expand(s)
ans =
6*a + 2*b + 6*a*b + 9*a*b^2 + 3*b^2 + 2

3.对符号表达式s合并同类项

1
2
3
4
5
6
7
8
>> syms x y
>> collect(x^2*y + y*x - x^2 - 2*x, x)
ans =
(y - 1)*x^2 + (y - 2)*x

>> collect(x^2*y + y*x - x^2 - 2*x, y)
ans =
(x^2 + x)*y - x^2 - 2*x

(2)符号表达式的求根roots函数

  以列向量的形式返回 表示的多项式的根。输入是一个包含 多项式系数的向量,以 系数开头。0系数表示方程中不存在的中间幂。例如:表示多项式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> syms a b c x;
>> f=a*x^2+b*x+c
f =
a*x^2 + b*x + c

>> g=coeffs(f,x)
g =
[ c, b, a]

>> g=g(end:-1:1)
g =
[ a, b, c]

>> roots(g)
ans =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)

(3)符号等式求解

1. solve函数(解析解)
1
2
3
4
5
6
>> syms a b c x
>> eqn = a*x^2 + b*x + c == 0
>> S = solve(eqn, x)
S =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
2. vpasolve函数(数值解)
1
2
3
4
5
6
7
8
>> syms x
>> eqn = sin(x) == x^2 - 1;
>> fplot([lhs(eqn) rhs(eqn)], [-2 2]) % 绘制两个函数相交的图像
>> V = vpasolve(eqn,x,[0 2])
V = 1.4096240040025962492355939705895

>> V = vpasolve(eqn,x,[-2 0])
V = -0.63673265080528201088799090383828

(4)符号表达式求导/求微分

  对符号表达式f(x)求导的命令为diff(f)。Matlab可以自动识别表达式中的变量,如果表达式中只包含一个变量,则diff(f)函数是相对这个唯一的变量求导,若表达式中包含多个变量,则diff(f)是对f中的默认变量求导,默认变量是f中含有的在字母表中离x最近的变量。表达式f的默认变量可以用函数findsym(f,1)来得出。

  如果要对f(x)求n阶导数,则用diff(f,n)。对于含有多个自变量的表达式,diff可以实现求偏导,例如表达式f(s,t)相对s求偏导就用diff(f,s),如果相对s求2阶偏导则是diff(f,s,2),先对x求偏导,再对y求偏导则是diff(f,x,y),如果diff函数作用的对象不是符号函数,而是矩阵,那么对应的功能是求差分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> syms x y
>> f = x^2*y + y*x - x^2 - 2*x
>> diff(f,x)
ans =
y - 2*x + 2*x*y - 2

>> diff(f,x,2)
ans =
2*y - 2

>> diff(f,y)
ans =
x^2 + x

>> diff(f,y,2)
ans =
0

(5)符号表达式求积分int

  求符号表达式f(x)的不定积分用int(f)。对于含有多个符号变量的表达式f(x,s,t),如果希望将其相对t求积分,用int(f,t)。求f(x)从0到1的定积分用int(f,0,1)或int(f,x,0,1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> syms x y
>> eqn = x^2*y + y*x - x^2 - 2*x
>> int(eqn,x)
ans =
(y/3 - 1/3)*x^3 + (y/2 - 1)*x^2

>> int(eqn,x,0,1)
ans =
(5*y)/6 - 4/3

>> int(eqn,y)
ans =
(x^2/2 + x/2)*y^2 + (- x^2 - 2*x)*y

>> int(eqn,y,0,1)
ans =
-(x*(x + 3))/2

(6)符号表达式求极限limit

  求函数f(x)或f(x,y)在x趋近于0时的极限用limit(f,x,0),求f在n趋近无穷大时的极限用limit(f,x,inf),求f(x)在x趋近0-(左极限)或x趋近0+(右极限)的时候用limit(f,x,0,'left')或limit(f,x,0,'right')。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> syms n
>> f = (1+x/n)^n;

>> limit(f,n,inf)
ans =
exp(x)

>> limit(f,n,0,'left')
ans =
1

>> limit(f,n,0,'right')
ans =
1

(7)符号矩阵运算

  符号矩阵也是一种符号表达式,所以符号表达式运算都可以在矩阵意义下进行。注意:这些函数作用于符号矩阵时,是分别作用于矩阵的每一个元素。

1
2
3
4
5
6
7
8
9
10
11
>> 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]

(8) 符号矩阵(雅可比矩阵计算)Jacobian

  在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近。因此,雅可比矩阵类似于多元函数的导数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
syms x1 x2 ; %定义变量
a = [x1, x2];
f = [x1 * x1 + x1; x2 * cos(x2)]; %定义函数,以矩阵的形式
x = jacobian(f, a); % 求取雅可比矩阵
b = [1, 2];
y = subs(x, a, b) %赋值
%此时结果
y =
[ 5/2, 0]
[ 0, cos(2) - 2*sin(2)]
y = eval(y) %转化为double型数值矩阵,
%结果
y =
2.5000 0
0 -2.2347

二、符号对象的美化显示

1
2
syms a1 a2 a3 alpha1 alpha2 n1 n2 phi d_theta M
F = a2 * cos(alpha2) + sqrt((alpha1 * sin(alpha2) * cos(d_theta) - a2 * cos(alpha2))^2-n2^2+1) - a1 * cos(d_theta) * sin(alpha2);

(1) pretty函数

1
2
3
>> pretty(F)
2 2
a2 cos(alpha2) + sqrt((a2 cos(alpha2) - alpha1 cos(d_theta) sin(alpha2)) - n2 + 1) - a1 cos(d_theta) sin(alpha2)

(2) collect函数

1
2
3
4
5
>> collect(F)

ans =

a2*cos(alpha2) + ((a2*cos(alpha2) - alpha1*cos(d_theta)*sin(alpha2))^2 - n2^2 + 1)^(1/2) - a1*cos(d_theta)*sin(alpha2)

(3) expand函数

1
2
3
4
5
>> expand(f)

ans =

(a2^2*cos(alpha2)^2 - n2^2 + alpha1^2*cos(d_theta)^2*sin(alpha2)^2 - 2*a2*alpha1*cos(alpha2)*cos(d_theta)*sin(alpha2) + 1)^(1/2) + a2*cos(alpha2) - a1*cos(d_theta)*sin(alpha2)

(4) horner函数

1
2
3
4
5
>> horner(f)

ans =

a2*cos(alpha2) + ((a2*cos(alpha2) - alpha1*cos(d_theta)*sin(alpha2))^2 - n2^2 + 1)^(1/2) - a1*cos(d_theta)*sin(alpha2)

(5) factor函数

1
2
3
4
5
>> factor(f)

ans =

a2*cos(alpha2) + ((a2*cos(alpha2) - alpha1*cos(d_theta)*sin(alpha2))^2 - n2^2 + 1)^(1/2) - a1*cos(d_theta)*sin(alpha2)

(6) simplify函数

1
2
3
4
5
>> simplify(f)

ans =

a2*cos(alpha2) + ((a2*cos(alpha2) - alpha1*cos(d_theta)*sin(alpha2))^2 - n2^2 + 1)^(1/2) - a1*cos(d_theta)*sin(alpha2)

(7) symdisp函数【自定义】

1
2
3
4
5
6
7
8
9
10
11
>> symdisp(f)

ans =

Figure (Msgbox_字符的数学展示形式) - 属性:

Number: []
Name: '字符的数学展示形式'
Color: [1 1 1]
Position: [589.2500 481.1667 719.7634 76.8003]
Units: 'points'

符号函数的美化展示

需要将symdisp.m文件添加至Matlab的设置路径中,以方便Matlab在任何工作路径下调用。