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

article/2025/8/29 22:25:28

没有对比就没有伤害,本文先给出很多时候直接采用的矩形法,然后与四阶龙格库塔法做比较,着重说明四阶龙格库塔法。


一、矩形法


1.1 原理

设微分方程

y ˙ = f ( y ) (1.1) \dot y=f(y) \tag{1.1} y˙=f(y)(1.1)

y y y

使用数值方法,离散化得每一步的增量

Δ y = f ( y ) Δ t (1.2) \Delta y = f(y)\Delta t \tag{1.2} Δy=f(y)Δt(1.2)

易得

y n + 1 = y n + f ( y n ) Δ t (1.3) y_{n+1} =y_n + f(y_{n}) \Delta t \tag{1.3} yn+1=yn+f(yn)Δt(1.3)

实际上,这就是矩形法计算积分。当 Δ t → 0 \Delta t \to 0 Δt0时,可以得出很高精度的 y n y_n yn,但实际工程中未必能够取很小的 Δ t \Delta t Δt


1.2 例子


y ˙ = e − y y 0 = 0 (1.4) \begin{aligned} \dot y &= e^{-y} \\ y_0 &= 0 \tag{1.4} \end{aligned} y˙y0=ey=0(1.4)

为例,时间取1~10s,分别取 Δ t = 0.1 , Δ t = 1 \Delta t =0.1,\Delta t =1 Δt=0.1,Δt=1,查看不同精度下的运算结果。式(1.4)可求出解析解为 y = ln ⁡ ( t + 1 ) y=\ln(t+1) y=ln(t+1),用于比较求解精度。

