我是靠谱客的博主 慈祥小伙,最近开发中收集的这篇文章主要介绍基于MATLAB的微分方程的定步长与动步长算法对比解法(附完整代码)一.  四阶定步长Runge-Kutta算法 二.  四阶五级Runge-Kutta-Felhberg算法三. 微分方程求解函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一.  四阶定步长Runge-Kutta算法

 二.  四阶五级Runge-Kutta-Felhberg算法

三. 微分方程求解函数

3.1 求解格式

3.2 描述微分方程组

例题1

例题2


一.  四阶定步长Runge-Kutta算法

令h代表计算步长,该算法的主题思想如下:
 

下一个步长的状态变量值,可计算如下:

x_{k+1}=x_k+frac{1}{6}(k_1+2k_2+2k_3+k_4)

形成MATLAB代码如下:

function [tout,yout]=rk_4(odefile,tspan,y0) %y0初值列向量
t0=tspan(1);
th=tspan(2);
if length(tspan)<=3,h=tspan(3); %tspan=[t0,th,h]
else h=tspan(2)-tspan(1);
th=tspan(end);
end %等间距的数组
tout=[t0;h;th]';
yout=[];
for t=tout'
k1=h*eval([odefile'(t,y0)']); %odefile是一个字符串变量,为表示微分方程f()的文件名
k2=h*eval([odefile'(t+h/2,y0+0.5*k1)']);
k3=h*eval([odefile'(t+h/2,y0+0.5*k2)']);
k4=h*eval([odefile'(t+h,y0+k3)']);
y0=y0+(k1+2*k2+2*k3+k4)/6;
yout=[yout;y0'];
end
end
%实际上该算法不是一个较好的方法

 二.  四阶五级Runge-Kutta-Felhberg算法

假设当前的步长为h_k,定义6个k_i变量,如下:

k_i=h_kf(t_k+alpha_ih_k,x_k+sum_{j=1}^{i-1}beta_{ij}k_j),quad i=1,2,cdots,6

下一步的状态向量可计算如下:

x_{k+1}=x_k+sum_{i=1}^6gamma_ik_i

定义一个误差向量,如下:

epsilon_k=sum_{i=1}^6(gamma_i-y_i^*)k_i

通过误差向量调节步长,这个过程就被称之为自动变步长方法。实际上,四阶五级RKF算法有自己的参量系数表。

三. 微分方程求解函数

3.1 求解格式

利用ode45()函数,主要由三种格式。

格式1:直接求解

[t,x]=ode45(Fun,[t0,tf],x0)

格式2:带有控制参数

[t,x]=ode45(Fun,[t0,tf],x0,options)

格式3:带有附加参数

[t,x]=ode45(Fun,[t0,tf],x0,options,p1,p2,···)

以上格式中[t0,tf]代表求解区间,x0代表初值问题的初始状态变量。

3.2 描述微分方程组

如果不附加变量,格式如下:

function xd=funname(t,x)

也可以附加变量,格式如下:

function xd=funname(t,x,flag,p1,p2,···)
%t是时间变量或者是自变量,是必须要给的
%x为状态向量
%xd为返回状态向量的导数
%flag用来控制求解过程,指定初值,即使初值不用指定,也必须要有该变量占位

options是唯一结构体变量,可以用odeset()修改。

%格式1
options=odeset('RelTol',1e-7)
%格式2
options=odeset;
options.RelTol=1e-7;

例题1

求解Lorenz模型的状态方程。

参数值如下:

beta=frac{8}{3},rho=10,sigma=28

初值如下:

x_1(0)=x_2(0)=0,x_3(0)=epsilon,epsilon=10^{-10}

微分模型如下:

解:

此题代码由两个部分组成

(1)原方程文件

function xdot=lorenzeq(t,x)
xdot=[-8/3*x(1)+x(2)*x(3);-10*x(2)+10*x(3);-x(1)*x(2)+28*x(2)-x(3)];

 (2)主运行文件

clc;clear;
t_final=100;
x0=[0;0;1e-10]; %t_final为设定的仿真终止时间
[t,x]=ode45('lorenzeq',[0,t_final],x0);
plot(t,x)
figure; %打开新图形窗口
plot3(x(:,1),x(:,2),x(:,3));
axis([5 50 -25 25 -25 30]); %根据实际数值手动设置坐标系
figure;
comet3(x(:,1),x(:,2),x(:,3)) %绘制动画式的轨迹

运行结果:

 

备注:图3实际上是一个动画的形式

例题2

带有附加参数的微分方程求解:洛伦茨方程。

编写有附加参数的函数描述Lorenz方程。

求解一组参数beta=2,rho=5,sigma=20下,方程的数值解

解:

此题有两个代码文件。

(1)原微分方程文件

function xdot=lorenz1(t,x,flag,beta,rho,sigma) %flag变量是不能省略的
xdot=[-beta*x(1)+x(2)*x(3);-rho*x(2)+rho*x(3);-x(1)*x(2)+sigma*x(2)-x(3)];

 (2)主运行文件

clc;clear;
%求微分方程
t_final=100;
x0=[0;0;1e-10];
b2=2;r2=5;s2=20;
[t2,x2]=ode45('lorenz1',[0,t_final],x0,[],b2,r2,s2);
%options位置为[],表示不需要修改控制项
plot(t2,x2)
figure;
plot3(x2(:,1),x2(:,2),x2(:,3));
axis([0 72 -20 22 -35 40]);

运行结果:

 

 

最后

以上就是慈祥小伙为你收集整理的基于MATLAB的微分方程的定步长与动步长算法对比解法(附完整代码)一.  四阶定步长Runge-Kutta算法 二.  四阶五级Runge-Kutta-Felhberg算法三. 微分方程求解函数的全部内容,希望文章能够帮你解决基于MATLAB的微分方程的定步长与动步长算法对比解法(附完整代码)一.  四阶定步长Runge-Kutta算法 二.  四阶五级Runge-Kutta-Felhberg算法三. 微分方程求解函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部