四阶龙格库塔算法及matlab代码

article/2025/8/29 22:23:21

常微分方程

Ordinary differential equation,简称ODE,自变量只有一个的微分方程。
例子1: d y d x = f ( x , y ) \dfrac {dy} {dx}=f(x,y) dxdy=f(x,y) , f ( x , y ) f(x,y) f(x,y)是已知函数

偏微分方程

Partial differential equation,简称PDE,自变量有多个的微分方程。
例子2: u t − a 2 u x x = 0 , a > 0 u_t-a^2u_{xx}=0,a>0 uta2uxx=0,a>0为常数(热传导方程,抛物型方程的典型代表)

显式(Explicit)

第n步结果可以从n-1, n-2, …1步的结果直接推导出来,迭代时每步的计算量很小,但迭代增量也有限制,不能太大,否则会出现发散。

隐式(Implicit)

第n步的计算结果不能直接从前面的结果推导出来,必须做进一步的求解,这样,迭代时每步的计算量很大。

泰勒公式

f ( x ) = f ( a ) 0 ! + f ′ ( a ) 1 ! ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + . . . + f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) f(x)=\dfrac {f(a)} {0!}+\dfrac {f'(a)} {1!}(x-a)+\dfrac {f''(a)} {2!}(x-a)^2+...+\dfrac {f^{(n)}(a)} {n!}(x-a)^n+R_n(x) f(x)=0!f(a)+1!f(a)(xa)+2!f(a)(xa)2+...+n!f(n)(a)(xa)n+Rn(x)
称为 f(x) 在 x = a 点关于 x 的幂函数展开式,又称为 Taylor 公式,式中Rn(x)叫做 Lagrange 余项。

欧拉方法

考虑一阶常微分方程的初值问题
{ d y d x = f ( x , y ) y ( x 0 ) = y 0 \left\{ \begin{aligned} &\dfrac {dy} {dx}=f(x,y)\\ &y(x_0)=y_0 \end{aligned} \right. dxdy=f(x,y)y(x0)=y0

前向欧拉法

y n + 1 = y n + h f ( x n , y n ) , n = 0 , 1 , . . . y_{n+1}=y_n+hf(x_n,y_n),n=0,1,... yn+1=yn+hf(xn,yn),n=0,1,...

后向欧拉算法

y n + 1 = y n + h f ( x n + 1 , y n + 1 ) , n = 0 , 1 , . . . y_{n+1}=y_n+hf(x_{n+1},y_{n+1}),n=0,1,... yn+1=yn+hf(xn+1,yn+1),n=0,1,...
前后向欧拉法的推理、举例及稳定性对比的超棒分析!地址入口

梯形公式

y n + 1 = y n + h 2 [ f ( x n + y n ) + f ( x n + 1 + y n + 1 ) ] , n = 0 , 1 , . . . y_{n+1}=y_n+\frac h 2[f(x_n+y_n)+f(x_{n+1}+y_{n+1})],n=0,1,... yn+1=yn+2h[f(xn+yn)+f(xn+1+yn+1)],n=0,1,...

改进的欧拉算法

{ y ^ n + 1 = y n + h f ( x n , y n ) y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y ^ n + 1 ) ] \left\{ \begin{aligned} &\hat{y}_{n+1}=y_n+hf(x_n,y_n)\\ &y_{n+1}=y_n+\frac h 2[f(x_n,y_n)+f(x_{n+1},\hat{y}_{n+1})] \end{aligned} \right. y^n+1=yn+hf(xn,yn)yn+1=yn+2h[f(xn,yn)+f(xn+1,y^n+1)]
也可以表示成
{ y f = y n + h f ( x n , y n ) y b = y n + h f ( x n + 1 , y f ) y n + 1 = 1 2 ( x f + x b ) \left\{ \begin{aligned} &y_f=y_n+hf(x_n,y_n)\\ &y_b=y_n+hf(x_{n+1},y_f)\\ &y_{n+1}=\frac 1 2 (x_f+x_b) \end{aligned} \right. yf=yn+hf(xn,yn)yb=yn+hf(xn+1,yf)yn+1=21(xf+xb)

其中 y f y_f yf表示利用向前(显式)欧拉公式的近似值, y b y_b yb表示利用向后(隐式)欧拉公式的近似值(利用了 y f y_f yf),最后取平均值。
上面利用 f ( x n + 1 , y ^ n + 1 ) ] f(x_{n+1},\hat{y}_{n+1})] f(xn+1,y^n+1)]是有误差的,也可通过多次迭代减少误差,具体公式如下
{ y ^ n + 1 ( 0 ) = y n + h f ( x n , y n ) y n + 1 ( k + 1 ) = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y ^ n + 1 ( k ) ) ] , k = 0 , 1 , 2 , . . . \left\{ \begin{aligned} &\hat{y}_{n+1}^{(0)}=y_n+hf(x_n,y_n)\\ &y_{n+1}^{(k+1)}=y_n+\frac h 2[f(x_n,y_n)+f(x_{n+1},\hat{y}_{n+1}^{(k)})],k=0,1,2,... \end{aligned} \right. y^n+1(0)=yn+hf(xn,yn)yn+1(k+1)=yn+2h[f(xn,yn)+f(xn+1,y^n+1(k))],k=0,1,2,...

其中,后向欧拉算法和梯形公式是隐式算法,前向欧拉算法和改进的欧拉算法是显式算法。欧拉算法计算容易,但是精度低,梯形公式精度高,但是是隐式形式,不易求解。将两式结合,则可以得到改进的欧拉公式。先用欧拉公式求出yn+1的一个粗糙的估计值,再用梯形方法进行精确化,称为校正值。

四阶龙格库塔算法(Runge-kutta method)

{ k 1 = f ( x n , y n ) k 2 = f ( x n + h 2 , y n + h 2 × k 1 ) k 3 = f ( x n + h 2 , y n + h 2 × k 2 ) k 4 = f ( x n + h , y n + h × k 3 ) y n + 1 = y n + ( k 1 + 2 k 2 + 2 k 3 + k 4 ) 6 × h \left\{ \begin{aligned} &k_1=f(x_n,y_n)\\ &k_2=f(x_n+\frac h 2,y_n+\frac h 2×k_1)\\ &k_3=f(x_n+\frac h 2,y_n+\frac h 2×k_2)\\ &k_4=f(x_n+h,y_n+h×k_3)\\ &y_{n+1}=y_n+\frac {(k_1+2k_2+2k_3+k_4)} 6 ×h \end{aligned} \right. k1=f(xn,yn)k2=f(xn+2h,yn+2h×k1)k3=f(xn+2h,yn+2h×k2)k4=f(xn+h,yn+h×k3)yn+1=yn+6(k1+2k2+2k3+k4)×h
龙格-库塔算法是一种在工程上应用广泛的高精度单步算法,算法精度较高,如果预先取四个点就是四阶龙格-库塔算法。
真的!龙格库塔算法的超强解析!地址入口

四阶龙格库塔函数代码

runge_kuttx0_o4.m
代码参考的博客地址入口
总结一下代码的优点~
1、使用函数句柄,方便复用~
2、模仿了ode45的函数输入变量,和ode45用起来差不多~

function [t,y,n]=runge_kuttx0_o4(ufunc,tspan,y0,h)%参数表顺序依次是微分方程组的函数名称,时间起点终点,初始值,步长(参数形式参考了ode45函数)
if nargin<4h=0.01;
end
if size(tspan)==[1,2]t0=tspan(1);tn=tspan(2);
elseerror(message('MATLAB:runge_kuttx0_o4:WrongDimensionOfTspan'));
end
n=floor((tn-t0)/h);%求步数
t(1)=t0;%时间起点
y(:,1)=y0;%第一列赋初值,可以是向量,代表不同的初始值
for i=1:n
t(i+1)=t(i)+h;
k1=ufunc(t(i),y(:,i));
k2=ufunc(t(i)+h/2,y(:,i)+h*k1/2);
k3=ufunc(t(i)+h/2,y(:,i)+h*k2/2);
k4=ufunc(t(i)+h,y(:,i)+h*k3);
y(:,i+1)=y(:,i)+h*(k1+2*k2+2*k3+k4)/6;
%按照龙格库塔方法进行数值求解
end

test1.m

clear
clc
test_fun=@(t,y)(y+3*t)/t^2;
tspan=[1 4];
y0=-2;
h=1;
[t1,y1]=ode45(test_fun,tspan,y0);
[t2,y2]=runge_kuttx0_o4(test_fun,tspan,y0,h);
plot(t1,y1,'r',t2,y2,'g')
legend('ode45函数效果','自编四阶龙格库塔函数效果')
xlabel('t');
ylabel('y');
title('效果对比图')

test.m运行结果
在这里插入图片描述

步长选择

之前讨论的所有的龙格-库塔方法都是以 Δ t Δt Δt定步长来展开的,但从 x i ⇒ x i + 1 x_i ⇒x_{i+1} xixi+1单步递推过程来说,步长 Δ t Δt Δt越小,局部截断误差越小(方法确定情况下),但是随着步长的缩小,不但会引起计算量的增加,而且也有可能引起舍入误差的严重积累;但步长 Δ t Δt Δt太大又不能达到预期的精度要求,所以选择合适的步长 Δ t Δt Δt,在实际计算中也是比较重要的。其实有时候在实际使用中步长并不需要算法确定,而是需要根据数据帧率来确定的,比如imu数据。??
下面给出求解步长的步骤:

1、以步长 Δ t Δt Δt开始,利用龙格-库塔公式计算 x i ⇒ x i + 1 x_i ⇒x_{i+1} xixi+1得到一个近似值 x i + 1 Δ t x_{i+1}^{\Delta t} xi+1Δt
2、然后步长减半为 Δ t / 2 \Delta t /2 Δt/2,利用龙格-库塔公式分两步计算 x i ⇒ x i + 1 2 ⇒ x i + 1 x_i ⇒ x_{i + \frac1 2} ⇒ x_{i+1} xixi+21xi+1得到一个近似值 x i + 1 Δ t / 2 x_{i + 1}^{Δt/2} xi+1Δt/2
3、计算 ∣ x i + 1 Δ t / 2 − x i + 1 Δ t < ϵ ∣ ∣x_{i + 1}^{Δt/2}-x_{i + 1}^{Δt}< ϵ ∣ xi+1Δt/2xi+1Δt<ϵ是否成立,如果成立直接步长选择 Δ t Δt Δt,否则继续步长减半,重复上诉步骤直到满足精度要求。
test2.m

clear
clc
test_fun=@(t,y)(y+3*t)/t^2;
tspan=[1 15];
y0=-2;
h=1;
acc=0.0001;
[t1,y1,n1]=runge_kuttx0_o4(test_fun,tspan,y0,h);
tf=t1;yf=y1;hf=h;
h=h/2;
[t2,y2,n2]=runge_kuttx0_o4(test_fun,tspan,y0,h);
while(sum(abs(y1(2:n1+1)-y2(3:2:n2+1)))/n1>=acc)
t1=t2;y1=y2;n1=n2;
h=h/2;
[t2,y2,n2]=runge_kuttx0_o4(test_fun,tspan,y0,h);
end
plot(tf,yf,'r',t2,y2,'g')
legend(['四阶龙格库塔初始步长下的效果,h=',num2str(hf)],['四阶龙格库塔精度约为0.01的效果,h=',num2str(h*2)])
xlabel('t');
ylabel('y');
title('效果对比图')

在这里插入图片描述


http://chatgpt.dhexx.cn/article/4V55suaM.shtml

相关文章

经典四阶龙格库塔法

关注微信公众号“二进制小站”~~获取更多分析~~&#xff08;文末二维码~~&#xff09; 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,经常被称为“RK4”或者就是“龙格库塔法”。 令初值问题表述如下。 对于该问题的RK4由如下方程给出&#xff1a; 其中&…

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

文章目录 1. 算法2. 程序3. 案例4. 联系作者 1. 算法 上一篇介绍了显式欧拉法、隐式欧拉法、两步欧拉法和改进欧拉法求解常微分方程初值问题&#xff1b;其中显式欧拉法和隐式欧拉法是一阶算法精度&#xff0c;截断误差为 O ( h 2 ) O\left( {{h^2}} \right) O(h2)&#xff1b…

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

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

龙格-库塔方法学习笔记

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

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

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

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

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

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

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

龙格库塔法

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

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

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

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

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

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;意味着它没有结束标签&…