%% 不同步长下的矩形法比较dt1 = 0.1;              	% 步长1
dt2 = 1.0;              	% 步长2t1 = 0:dt1:10;          	% 时间1
t2 = 0:dt2:10;          	% 时间2y1 = ode_rect(t1, 0);      	% 精度1下计算结果
y2 = ode_rect(t2, 0);      	% 精度2下计算结果plot(t1,log(t1+1),t1,y1,t2,y2);
legend('理论值', 'dt=0.1', 'dt=1');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(y)dy = exp(-y);
end%% 矩形法
function y = ode_rect(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N - 1dt = t(n+1) - t(n);             % 计算步长 dty(n+1) = y(n) + f(y(n)) * dt;   % 累加计算 yend
end

在这里插入图片描述
可见,当步长为0.1时,矩形法的精度较高,但步长为1时,矩形法误差大。


二、龙格库塔法


2.1 y ˙ = f ( y ) \dot y=f(y) y˙=f(y) 形式

经过多年潜心研究,龙格库塔站在前人的肩膀上,发现了一种高精度的方法。那就是把式(1.3)的计算改为

y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( y n ) k 2 = f ( y n + k 1 h 2 ) k 3 = f ( y n + k 2 h 2 ) k 4 = f ( y n + k 3 h ) (2.1) \begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(y_n) \\ k_2 &= f(y_n + k_1 \frac{h}{2}) \\ k_3 &= f(y_n + k_2 \frac{h}{2}) \\ k_4 &= f(y_n + k_3 h) \end{aligned} \tag{2.1} yn+1k1k2k3k4=yn+6h(k1+2k2+2k3+k4)=f(yn)=f(yn+k12h)=f(yn+k22h)=f(yn+k3h)(2.1)

此处,采用习惯上的符号 h h h,上面的例子中, h = Δ t h=\Delta t h=Δt

依旧对于式(1.4),步长取1,分别使用矩形法和四阶龙格库塔法求解,结果如下

%% 矩形法与龙格库塔法比较
dt = 1.0;
t = 0:dt:10;
y1 = ode_rect(t, 0);       % 矩形法计算    
y2 = ode_rk(t, 0);         % 龙格库塔法计算plot(0:0.01:10,log([0:0.01:10]+1),t,y1,t,y2);
legend('理论值', '矩形法', '龙格库塔法');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(y)dy = exp(-y);
end%% 矩形法
function y = ode_rect(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N - 1dt = t(n+1) - t(n);             % 计算步长 dty(n+1) = y(n) + f(y(n)) * dt;   % 累加计算 yend
end%% 四阶龙格库塔法
function y = ode_rk(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N-1h = t(n+1) - t(n);              % 步长(即时间间隔)k1 = f(y(n));                   % k1k2 = f(y(n) + h/2*k1);          % k2k3 = f(y(n) + h/2*k2);          % k3k4 = f(y(n) + h*k3);            % k4y(n+1) = y(n) + h/6 * (k1 + 2*k2 + 2*k3 + k4);  % 累加计算yend
end

在这里插入图片描述

可见,四阶龙格库塔法很好地接近真实值。


2.2 y ˙ = f ( t ) \dot y=f(t) y˙=f(t) 形式

y ˙ = f ( t ) (2.2) \dot y = f(t) \tag{2.2} y˙=f(t)(2.2)

从理论计算微分方程的角度,式(1.1) 和式(2.2)有着截然不同的求解方式。但是使用数值方法,只不过是把 y y y变为 t t t。四阶龙格库塔法求解式(2.2)的方法如下

y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( t n ) k 2 = f ( t n + h 2 ) k 3 = f ( t n + h 2 ) k 4 = f ( t n + h ) (2.3) \begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(t_n) \\ k_2 &= f(t_n +\frac{h}{2}) \\ k_3 &= f(t_n + \frac{h}{2}) \\ k_4 &= f(t_n + h) \end{aligned} \tag{2.3} yn+1k1k2k3k4=yn+6h(k1+2k2+2k3+k4)=f(tn)=f(tn+2h)=f(tn+2h)=f(tn+h)(2.3)

一个简单的例子是

y ˙ = sin ⁡ ( t ) y 0 = 0 (2.4) \begin{aligned} &\dot y = \sin(t) \\ &y_0 = 0 \end{aligned} \tag{2.4} y˙=sin(t)y0=0(2.4)

其解析解为 y = 1 − cos ⁡ ( t ) y=1-\cos(t) y=1cos(t)。设步长分别为1,0.1,使用四阶龙格库塔法发求解如下

%% 龙格库塔法步长差异比较
dt1 = 1;                % 步长为1
dt2 = 0.1;              % 步长为0.1
T = 10;                 % 总时间10st1 = 0:dt1:T;           % 时间t1
y1 = ode_rk(t1, 0);     % 解y1
t2 = 0:dt2:T;           % 时间t2
y2 = ode_rk(t2, 0);     % 解y2figure(1)
plot(0:0.01:T, 1-cos(0:0.01:T));hold on                 % 解析解计算值
plot(t1,y1, '-o', t2,y2, '--');hold off                             % 数值解计算值
legend('理论值','dt=1', 'dt=0.1');title('龙格库塔法');
grid on;grid minor;xlabel 't';ylabel 'y'%% 导数方程
function dy=f(t)dy = sin(t);
end%% 四阶龙格库塔法
function y = ode_rk(t, y0)N = length(t);y = zeros(N,1);y(1) = y0;for n = 1:N-1h = t(n+1) - t(n);              % 步长(即时间间隔)k1 = f(t(n));                   % k1k2 = f(t(n) + h/2);          % k2k3 = f(t(n) + h/2);          % k3k4 = f(t(n) + h);            % k4y(n+1) = y(n) + h/6 * (k1 + 2*k2 + 2*k3 + k4);  % 累加计算yend
end

在这里插入图片描述

从例子中可见,步长为1时,龙格库塔法依旧得到精确的结果。


2.3 y ˙ = f ( y , t ) \dot y=f(y, t) y˙=f(y,t) 形式


y ˙ = f ( y , t ) \dot y=f(y, t) y˙=f(y,t)

求解 y y y。不过是多了一个变量,使用四阶龙格库塔法计算方法为

y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( y n , t n ) k 2 = f ( y n + k 1 h 2 , t n + h 2 ) k 3 = f ( y n + k 2 h 2 , t n + h 2 ) k 4 = f ( y n + k 3 h , t n + h ) (2.5) \begin{aligned} y_{n+1} &=y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 &= f(y_n,t_n) \\ k_2 &= f(y_n + k_1 \frac{h}{2}, t_n + \frac{h}{2}) \\ k_3 &= f(y_n + k_2 \frac{h}{2}, t_n + \frac{h}{2}) \\ k_4 &= f(y_n + k_3 h, t_n + h) \end{aligned} \tag{2.5} yn+1k1k2k3k4=yn+6h(k1+2k2+2k3+k4)=f(yn,tn)=f(yn+k12h,tn+2h)=f(yn+k22h,tn+2h)=f(yn+k3h,tn+h)(2.5)

更多变量,以此类推,不再赘述。


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

相关文章

龙格-库塔法(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 项的值…

菲波那切数列(Java)

题目&#xff1a; 写一个函数&#xff0c;输入n&#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第n项。斐波那契数列的定义如下&#xff1a; 知识点&#xff1a; 递归&#xff1a;是在一个函数的内部调用这个函数自身。循环&#xff1a;则是通过设置计算的初…

求解斐波那切数列的几种算法

斐波那切数列我们并不陌生。在百度百科中我们可以找到有关它的定义&#xff1a;斐波纳契数列&#xff08;Fibonacci Sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、……在数学上&#xff0c;斐波纳契…

Python多种方法生成菲波那切数列

文章目录 一、顺序输出二、利用递归函数实现三、循环四、利用列表实现五、利用reduce实现六、利用生成器实现七、利用魔术方法实现 记录多种方法生成菲波那切数列 一、顺序输出 代码如下&#xff1a; # 第一种方法 顺序输出# 获取用户输入数据 num int(input("你需要几项…