Matlab微分方程数值解(专题七)

前言

对于某些非线性微分方程是没有函数解的,只能用数值解法求解,因为本文章介绍两种常规方法求数值解。

Runge-Kutta

[t,y] = ode23(odefun,tspan,y0)

此 MATLAB 函数(其中 tspan = [t0 tf])求微分方程组 y'=f(t,y) 从 t0 到 tf 的积分,初始条件为 y0。解数组 y 中的每一行都与列向量 t 中返回的值相对应。

顾名思义就是该命令针对的是一阶y'=f(t,y)函数的形式。

积分起始值是t0,终止值是tf

y0是初始条件(或者可以说是初始状态列向量)

odefun为要求解的函数,需注意是y'=f(tf)的形式。编写形式可以用M函数,也可以用函数句炳形式。

例如求y'=5+(3y-4x)^2的(0≤x≤10)数值解,满足初始条件y(0)=0.5;

函数句柄形式

clear
ff=@(x,y)5+(3*y-4*x)^2;
[x,y]=ode23(ff,[0,10],0.5)

函数句柄不需要单引号,m函数文件需要 

M文件形式

建立c.m文件,记得保存

function ff=c(x,y)%yy为y'
ff=5+(3*y-4*x)^2;

命令行输入

clear
[x,y]=ode23('c',[0,10],0.5)

5871a80200f24cca8f53b6117168a21e.png

clear
f1=@(t,y)(y^2-t-2)/(4*(t+1));
[t,y]=ode23(f1,[0 10],2);
y1=sqrt(t+1)+1;%t是x轴上的坐标
A=[y,y1]%输出龙格数值解和解析解进行比较。
plot(t,y,'-r')
hold on 
plot(t,y1,'b--')
legend('龙格数值解','解析解')

dbf88def5f8e43658072e0f7a6669fdd.png

99b2fb5c32cb41e597261db753f5e68f.png

 Van Der Pol

求著名的vanderpol方程eq?x%27%27+%28x%5E2-1%29x%27+x%3D0的数值解,并绘制其时间对应的曲线和状态轨迹图。

由于ode法只能用作一阶,所以我们要把他看出一阶来做,并变成两个方程组形式

故设y1=x',y2=x;

所以y2'=y1

所以y1'=-x-x'(x^2-1)=y1(1-y2^2)-y2

所以我们编写M文件如下

function F=c(t,y)%yy为y'
F=ones(2,1);%要把F设为列向量。F=zeros(2,1)也可以
F(1)=(1-y(2)^2)*y(1)-y(2);
F(2)=y(1);

命令行输入

clear
[t,y]=ode23('c',[0 20],[0,0.25]);%t的范围0到20,两个y的初始值分别为0和0.25
plot(t,y(:,1),':b',t,y(:,2),'-r')%时间相应曲线
legend('速度(y1)','位移(y2)')
figure(2);
plot(y(:,1),y(:,2))%状态轨迹图

cebf6d8693bd46a78f133354a6d98fb0.png

 Euler

向前欧拉法又称显式欧拉公式

eq?y_%7Bn+1%7D%3Dy_%7Bn%7D+hf%28x_%7Bn%7D%2Cy_%7Bn%7D%29

编写欧拉公式函数文件如下

function P=Euler(x0,y0,b,h)
%y0为初始值
n=(b-x0)/h;%x0为初值,b为最右边的端点(x的最大值)
X=zeros(round(n),1);%取整是为了防止n作为小数出现。取整命令round
Y=zeros(round(n),1);
k=1;
X(k)=x0;
Y(k)=y0;
for k=1:n
    X(k+1)=X(k)+h;
    Y(k+1)=Y(k)+h*(X(k)-Y(k));
    k=k+1;
end

%前面是编写好的程序,下面求y=e^x-x
%满足初始条件y(0)=1的数值解。步长取0.1,x的最大值取5
y=exp(X)-1
plot(X,y(:,1),'mp')%数值解
%也可以plot(x,y,'mp'),上面是为了防止y出现矩阵形式,所以要确保拿到第一列准确数值。
legend('欧拉数值解')

接下来在命令行窗口输入以下,并与原函数eq?y%3De%5Ex-x 精确解进行图形比较`

oula(0,1,5,0.1)%因为我的文件名是oula,所以是这样子的格式,大家要根据自己的文件名来调用程序
hold on
x=0:0.1:5;
a=exp(x)-x%去掉分号是为了和上面输出的y值作为比较。
plot(x,a,'--g')

1c1ed404ab734e42a39610f5ca7c6643.png

大家可以尝试把 步长0.1改成0.01,得到的结果可能会更精确。

 

 

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无常(F)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值