使用符号代数计算数学方程的解析解,帮助计算一些手动计算较为复杂的方程式。
参考教材《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解释为微分