使用符号代数计算数学方程的解析解,帮助计算一些手动计算较为复杂的方程式。

参考教材《MATLAB使用教程(第二版)》

总结

函数 说明
expand(S) 展开表达式或者方程
factor(S) 对表达式做因式分解
collect(S) 合并同类项
simplify(S) 依据Maple的化简规则化简
simple(S) 将表达式化为最简式
numden(S) 找出表达式分子,不能用于方程
[num,den] = numden(S) 分子、分母,不能用于方程
poly2sym(a) 根据向量生成表达式
sym2poly(S) 根据表达式生成向量
solve(S) 求解表达式方程
findsym(S) 发现并输出所有变量
subs(S,'x','y') 使用y替换S中的x
ezplot() 绘制二维图

符号代数

符号变量

x = sym('x')
syms x

初始化多个符号变量

syms Q R T D0 
D = D0*exp(-Q/(R*T))

m c 没有被定义为符号变量

E = sym('m*c^2') % 使用sym创建完整表达式或方程

ideal_gas_law 是一个方程,而不是一个表达式

ideal_gas_law = sym('P*V = n*R*Temp')

展开、合并、合并同类项

sym x
y = 2*(x+3)^2/(x^2+6*x+9)
% 提取分子和分母
[num,den] = numden(y) 
>> num = 2*(x+3)^2
>> den = x^2+6*x+9
% 展开
expand(num)
>> ans = 2*x^2+12*x+18
% 合并
factor(den)
>> ans = (x+3)^2
% 合并同类项
collect(num)
>> ans = 18 + 2*x^2 + 12*x

在方程式中,视为两边独立的表达式

w = sym('x^3-1 = (x-3)*(x+3)')
expand(w)
>> ans = x^3-1 = x^2-9
factor(w)
>> ans = (x-1)*(x^2+x+1) = (x-3)*(x+3)
collect(w)
>> ans = x^3-1 = x^2-9

化简函数

z = sym('3*a-(a+3)*(a-3)^2')
simplify(z)
>> ans = 12*a-a^3+3*a^2-27

该函数不用考虑表达式中的变量是否定义为符号变量

a没有明确定义,也不会出现在工作区

sample() 会将化简的中间过程展示

符号多项式poly2sym()

a = [1,3,2]
b = poly2sym(a)
>> b = x^2+3*x+2
% 多项式转化为系数矢量
c = sym2poly(b)
>> c = 1 3 2

求解表达式和方程

solve() 求解表达式

solve('x^2-9')
>> ans = 3  -3

如果提前定义x,不用单引号,没有定义则需引号引起来

solve('a*x^2+b*x+c')
% matlab先求解x,如果表达式中没有x,求解与x最近的变量
% 求解指定变量a
solve('a*x^2+b*x+c','a')
% 求解等式
E2 = sym('5*x^2 + 6*x + 3 = 10')
solve(E2)
% 将结果使用双精度表示
double(ans)

matlab的符号运算能力基于Maple,浮点数使用小数表示结果,整数使用分数形式表达结果。Maple默认32位数

findsym()

可以显式标识出所有变量

X = sym('D=D0*exp(-Q/(R*T))')
findsym(X)
>> ans = 
D,D0,Q,R,T

替换

% 使用y替换E4方程中的x
subs(E4,'x','y')
subs(E4,'x',3)
subs(E4,{a,v,c,x},{1,2,3,4})

符号绘图

ezplot()

y = sym('x^2-2')
ezplot(y)
ezplot(y,[-10,10]) % 输入区域设定x的最大最小值
title("二阶多项式")
xlabel('x')
ylabel('y')

ezplot('x^2+y^2=1',[-1.5,1.5])
ezplot('x^2+y^2-1',[-1.5,1.5])
z = ezplot('x^2+y^2-1')
ezplot(z,[-1.5,1.5])
ezplot('sin(t)','cos(t)')

其他绘图函数

函数 说明
ezplot 绘制函数图
ezmesh 绘制网格曲面图
ezmeshc 绘制网格曲面和等高线图
ezsurf 绘制曲面图
ezsurfc 绘制曲面图和等高线图
ezcontour 绘制等高线图
ezcontourf 填充等高线图
ezplot3 绘制三维曲线图
ezpolar 绘制极坐标图

微积分运算

微分

dist = sym('20+20*sin(pi*(t-10)/20)')
velocity = diff(dist)
>> velocity = cos(1/20*pi*(t-10))*pi
函数 说明
diff(f) 对表达式f默认变量求导
diff(f,’t’) 对表达式f关于t求导
diff(f,n) 返回表达式f关于默认变量的n阶导
diff(f,’t’,n) 返回表达式f关于t的n阶导

积分

函数 说明
int(f) 返回表达式f关于默认变量的积分结果
int(f,’t’) 返回表达式f关于变量t的积分结果
int(f,a,b) 返回表达式f关于默认变量在区间a到b上的积分
int(f,’t’,a,b) 返回表达式f关于变量t在数值区间a到b上的积分
int(f,’t’,’a’,’b’) 返回表达式f关于变量t在符号区间a到b上的积分

微分方程

syms c1 e t
y = sym(c1*e^t)
dsolve('Dy = y')

dsolve('Dy = y','y(0) = 1') % 特解

dsolve('Dy = 2*y/t','y(-1) = 1','t') % 不把t当作自变量,在第三个位置指定自变量

dsolve('D2y = -y') % 求二次微分


在微分方程中不要难过用字母D命名变量,否则函数会把D解释为微分