本文最后更新于:2026年8月29日 晚上
符号对象 (Symbolic Objects) 不同于普通的数值计算,是 Matlab
中的一种特殊数据类型,它可以用来表示符号变量、表达式以及矩阵,利用符号对象能够在不考虑符号所对应的具体数值的情况下进行代数分析和符号计算
(symbolic math
operations),例如解代数方程、微分方程、进行矩阵运算等。
1 符号对象的定义
在 Matlab 中,使用 syms 语句可以直接定义符号变量。
2 sym 函数
对于 sym 函数,sym
函数用于建立单个符号对象,其常用调用格式为:符号对象名=sym(A)。
x=sym('x' ); y=sym('y' ); z=sym('z' )
不加单引号:A
是数值常量、数值矩阵或数值表达式,此时符号对象为一个符号常量;
加单引号:A 是变量名,这时符号对象为一个符号变量。
3 syms 命令
syms 命令可以一次定义多个符号变量,其一般调用格式为:syms 符号变量名
1 符号变量名 2 ... 符号变量名 n。
4 符号对象的运算
利用符号变量可以构建符号表达式、符号函数、符号方程和符号矩阵等,然后可以进行因式分解、求导、求方程、求矩阵函数值的解等操作。
5 符号表达式的展现形式
6 对符号表达式 s 分解因式
>> syms a b; >> s=a^3 -b^3 ; >> factor (s)ans = [ a - b, a^2 + a*b + b^2 ]
7 对符号表达式 s 进行展开
>> 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
8 对符号表达式 s 合并同类项
>> 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
9 符号表达式的求根 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)
10 符号等式求解
11 solve 函数(解析解)
>> 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)
12 vpasolve 函数(数值解)
>> 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
13 符号表达式求导/求微分
对符号表达式 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
14 符号表达式求积分 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
15 符号表达式求极限 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')。
>> 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
16 符号矩阵运算
符号矩阵也是一种符号表达式,所以符号表达式运算都可以在矩阵意义下进行。注意:这些函数作用于符号矩阵时,是分别作用于矩阵的每一个元素。
>> 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 ]
17
符号矩阵(雅可比矩阵计算)Jacobian
在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。雅可比矩阵的重要性在于它体现了一个可微方程与给出点的最优线性逼近。因此,雅可比矩阵类似于多元函数的导数。
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) y = 2.5000 0 0 -2.2347
18 符号对象的美化显示
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);
19 pretty 函数
>> 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)
20 collect 函数
>> 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)
21 expand 函数
>> 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)
22 horner 函数
>> 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)
23 factor 函数
>> 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)
24 simplify 函数
>> 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)
25 symdisp 函数【自定义】
>> 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 在任何工作路径下调用。