欧拉法、改进的欧拉法、龙格-库塔法求解初值问题

article/2025/8/29 22:19:26

求解初值问题

  • 简介
  • 前期准备
  • 欧拉法
  • 改进的欧拉法
  • 龙格-库塔法
    • 标准四阶显式Kutta公式
    • 三级三阶显式公式
    • 四级四阶显式Kutta公式
    • 四级四阶显式Gill公式
  • 示例
    • MATLAB代码
    • 结果

简介

通过求解简单的初值问题:
{ d u d x = f ( x , u ) ( 1 ) u ( x 0 ) = u 0 ( 2 ) \begin{cases} \dfrac{du}{dx}=f(x,u)&&&&&&(1)\\ u(x_0)=u_0&&&&&&(2) \end{cases} dxdu=f(x,u)u(x0)=u0(1)(2)
引入欧拉法、改进的欧拉法、龙格-库塔法等。

前期准备

数值解法的基本思想就是先对 x x x u ( x ) u(x) u(x)在区间 [ x 0 , ∞ ) [x_0,\infty) [x0,)上进行离散化,然后构造递推公式,再进一步得到 u ( x ) u(x) u(x)在这些位置的近似取值。

  • 取定步长 h h h,令 x n = x 0 + n h ( n = ± 1 , ± 2 , ⋯ ) x_n=x_0+nh(n=\pm1,\pm2,\cdots) xn=x0+nh(n=±1,±2,)
  • 得到离散的位置: x 1 , x 2 , ⋯ , x n , ⋯ x_1,x_2,\cdots,x_n,\cdots x1,x2,,xn,
  • u ( x ) u(x) u(x)在这些点精确取值为: u ( x 1 ) , u ( x 2 ) , ⋯ , u ( x n ) , ⋯ u(x_1),u(x_2),\cdots,u(x_n),\cdots u(x1),u(x2),,u(xn),
  • 利用数值解法得到的这些点的近似取值,记为 u 1 , u 2 , ⋯ , u n , ⋯ u_1,u_2,\cdots,u_n,\cdots u1,u2,,un,

欧拉法

欧拉法的核心就是将导数近似为差商。
将导数近似为向前差商,则有:
d u d x ∣ x = x n ≈ u ( x n + 1 ) − u ( x n ) h \left.\dfrac{du}{dx}\right|_{x=x_n} \approx \frac{u(x_{n+1})-u(x_n)}{h} dxdux=xnhu(xn+1)u(xn)
代入(1)式,有:
u ( x n + 1 ) = y ( x n ) + h f ( x n , u ( x n ) ) u(x_{n+1})=y(x_{n})+hf(x_n,u(x_n)) u(xn+1)=y(xn)+hf(xn,u(xn))
u n + 1 u_{n+1} un+1 u n u_n un代替 u ( x n + 1 ) u(x_{n+1}) u(xn+1) u ( x n ) u(x_n) u(xn),得:
u n + 1 = u n + h f ( x n , u n ) u_{n+1}=u_{n}+hf(x_n,u_n) un+1=un+hf(xn,un)
因此,若知道 u 0 u_0 u0我们就可以递归出 u 1 , u 2 , ⋯ u_1,u_2,\cdots u1,u2,
如果将导数近似为向后差商:
d u d x ∣ x = x n ≈ u ( x n ) − u ( x n − 1 ) h \left.\dfrac{du}{dx}\right|_{x=x_n} \approx \frac{u(x_{n})-u(x_{n-1})}{h} dxdux=xnhu(xn)u(xn1)
类似的,就可以得到:
u n − 1 = u n − h f ( x n , u n ) u_{n-1}=u_{n}-hf(x_n,u_n) un1=unhf(xn,un)
这样,若知道 u 0 u_0 u0我们就可以递归出 u − 1 , u − 2 , ⋯ u_{-1},u_{-2},\cdots u1,u2,

改进的欧拉法

( 1 ) (1) (1)式在 [ x n , x n + 1 ] [x_n,x_{n+1}] [xn,xn+1]上积分,可得:
u ( x n + 1 ) = u ( x n ) + ∫ x n x n + 1 f ( x , u ) d x u(x_{n+1})=u(x_{n})+\int^{x_{n+1}}_{x_n}f(x,u)dx u(xn+1)=u(xn)+xnxn+1f(x,u)dx
其中, n = 0 , 1 , ⋯ n=0,1,\cdots n=0,1,。用不同方式来近似上式的积分运算,就会得到不同的递推公式。若使用左端点计算矩形面积并取近似:
∫ x n x n + 1 f ( x , u ) d x ≈ h f ( x n + 1 , u ( x n + 1 ) ) \int^{x_{n+1}}_{x_n}f(x,u)dx\approx hf(x_{n+1},u(x_{n+1})) xnxn+1f(x,u)dxhf(xn+1,u(xn+1))
代入上式得:
u n + 1 = u n + h f ( x n , u n ) u_{n+1}=u_{n}+hf(x_{n},u_{n}) un+1=un+hf(xn,un)
若使用梯形的面积做近似:
∫ x n x n + 1 f ( x , y ) d x ≈ h 2 [ f ( x n , u ( x n ) ) + f ( x n + 1 , u ( x n + 1 ) ) ] \int^{x_{n+1}}_{x_n}f(x,y)dx\approx\frac{h}{2}[f(x_{n},u(x_{n}))+f(x_{n+1},u(x_{n+1}))] xnxn+1f(x,y)dx2h[f(xn,u(xn))+f(xn+1,u(xn+1))]
得到:
u n + 1 = u n + h 2 [ f ( x n , u n ) + f ( x n + 1 , u n + 1 ) ] u_{n+1}=u_{n}+\frac{h}{2}[f(x_{n},u_{n})+f(x_{n+1},u_{n+1})] un+1=un+2h[f(xn,un)+f(xn+1,un+1)]
欧拉法虽然精度偏低,但它是显式的,可直接得到结果。而梯形公式是隐式的,虽然精度较高,却无法通过一步计算得到结果,若用迭代法计算,运算量较大。综合这两种方法,可以相得益彰:先用显式格式却低精度的欧拉法计算得到一个粗略的预测值 u ˉ n + 1 \bar{u}_{n+1} uˉn+1,再将这个预测值代入梯形公式进行修正,得到较高精度的结果 u n + 1 u_{n+1} un+1
{ u ˉ n + 1 = u n + h f ( x n , u n ) u n + 1 = u n + h 2 [ f ( x n , u n ) + f ( x n + 1 , u ˉ n + 1 ) ] \begin{cases} \bar{u}_{n+1}=u_{n}+hf(x_{n},u_{n})\\ u_{n+1}=u_n+\dfrac{h}{2}[f(x_{n},u_{n})+f(x_{n+1},\bar{u}_{n+1})] \end{cases} uˉn+1=un+hf(xn,un)un+1=un+2h[f(xn,un)+f(xn+1,uˉn+1)]

龙格-库塔法

将以上两种方法分别写成如下形式:
{ u n + 1 = u n + h K 1 K 1 = f ( x n , u n ) \begin{cases} u_{n+1}=u_{n}+hK_1\\ K_1=f(x_{n},u_{n}) \end{cases} {un+1=un+hK1K1=f(xn,un)
{ u n + 1 = u n + h 2 ( K 1 + K 2 ) K 1 = f ( x n , u n ) K 2 = f ( x n + h , u n + K 1 ) \begin{cases} u_{n+1}=u_{n}+\dfrac{h}{2}(K_1+K_2)\\ K_1=f(x_{n},u_{n})\\ K_2=f(x_{n}+h,u_{n}+K_1) \end{cases} un+1=un+2h(K1+K2)K1=f(xn,un)K2=f(xn+h,un+K1)
上述方法都是通过 f ( x , u ) f(x,u) f(x,u)在不同位置的线性组合来计算 u n + 1 u_{n+1} un+1的值,所考虑的位置越多,精度也越高。类似的,就得到龙格-库塔法的思想:如果用 f ( x , u ) f(x,u) f(x,u)在更多位置的线性组合来构造递推公式,将会得到更高的精度。
这样,递推公式将有如下形式:
{ u n + 1 = u n + h ∑ i = 1 r R i K i K 1 = f ( x n , u n ) K i = f ( x n + a i h , u n + ∑ j = 1 i − 1 b i j K j ) , i = 2 , 3 , ⋯ , r \begin{cases} u_{n+1}=u_{n}+h\sum\limits_{i=1}^{r} R_i K_i\\ K_1=f(x_{n},u_{n})\\ K_i=f(x_{n}+a_i h,u_{n}+\sum\limits_{j=1}^{i-1} b_{ij} K_j), i=2,3,\cdots,r \end{cases} un+1=un+hi=1rRiKiK1=f(xn,un)Ki=f(xn+aih,un+j=1i1bijKj),i=2,3,,r
其中, R i , a i , b i j R_{i},a_i,b_{ij} Ri,ai,bij为待定常数。(利用 T a y l o r Taylor Taylor展开就可以确定待定系数)

标准四阶显式Kutta公式

{ y n + 1 = y n + h 6 ( K 1 + 4 K 2 + K 3 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 2 h , y n + 1 2 h K 1 ) , K 3 = f ( x n + h , y n − h K 1 + 2 h K 2 ) ; \begin{cases} y_{n+1}=y_n+\dfrac{h}{6}(K_1+4K_2+K_3),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{2}h,y_n+\frac{1}{2}h K_1),\\ K_3=f(x_n+h,y_n-h K_1+2h K_2); \end{cases} yn+1=yn+6h(K1+4K2+K3),K1=f(xn,yn),K2=f(xn+21h,yn+21hK1),K3=f(xn+h,ynhK1+2hK2);

三级三阶显式公式

{ y n + 1 = y n + h 4 ( K 1 + 3 K 3 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 3 h , y n + 1 3 h K 1 ) , K 3 = f ( x n + 2 3 h , y n + 2 3 h K 2 ) ; \begin{cases} y_{n+1}=y_n+\dfrac{h}{4}(K_1+3K_3),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{3}h,y_n+\frac{1}{3}h K_1),\\ K_3=f(x_n+\frac{2}{3}h,y_n+\frac{2}{3}h K_2); \end{cases} yn+1=yn+4h(K1+3K3),K1=f(xn,yn),K2=f(xn+31h,yn+31hK1),K3=f(xn+32h,yn+32hK2);

四级四阶显式Kutta公式

{ y n + 1 = y n + h 8 ( K 1 + 3 K 2 + 3 K 3 + K 4 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 3 h , y n + 1 3 h K 1 ) , K 3 = f ( x n + 2 3 h , y n − 2 3 h K 1 + h K 2 ) , K 4 = f ( x n + h , y n + h K 1 − h K 2 + h K 3 ) ; \begin{cases} y_{n+1}=y_n+\frac{h}{8}(K_1+3K_2+3K_3+K_4),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{3}h,y_n+\frac{1}{3}h K_1),\\ K_3=f(x_n+\frac{2}{3}h,y_n-\frac{2}{3}h K_1+h K_2),\\ K_4=f(x_n+h,y_n+h K_1-h K_2+h K_3); \end{cases} yn+1=yn+8h(K1+3K2+3K3+K4),K1=f(xn,yn),K2=f(xn+31h,yn+31hK1),K3=f(xn+32h,yn32hK1+hK2),K4=f(xn+h,yn+hK1hK2+hK3);

四级四阶显式Gill公式

{ y n + 1 = y n + h 6 ( K 1 + ( 2 − 2 ) K 2 + ( 2 + 2 ) K 3 + K 4 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 2 h , y n + 1 2 h K 1 ) , K 3 = f ( x n + 1 2 h , y n + 2 − 1 2 h K 1 + ( 1 − 2 2 ) h K 2 ) , K 4 = f ( x n + h , y n − 2 2 h K 2 + ( 1 + 2 2 ) h K 3 ) ; \begin{cases} y_{n+1}=y_n+\frac{h}{6}(K_1+(2-\sqrt{2})K_2+(2+\sqrt{2})K_3+K_4),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{2}h,y_n+\frac{1}{2}h K_1),\\ K_3=f(x_n+\frac{1}{2}h,y_n+\frac{\sqrt{2}-1}{2}h K_1+(1-\frac{\sqrt{2}}{2})h K_2),\\ K_4=f(x_n+h,y_n-\frac{\sqrt{2}}{2}h K_2+(1+\frac{\sqrt{2}}{2})h K_3); \end{cases} yn+1=yn+6h(K1+(22 )K2+(2+2 )K3+K4),K1=f(xn,yn),K2=f(xn+21h,yn+21hK1),K3=f(xn+21h,yn+22 1hK1+(122 )hK2),K4=f(xn+h,yn22 hK2+(1+22 )hK3);

示例

求解常微分方程:
{ d y d x = x 3 − y x , y ( 1 ) = 2 5 . \begin{cases} \dfrac{dy}{dx}=x^3-\dfrac{y}{x},\\ y(1)=\dfrac{2}{5}. \end{cases} dxdy=x3xy,y(1)=52.
要求步长为 h = 0.1 h=0.1 h=0.1,其中,精确解为
y = 1 5 x 4 + 1 5 x . y=\frac{1}{5}x^4+\frac{1}{5x}. y=51x4+5x1.

MATLAB代码

clear all,close all,clc
f=@(x,y)x^3-y/x;
h=0.1;
%% Euler method
x=[1:h:2];
N=size(x,2)-1;
y1=[2/5,zeros(1,N)];
for n=1:Ny1(n+1)=y1(n)+h*f(x(n),y1(n));
end
%% Improved Euler method
y2=[2/5,zeros(1,N)];
for n=1:Ny2(n+1)=y2(n)+h*f(x(n),y2(n));y2(n+1)=y2(n)+h/2*(f(x(n),y2(n))+f(x(n+1),y2(n+1)));
end
%% Standard fourth-order explicit Kutta formula
y3=[2/5,zeros(1,N)];
for n=1:NK1=f(x(n),y3(n));K2=f(x(n)+1/2*h,y3(n)+1/2*h*K1);K3=f(x(n)+h,y3(n)-h*K1+2*h*K2);y3(n+1)=y3(n)+h/6*(K1+4*K2+K3);
end
%% Three-level three-order explicit formula
y4=[2/5,zeros(1,N)];
for n=1:NK1=f(x(n),y4(n));K2=f(x(n)+1/3*h,y4(n)+1/3*h*K1);K3=f(x(n)+2/3*h,y4(n)+2/3*h*K2);y4(n+1)=y4(n)+h/4*(K1+3*K3);
end
%% Fourth-level fourth-order explicit Kutta formula
y5=[2/5,zeros(1,N)];
for n=1:NK1=f(x(n),y5(n));K2=f(x(n)+1/3*h,y5(n)+1/3*h*K1);K3=f(x(n)+2/3*h,y5(n)-1/3*h*K1+h*K2);K4=f(x(n)+h,y5(n)+h*K1-h*K2+h*K3);y5(n+1)=y5(n)+h/8*(K1+3*K2+3*K3+K4);
end
%% Fourth-level fourth-order explicit Gill formula
y6=[2/5,zeros(1,N)];
for n=1:NK1=f(x(n),y6(n));K2=f(x(n)+1/2*h,y6(n)+1/2*h*K1);K3=f(x(n)+1/2*h,y6(n)+(sqrt(2)/2-0.5)*h*K1+(1-sqrt(2)/2)*h*K2);K4=f(x(n)+h,y6(n)-sqrt(2)/2*h*K2+(1+sqrt(2)/2)*h*K3);y6(n+1)=y6(n)+h/6*(K1+(2-sqrt(2))*K2+(2+sqrt(2))*K3+K4);
end
y=1/5*x.^4+1./(5*x);  %  Exact solutionplot(x,y,'k',x,y1,'xr',x,y2,'ob','Markersize',10,'LineWidth',1.5)
axis([1 2.1 0 4.5]),xlabel x,ylabel u
legend('Exact','Euler','Improved Euler')%plot(x,y,'k',x,y3,'*r',x,y4,'+b',x,y5,'-y',x,y6,'or','Markersize',10,'LineWidth',1.5)
%axis([1 2.1 0 6]),xlabel x,ylabel u,set(gca,'Fontsize',18)
%legend('Exact','34Kutta','33kutta','44Kutta','44Gill')

结果

在这里插入图片描述


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

相关文章

6.2 龙格—库塔法

学习目标: 学习龙格-库塔法的具体明确的学习目标可以有以下几点: 理解龙格-库塔法的基本思想和原理:我们应该了解龙格-库塔法的数值求解思想和数值误差的概念,包括截断误差和稳定性等基本概念,并且要熟悉龙格-库塔法的…

四阶龙格库塔法求解一次常微分方程组(python实现)

四阶龙格库塔法求解一次常微分方程组 一、前言二、RK4求解方程组的要点1. 将方程组转化为RK4求解要求的标准形式2. 注意区分每个方程的独立性 三、python实现RK4求解一次常微分方程组1. 使用的方程组2. python代码3. 运行结果 一、前言 之前在博客发布了关于使用四阶龙格库塔方…

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

常微分方程 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…

经典四阶龙格库塔法

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

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

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

【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标签定义为一个换行符,所以应将它理解为简单的输入一个空行,而不是用来对内容进行分段。 …