matlab中desolve、solve函数的应用


写在前面(2022年12月6日更新):

感谢评论区@ZSTU_QWQ的指出,新版本的MATLABdesolve函数直接按旧版本的写法写会出现报警告或者错误。我用2021b版本的MATLAB采用原来的代码会出现下面的警告:

在这里插入图片描述

所以我更改了原文,附上了旧版本和新版本的两种写法,都经过验证,代码是可行的,有错误欢迎在评论区指出。

-----------------------------------------------以下是原文-----------------------------------------------


1.desolve函数

desolve函数用于求解微分方程或微分方程组,话不多说,直接上例子:

1.1 求dy/dt=5的微分方程

旧版本的MATLAB写法

y1=dsolve(‘Dy==5’)

新版本的MATLAB写法

syms y(t)
eqn = diff(y,t) == 5;
y1 = dsolve(eqn)
1.2 求dy/dx=x的微分方程,x为自变量

旧版本的MATLAB写法

y2=dsolve(‘Dy==x’,‘x’)

新版本的MATLAB写法

syms y(x)
eqn = diff(y,x) == x;
y2 = dsolve(eqn)
1.3 求d2y/dt2=1+dy/dt的微分方程

旧版本的MATLAB写法

y3=dsolve(‘D2y==1+Dy’)

新版本的MATLAB写法

syms y(t)
eqn = diff(y,t,2) == 1+diff(y,t);
y3= dsolve(eqn)
1.4 求d2y/dt2=1+dy/dt的微分方程,初始条件y(0)=1,dy(0)/dt=0

旧版本的MATLAB写法

y4=dsolve(‘D2y==1+Dy’,‘y(0)==1’,‘Dy(0)==0’)

新版本的MATLAB写法

syms y(t)
Dy = diff(y);
eqn = diff(y,t,2) == 1+diff(y,t);
cond1 = y(0) == 1;
cond2 = Dy(0) == 0;
conds = [cond1 cond2];
y4 = dsolve(eqn,conds)
1.5 dx/dt=y+x,dy/dt=2*x的微分方程组的解,x=y5,y=y6

旧版本的MATLAB写法

[y5,y6]=dsolve(‘Dx == y+x’,‘Dy==2*x’)

新版本的MATLAB写法

syms x(t) y(t)
eqn1 = diff(x,t) == y+x;
eqn2 = diff(y,t) == 2*x;
eqn=[eqn1,eqn2];
[y5,y6]=dsolve(eqn)
1.6 dx/dt=y+x,dy/dt=2*x的微分方程组的解,初始条件x(0)=0,y(0)=1,x=y5,y=y6

旧版本的MATLAB写法

[y7,y8] = dsolve(‘Dx == y+x’,‘Dy==2*x’,‘x(0)==0’,‘y(0)==1’)

新版本的MATLAB写法

syms x(t) y(t)
eqn1 = diff(x,t) == y+x;
eqn2 = diff(y,t) == 2*x;
cond1 = x(0) == 0;
cond2 = y(0) == 1;
eqn = [eqn1,eqn2];
cond = [cond1,cond2];
[y7,y8] = dsolve(eqn,cond)
1.7 求dy/dx=-2y+2x^2+2*x,初始条件y(0)==1,x为自变量

旧版本的MATLAB写法

y9=dsolve(‘Dy==-2y+2x^2+2*x’,‘y(0)==1’,‘x’)

新版本的MATLAB写法

syms y(x)
eqn = diff(y,x) == -2*y+2*x^2+2*x;
cond = y(0) == 1;
y9 = dsolve(eqn,cond)

注意:旧版本的MATLAB里dsolve函数用单引号将方程引起来,方程里不能用.*或者.^ 的符号。新版本用syms进行代替没有这个要求。

2.solve函数

solve函数用于求解一般的方程(非微分方程),话不多说,直接上例子:

2.1 求sin(x)=1/2方程的根
x1=solve(sin(x)==1/2)
2.2 求x^3-1==0方程的根
x2=solve(x.^3-1==0)
2.3 求ax+b=0的解
syms f x a b 
f=a*x+b;
x3=solve(f,x) %x3=-b/a
2.4 求二元一次方程组x+y=1和2x-y=1的解
syms x y 
s=solve(x+y-1,2*x-y-1,x,y);%s是一个结构体
s.x % x=2/3
s.y % y=1/3
2.5 求解二阶微分方程(方程如下)

在这里插入图片描述

syms r 
l=solve(r^2+4*r-3,r) 
syms t c1 c2 
u=c1*exp(l(1)*t)+c2*exp(l(2)*t)
c=solve(subs(u,t,sym(0))-1,subs(diff(u,t),t,sym(0)),c1,c2)
u=subs(u,{c1,c2},{c.c1,c.c2}) 
tt=linspace(0,5,21); 
plot(tt,subs(u,t,tt)) 

结果:
在这里插入图片描述

2.6 求解微分方程

在这里插入图片描述
通解可以知道:
在这里插入图片描述

clear
syms y(x) c
eqn = x*diff(y,x)-y==4*x*log(x);
cod = y(1) == c;
y = dsolve(eqn, cod);

solution = inline(vectorize(y),'x','c');

figure; close all; hold on

xi = 0.1:0.1:2;
for ci = -2:4
    fi = solution(xi,ci);
    if (ci==-2) plot(xi,fi,'.'); end
    if (ci==-1) plot(xi,fi,'o'); end
    if (ci== 0) plot(xi,fi,'x'); end
    if (ci== 1) plot(xi,fi,'+'); end
    if (ci== 2) plot(xi,fi,'*'); end
    if (ci== 3) plot(xi,fi,'s'); end
    if (ci== 4) plot(xi,fi,'d'); end
end
axis tight
xlabel('x','FontSize',20); 
ylabel('y','FontSize',20);
legend({'c = -2','c = -1','c = 0','c = 1',...
'c = 2','c = 3','c = 4'},'Location','best'); 
legend boxoff

在这里插入图片描述

注意:solve函数不用单引号将方程引起来,方程里可以用.*或者.^ 的符号,也可以不用。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值