文章目录

  • 1. 算法
  • 2. 程序
  • 3. 案例
  • 4. 联系作者

1. 算法

上一篇介绍了显式欧拉法、隐式欧拉法、两步欧拉法和改进欧拉法求解常微分方程初值问题;其中显式欧拉法和隐式欧拉法是一阶算法精度,截断误差为O(h2)O\left( {{h^2}} \right)O(h2);两步欧拉法和改进欧拉法是二阶算法精度,截断误差为O(h3)O\left( {{h^3}} \right)O(h3);欧拉法的精度有限、需要求解步长hhh很小。本篇介绍求解精度更高的四阶龙格库塔法(Runge-Kutta),其截断误差为O(h5)O\left( {{h^5}} \right)O(h5)。

对于一阶微分方程初值问题:

{y˙=f(t,y)y(t0)=y0\left\{ \begin{array}{l} {\bf{\dot y}} = f\left( {t,{\bf{y}}} \right) \\ {\bf{y}}\left( {{t_0}} \right) = {{\bf{y}}_0} \\ \end{array} \right.{y˙​=f(t,y)y(t0​)=y0​​

式中, t0{t_0}t0​为初始时间(已知常数),y0{{\bf{y}}_0}y0​为初始状态(已知向量),f(t,y)f\left( {t,{\bf{y}}} \right)f(t,y)为关于时间t{t}t和状态y{{\bf{y}}}y的函数(已知函数)。

四阶龙格库塔法(Runge-Kutta)求解算法为:

k1=f(t(k),y(k)){{k}_{1}}=f\left( t\left( k \right),\mathbf{y}\left( k \right) \right)k1​=f(t(k),y(k))
k2=f(t(k)+h2,y(k)+h2k1){{k}_{2}}=f\left( t\left( k \right)+\frac{h}{2},\mathbf{y}\left( k \right)+\frac{h}{2}{{k}_{1}} \right)k2​=f(t(k)+2h​,y(k)+2h​k1​)
k3=f(t(k)+h2,y(k)+h2k2){{k}_{3}}=f\left( t\left( k \right)+\frac{h}{2},\mathbf{y}\left( k \right)+\frac{h}{2}{{k}_{2}} \right)k3​=f(t(k)+2h​,y(k)+2h​k2​)
k4=f(t(k)+h,y(k)+hk3){{k}_{4}}=f\left( t\left( k \right)+h,\mathbf{y}\left( k \right)+h{{k}_{3}} \right)k4​=f(t(k)+h,y(k)+hk3​)
y(k+1)=y(k)+h6(k1+2k2+2k3+k4)\mathbf{y}\left( k+1 \right)=\mathbf{y}\left( k \right)+\frac{h}{6}\left( {{k}_{1}}+2{{k}_{2}}+2{{k}_{3}}+{{k}_{4}} \right)y(k+1)=y(k)+6h​(k1​+2k2​+2k3​+k4​)
y(0)=y0\mathbf{y}\left( 0 \right)={{\mathbf{y}}_{0}}y(0)=y0​

上式是关于y(k){\bf{y}}\left( k \right)y(k)向y(k+1){\bf{y}}\left( k+1 \right)y(k+1)的递推形式,可以根据初始条件按照递推关系依次求出y(1),y(2),y(3),y(4)⋯,y(N)⋯{\bf{y}}\left( 1 \right),{\bf{y}}\left( 2 \right),{\bf{y}}\left( 3 \right),{\bf{y}}\left( 4 \right) \cdots ,{\bf{y}}\left( N \right) \cdotsy(1),y(2),y(3),y(4)⋯,y(N)⋯,此离散序列即为微分方程的数值解。

微分方程的数值解法,本质是使用数值积分来实现y˙{\bf{\dot y}}y˙​向y{\bf{y}}y的转换。四阶龙格库塔法通过对微分的四步分段逼近,在一个求解步长内能够逼近复杂的曲线,因此能够取得较高的计算精度,其截断误差为O(h5)O\left( {{h^5}} \right)O(h5)。

2. 程序

作者使用Matlab开发了四阶龙格库塔法求解常微分方程的程序,能够方便快捷的求解一阶常微分方程的初值问题。

function [T,X,dX] = ODE_RK4( Hfun,t,h,x0 )
% [T,X] = ODE_RK4( Hfun,t,h,x0 ) 4阶龙格-库塔法求解常微分方程
% Hfun为描述状态导数的函数句柄,格式为 dX = Hfun( t,X )
% 必须保证返回dX的格式为行向量
% t为时间节点,可为标量,时间范围为 T = 0:h:t
%             长2向量 ,时间范围为 T = t(1):h:t(2)
%             向量 ,时间范围为 T = t
% h为时间步长,在t的前两种情况下,必须给出h具体值
% 直接给出时间节点t时,h可用[]或任意值占位
% x0为状态量初始值
% 算法:
%      K1  = Hfun( t(k-1),X(k-1) ) =  dX(k-1)
%      K2 =  Hfun( t(k-1)+h/2,X(k-1)+h*K1/2 )
%      K3 =  Hfun( t(k-1)+h/2,X(k-1)+h*K2/2 )
%      K4 =  Hfun( t(k-1)+h  ,X(k-1)+h*K3 )
%    X(k) =  X(k-1) + (h/6) * (K1 + 2*K2 + 2*K3 +K4)
% By ZFS@wust  2021
% 获取更多Matlab/Simulink原创资料和程序,清关注微信公众号:Matlab Fans

下面结合实例进行演示和分析。

3. 案例

求解一阶常微分方程(式中向量x{\bf{x}}x等价于前文中的向量y{\bf{y}}y):
x˙=f(t,x)=[x(2)∗x(3)−x(1)∗x(3)−0.51∗x(1)∗x(2)]\mathbf{\dot{x}}=f\left( t,\mathbf{x} \right)=\left[ \begin{matrix} \mathbf{x}(2)*\mathbf{x}(3) \\ -\mathbf{x}(1)*\mathbf{x}(3) \\ -0.51*\mathbf{x}(1)*\mathbf{x}(2) \\ \end{matrix} \right]x˙=f(t,x)=⎣⎡​x(2)∗x(3)−x(1)∗x(3)−0.51∗x(1)∗x(2)​⎦⎤​
x(0)=[011]\mathbf{x}\left( 0 \right)=\left[ \begin{matrix} 0 \\ 1 \\ 1 \\ \end{matrix} \right]x(0)=⎣⎡​011​⎦⎤​

% 四阶龙格库塔算法(Runge-Kutta)测试程序
% By ZFS@wust  2021
% 获取更多Matlab/Simulink原创资料和程序,清关注微信公众号:Matlab Fansclear
clc
close all%%  仿真步长 h=0.6 时
Hfun = @(t,x) [ x(2)*x(3); -x(1)*x(3); -0.51*x(1)*x(2)];   % 一阶微分方程导数表达式% 参数
t = [0 12];     % 时间范围
h = 0.6;       % 时间步长
x0 = [0 1 1];   % 初始状态% 改进欧拉法求解
[T1,X1] = ODE_ImprovedEuler( Hfun,t,h,x0 );
% 改进欧拉法求解
[T2,X2] = ODE_RK4( Hfun,t,h,x0 );
% Matlab自带ode45求解
[T3,X3] = ode45( Hfun,t(1):h:t(2),x0 );% 绘图对比
figure
subplot(311)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_1')
legend('改进欧拉法','四阶龙格库塔法','ode45')
subplot(312)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_2')
legend('改进欧拉法','四阶龙格库塔法','ode45')
subplot(313)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_3')
legend('改进欧拉法','四阶龙格库塔法','ode45')%%  仿真步长 h=0.9 时
% 参数
h = 0.9;       % 时间步长% 改进欧拉法求解
[T1,X1] = ODE_ImprovedEuler( Hfun,t,h,x0 );
% 改进欧拉法求解
[T2,X2] = ODE_RK4( Hfun,t,h,x0 );
% Matlab自带ode45求解
[T3,X3] = ode45( Hfun,t(1):h:t(2),x0 );% 绘图对比
figure
subplot(311)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_1')
legend('改进欧拉法','四阶龙格库塔法','ode45')
subplot(312)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_2')
legend('改进欧拉法','四阶龙格库塔法','ode45')
subplot(313)
plot(T1,X1(:,1),T2,X2(:,1),T3,X3(:,1))
xlabel('Time(s)')
ylabel('x_3')
legend('改进欧拉法','四阶龙格库塔法','ode45')

不同时间步长hhh时的数值计算结果:

  • 步长h=0.6sh=0.6sh=0.6s

  • 步长h=0.9sh=0.9sh=0.9s

从计算结果可以看出,四阶龙格库塔法(Runge-Kutta)即使在步长很大时,也能保持较高的求解精度,求解精度与Matlab自带的ode45函数相当,相对于改进欧拉算法求解精度有明显提高。
自己编程实现四阶龙格库塔法(Runge-Kutta),相对于直接调用ode45等Matlab自带的龙格库塔法的最大优势在于:可以将求解程序和模型描述文件融合起来,解决各类参数时变、条件判断、多模型切换等问题。后续补充实际案例。

4. 联系作者

有Matlab/Simulink方面的技术问题,欢迎发送邮件至944077462@qq.com讨论。
更多Matlab/Simulink原创资料,欢迎关注微信公众号:Matlab Fans

源程序下载:
1. csdn资源: 四阶龙格库塔法(Runge-Kutta)求解常微分方程的Matlab程序及案例
2. 扫码关注微信公众号Matlab Fans,回复BK09获取百度网盘下载链接。

四阶龙格库塔法(Runge-Kutta)求解常微分方程的 Matlab程序及案例相关推荐

  1. python解常微分方程龙格库_excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例.xls...

    excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例,rungekutta,四阶rungekutta法,rungekuttamatlab,四阶rungekutta,rungekutt ...

  2. 蚁群算法求解TSP问题 matlab程序

    https://blog.csdn.net/wayjj/article/details/72809344 蚁群算法,单单学习算法还是不够深入了解,得实际编程实现了,理解才能更加透彻,本文根据这篇博文贴 ...

  3. Matlab遗传算法求解TSO,遗传算法matlab程序实例.doc

    遗传算法matlab程序实例.doc --------------------------------------------------------------------------------- ...

  4. ga tsp matlab,遗传算法(GA)求解TSP问题MATLAB程序

    本程序求解常见的组合优化问题TSP问题,如果仅仅是用一个程序去求解一个优化问题,显然这样的工作意义并不大.主要是因为求解的好坏往往是很难评价的,另外尤其对于遗传算法来说,遗传算法交叉 变异方法不同,交 ...

  5. matlab求不等式的方法,求解变分不等式的matlab程序我需要

    2008-02-21 不等式的解法关于一元三次不等式的解法, 全日制普通高级中学教科书(试验修订本.必修)第一章第四节是"含绝对值的不等式解法",第五节是"一元二次不等式 ...

  6. matlab 变分不等式,求解变分不等式的matlab程序

    满意答案 kide754861 2013.07.11 采纳率:46%    等级:11 已帮助:5599人 function x=Porjection() clc sigama=0.5; gama=0 ...

  7. 四阶龙格-库塔法求解常微分方程的初值问题

    算法原理和程序框图 龙格-库塔法是一种求其准确解y(x)在一系列点xi处y(xi)的近似值yi的方法,yi称为数值解.经典的四阶龙格库塔法方程如下: y'=f(t,y),y(t0)=y0输出按如下求解 ...

  8. 有确定项微分方程的matlab程序,微分方程的数值解法matlab四阶龙格—库塔法课件...

    <微分方程的数值解法matlab四阶龙格-库塔法课件>由会员分享,可在线阅读,更多相关<微分方程的数值解法matlab四阶龙格-库塔法课件(36页珍藏版)>请在人人文库网上搜索 ...

  9. 四阶龙格库塔法-实现异步电机模型仿真

    序言 龙格库塔法是求解线性.非线性微分方程数值解的经典方法.具有计算精度高,稳定性好的特点.由于该方法在基于现代控制理论的观测器应用中十分重要,因此有必要通过一个经典的例子实现该方法的仿真应用. 关键 ...

  10. 基于人工蜂群算法的线性规划求解matlab程序

    基于人工蜂群算法的线性规划求解matlab程序 1 人工蜂群算法概述 2005年D. Karaboga教授仿照蜜蜂集群采蜜生物行为,提出了人工蜂群仿生算法,可以有效解决有关函数优化等相关难题.ABC算 ...

最新文章

  1. (C++)1025 PAT Ranking
  2. 计算机软件与电子出版物,电子出版物出版和互联网出版.pdf
  3. Codeforces Round #382 (Div. 2)B. Urbanization 贪心
  4. electron 桌面程序_如何使用Electron使用JavaScript构建您的第一个桌面应用程序
  5. Python写简单的TCP服务器
  6. elasticjob 分片策略
  7. Python Imaging Library: ImageSequence Module(图像序列模块)
  8. c++输出小数点后几位_Python格式化输出:%s和format()用法比较
  9. 力扣-747 至少是其他数字两倍的最大数
  10. Ubuntu修改hosts文件
  11. Dnf资源分析与提取工具(附代码)
  12. ListView分页显示
  13. CV之FR:基于某AI公司的API接口基于人脸识别实现计算人脸相似度(计算两张人脸图片相似度进而判断否为同一个人)—利用人工智能算法判断相似度极高的国内外明星案例应用
  14. 创作焦虑之下,红人大V怎么看微博?
  15. PHP中将Word文件转换为PDF
  16. java中的String和ArrayList类
  17. C++多线程/互斥锁/条件变量/信号量思维很重要;设计线程安全队列;1114按序打印;1115交替打印FooBar;1116打印零与奇偶数;1117H2O 生成1195交替打印字符串1226哲学家进餐
  18. php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
  19. 葫芦兄弟java7723_颠峰对决之喜羊羊大战葫芦娃
  20. LoveChat独立部署即时通讯IM(前台后台不开源)聊天APP

热门文章

  1. flexsim怎么设置传送带方向_Flexsim_编程常用代码
  2. IDEA插件系列(84):MultiHighlight插件——高亮代码中的标识符
  3. 原生H5+JS文件上传
  4. c++ strlen 使用
  5. linux 卸载vsftpd服务器,vsFPT服务器搭建与卸载
  6. SNMP:简单网络管理协议(一)
  7. 要看cpu的性能好坏主要看什么
  8. 关于NX8.5和VS2010环境配置后,执行DLL文件,报错:未加载图像,详细信息请参见日志文件
  9. 【微信小程序】简洁好用的icon(94/100)
  10. python 拼音输入法_用Python从0开始实现一个中文拼音输入法的思路详解