常微分方程的求解——符号解和数值解,大多数常微分方程符号解不可求,更多的是求解数值解
文章目录
前言
文章包含常微分方程的数值解和符号解以及画图的简单代码
一、常微分方程的符号解
使用函数dsolve()进行求解,对于画图,直接plot()就好
1.一阶微分方程
clc,clear,syms y(x)%此处定义函数y(x)
%假设求解的函数是y'=y+x^2
y=dsolve(diff(y)==y+x^2,y(0)==1);%注意给函数赋初值
2.二阶线性微分方程
高阶微分方程求法与该处方法相似,定义各阶导数即可
clc,clear,syms y(x)%此处定义函数y(x),与上面相同
%假设求解的函数是y''-2y'+y=exp(x)
dy=diff(y);%定义一阶导数,为了赋初值
y=dsolve(diff(y,2)-2*diff(y)+y==exp(x),y(0)==1,dy(0)==-1);%注意一定要赋初值,此外diff(y,2)是指其二阶导数
最后补充一点,如果想要在求符号解时引入pi,最好将其写为sym(pi)以得到理想结果
3.微分方程组
%列举一个简单的方程组其他的类似
clc,clear,syms f(x) g(x)%注意定义函数
df=diff(f);%还是那句话,这一步是为了赋初值,g'(x)没有初值,不必设置
[s1,s2]=dsolve(diff(f,2)+g==3,diff(g)+diff(f)==1,df(1)==0,f(0)==0,g(0)==0)
%其中s1,s2分别为解
二、常微分方程的数值解
有刚性方程和非刚性方程,日后再补充
采用ode45()求解
1.一阶微分方程
clc,clear,close all
%采用前面的求数值解时使用的函数y'=y+x^2
dy=@(x,y) y+x^2;%定义匿名函数
[sx,sy]=ode45(dy,[0,0.5],1)%此处[0,0.5]为x的取值范围,1为初值
plot(sx,sy,'.')%plot()绘制函数解的图形
最后再绘图中若想要表明x和y坐标可以加上
xlabel('$x$','Interpreter','Latex');
ylabel('$y$','Interpreter','Latex','Rotetion',0);
2.二阶微分方程
同样的举例说明
对此,引入y(1)=y, y(2)=y’,则前面的求数值解时使用的函数求解如下所示
clc,clear,close all
dy=@(x,y)[y(2),2*y(2)+y(1)+exp(x)];
[x,y]=ode45(dy,[0,0.999999],[1,-1])%注意赋初值
plot(x,y(:,1));%注意y(:,1)
xlabel('$x$','Interpreter','Latex');
ylabel('$y$','Interpreter','Latex','Rotetion',0);
3.微分方程组
使用一个简单的方程组来说明
x’=-x^3-y, x(0)=1
y’=x-y^3, y(0)=0.5
0<=t<=30
clc,clear,close all
eq=@(t,z)[-z(1)^3-z(2);z(1)-z(2)^3];%设z(1)=x,z(2)=y
s=ode45(eq,[0,30],[1;0.5])
fplot(@(t)deval(s,t,1),[0,30])%绘制x(t)
hold on
fplot(@(t)deval(s,t,2),[0,30])%绘制y(t)
写在最后
对于微分方程建模,注意Logistic模型和传染病预测模型这两个入门级的模型
总结
本文简单介绍了微分方程的求解及其结果的绘图,亦包括Logistic模型的简单介绍