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

article/2025/8/29 22:27:22

文章目录

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

1. 算法

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

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

{ y ˙ = f ( t , y ) y ( t 0 ) = y 0 \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

式中, t 0 {t_0} t0为初始时间(已知常数), y 0 {{\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)求解算法为:

k 1 = 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))
k 2 = f ( t ( k ) + h 2 , y ( k ) + h 2 k 1 ) {{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)+2hk1)
k 3 = f ( t ( k ) + h 2 , y ( k ) + h 2 k 2 ) {{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)+2hk2)
k 4 = f ( t ( k ) + h , y ( k ) + h k 3 ) {{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 ) + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) \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 ) = y 0 \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) \cdots y(1),y(2),y(3),y(4),y(N),此离散序列即为微分方程的数值解。

微分方程的数值解法,本质是使用数值积分来实现 y ˙ {\bf{\dot y}} y˙ y {\bf{y}} y的转换。四阶龙格库塔法通过对微分的四步分段逼近,在一个求解步长内能够逼近复杂的曲线,因此能够取得较高的计算精度,其截断误差为 O ( h 5 ) 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.51x(1)x(2)
x ( 0 ) = [ 0 1 1 ] \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')

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

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

  • 步长 h = 0.9 s h=0.9s h=0.9s
    h=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获取百度网盘下载链接。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/Fv3VEknW.shtml

相关文章

【Runge-Kutta】龙格-库塔法求解微分方程matlab仿真

1.软件版本 MATLAB2013b 2.算法理论 龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4”或者就是“龙格库塔法”。令初值问题表述…

龙格-库塔方法学习笔记

1、龙格-库塔法简介 龙格—库塔法是一种在工程上应用广泛的高精度单步算法,其中包括著名的欧拉法,用于数值求解微分方程。 由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。 在各种龙格—库塔法当中有一个方法十…

四阶龙格库塔法的计算例子

序 没有对比就没有伤害,本文先给出很多时候直接采用的矩形法,然后与四阶龙格库塔法做比较,着重说明四阶龙格库塔法。 一、矩形法 1.1 原理 设微分方程 y ˙ f ( y ) (1.1) \dot yf(y) \tag{1.1} y˙​f(y)(1.1) 求 y y y。 使用数值方法…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的,只能通过多次迭代求近似的数值解。 龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

龙格-库塔(Runge-Kutta)方法C++实现

龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。 1 中点法 2传统二阶龙格库塔法: 3 传统三阶龙格库塔法 4 传…

龙格库塔法

1 基本思想 我们求解常微分方程的时候,某些常微分方程有解析方法,但是大多数的常微分方程只能用数值解法来求解。 数值解法的一个基本特点就是“递进式”,顺着节点的顺序一步一步向前推进。 龙格库塔法的基本思想就是利用f(x,y)在某些特殊点…

关于html中文字空格以及换行符的处理

在阮一峰大神的博客中发现空格原来可以有多种处理方式,过去只知道用$nbsp;真是惭愧。长路漫漫吖 目录 1、html里面的空格2、怎样原样显示空格和换行符2.1 使用pre标签2.2 使用white-space设置样式 3、参考链接 1、html里面的空格 在html里面,空格和换行符…

html5中如何取消换行,html5换行符元素: 元素

1. 基本概念 html5中的元素用于产生一个换行符,它的名称br正是单词break的前两个字母;break本身的含义为“打破、拆分”,在此处就引申为换行的意思。 为什么html5要专门定义一个元素来代表换行符呢?我们平常在办公软件中编辑文本的…

linux换行符 r,\r \n 回车换行符详解

\r \n 回车换行符详解 \r \n 回车换行符详解 \r \n 回车换行符详解1. \r \n 回车换行的含义1.1 \r 回车 1.2 \n 换行 2. \r \n 回车换行的历史2.1 \r \n 回车换行的历史 2.2 发展:linux 和 windows的不同 参考: 1.1 \r 回车 回车 CR (carriage return) 含义:return oldline …

html文本换行符

2019独角兽企业重金招聘Python工程师标准>>> p的样式&#xff1a;white-space:pre;或者white-space:pre-wrap;或者white-space:pre-line; <p> abcdef </p> 转载于:https://my.oschina.net/u/3407699/blog/1829940

在html中js如何给字符串中加换行符

var str 如果有一天休息休息下cvcvx,"\n" 那么&#xff5e;&#xff5e;&#xff5e;; 这种写法在html中是会被识别为"如果有一天休息休息下cvcvx,\n 那么&#xff5e;&#xff5e;&#xff5e;" 那么如何保证其这么写会被识别&#xff0c;只需要在该d…

linux cr换行符,回车符CR和换行符LF

我在Windows电脑上做开发时,经常会见到这个现象。代码从远程git仓库clone下来后,然后npm install安装依赖后,打开任意一个代码文件会看到每行结尾处有如下报红: 将鼠标指针停留在行尾报红处,会浮出如下提示: Expected linebreaks to be LF but found CRLF.eslint(linebre…

文本文件换行符

文本文件的每一行结尾用一个或者两个特殊的ASCII字符进行标识&#xff0c;这个标识就是换行符&#xff0c;不同的操作系统中会采用不同的换行符。 1.CR、LF、CRLF 主要的换行符有三种&#xff1a;LF&#xff08;Line Feed即换行&#xff0c;转义字符用“\n”表示&#xff0c;十…

html语言中的换行标签是,什么是换行符标签

HTML语言中换行的代码是什么&#xff1f; 方法有很多&#xff0c;但要做到用的恰到好处 段落标签 一个段落空一行 效果如下&#xff1a; 是默认的换行&#xff0c;在你要换行的地方加进去就行&#xff0c;单个标签 效果如下&#xff1a; 如果有了 ……&#xff0c;从到中的内容…

html语言换行格式,html换行符br标签

br标签的作用 在 html 源代码中对内容进行编辑,如果直接采用回车换行,那么浏览器解析的结果可能会是一个空格、或者被忽略,正确的做法是使用< br / >标签,在 html 语言中,br标签定义为一个换行符,所以应将它理解为简单的输入一个空行,而不是用来对内容进行分段。 …

html语言换行符,html换行符

在html源代码中对内容进行编辑&#xff0c;如果直接采用回车换行&#xff0c;那么浏览器解析的结果可能会是一个空格、或者被忽略&#xff0c;正确的做法是使用标签&#xff0c;在html语言中&#xff0c;br标签定义为一个换行符&#xff0c;所以应将它理解为简单的输入一个空行…

html怎么换行?换行代码是什么?九种html文字换行方法总结

在用html写网页时&#xff0c;为了让网页中内容看起来整洁流畅&#xff0c;我们需要将其中的文字内容进行换行&#xff0c;那么&#xff0c;html怎么来换行呢&#xff1f;本篇文章就来给大家介绍一下html中给文字换行的方法。 打造全网web前端全栈资料库&#xff08;总目录&am…

零基础HTML入门教程(11)——换行br

本章目录 1.任务目标2.br换行标签3.代码演示4.小结 1.任务目标 我们上一小节学习了img图像&#xff0c;我们这一小节学习一下新的标签br换行标签&#xff0c;并且熟练使用。 2.br换行标签 br 可插入一个简单的换行符。 br 标签是空标签&#xff08;意味着它没有结束标签&…

求菲波那切数列数列第n项三种方法小结

菲波那切数列数列的应用场景还是比较多的&#xff0c;比如可以在考试的时候考你递归啊&#xff0c;早上碰到的一道题就是这样&#xff0c;骄傲地写下递归方程&#xff0c;结果TLE了&#xff0c;然后旁边的大神给我说了一个叫滚动数组的东西。。。题目是这样的You are climbing …

PTA题库函数递归 菲波那切数列(递归版)

请编写递归函数&#xff0c;求菲波那切(Fibonacci)数列某一项的值。 0, 1, 1, 2, 3, 5, 8, 13 , 21, 34, 55, 89, 144, ... 函数原型 double Fib(int index);说明&#xff1a;参数 index 为数列项的索引号&#xff0c;从 0 开始计数。函数值为 Fibonacci 数列第 index 项的值…