求解初值问题

  • 简介
  • 前期准备
  • 欧拉法
  • 改进的欧拉法
  • 龙格-库塔法
    • 标准四阶显式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} dxdu​∣∣∣∣​x=xn​​≈hu(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} dxdu​∣∣∣∣​x=xn​​≈hu(xn​)−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​)
这样,若知道 u 0 u_0 u0​我们就可以递归出 u − 1 , u − 2 , ⋯ u_{-1},u_{-2},\cdots u−1​,u−2​,⋯

改进的欧拉法

对 ( 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​)+∫xn​xn+1​​f(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})) ∫xn​xn+1​​f(x,u)dx≈hf(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}))] ∫xn​xn+1​​f(x,y)dx≈2h​[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​+hK1​K1​=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=1∑r​Ri​Ki​K1​=f(xn​,un​)Ki​=f(xn​+ai​h,un​+j=1∑i−1​bij​Kj​),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​+21​h,yn​+21​hK1​),K3​=f(xn​+h,yn​−hK1​+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​+31​h,yn​+31​hK1​),K3​=f(xn​+32​h,yn​+32​hK2​);​

四级四阶显式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​+31​h,yn​+31​hK1​),K3​=f(xn​+32​h,yn​−32​hK1​+hK2​),K4​=f(xn​+h,yn​+hK1​−hK2​+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​+(2−2 ​)K2​+(2+2 ​)K3​+K4​),K1​=f(xn​,yn​),K2​=f(xn​+21​h,yn​+21​hK1​),K3​=f(xn​+21​h,yn​+22 ​−1​hK1​+(1−22 ​​)hK2​),K4​=f(xn​+h,yn​−22 ​​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​=x3−xy​,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=51​x4+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')

结果

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

  1. 蹦极模型matlab仿真,科学网—蹦极的数学建模及其龙格-库塔法求解方法 - 赵也非的博文...

    论文: 蹦极的数学建模及其龙格-库塔法求解方法 在"华东师范大学首届研究生数学建模竞赛"中,获得二等奖. 发表日期: 2007年5月 摘要: 本文通过参照题中给出的数据,对蹦极者在 ...

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

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

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

    1.软件版本 MATLAB2013b 2.算法理论 龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法.龙格库塔法的家族中的一个成员如此常用,以至于经常被称为& ...

  4. 四阶龙格库塔法的基本思想_数值常微分方程-欧拉法与龙格-库塔法

    大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华.刘播老师的<微分方程数值解法>和王仁宏老师的<数值逼近>,结合周善贵老师的<计算物理& ...

  5. python解常微分方程龙格库_数值常微分方程-欧拉法与龙格-库塔法

    大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华.刘播老师的<微分方程数值解法>和王仁宏老师的<数值逼近>,结合周善贵老师的<计算物理& ...

  6. 一阶欧拉近似matlab,MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程.doc

    MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程 姓名:樊元君 学号:2012200902 日期:2012.11.06 一.实验目的 掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题 ...

  7. 二阶龙格库塔公式推导_数值常微分方程-欧拉法与龙格-库塔法

    大三时候在跳蚤市场闲逛,从一位数学院的学长那里买了一些闲书,最近翻出来刚好有李荣华.刘播老师的<微分方程数值解法>和王仁宏老师的<数值逼近>,结合周善贵老师的<计算物理& ...

  8. 欧拉法、预估校正法(改进的欧拉法)与四阶龙格库塔法求解常微分方程的数值解C++程序

    以y'=x+y,0<x<1,y(0)=1为例,取步长h=0.1,已知精确值为y=-x-1+2e^x,用来进行精度比较 #include<stdio.h> using names ...

  9. python 拟牛顿法 求非线性方程_有限元简单科普之——改进的欧拉法

    上一篇我们提到,在土力学领域的有限元计算中,计算机每一步的计算本质都是在求解下面的方程: 即每一个步长的刚度矩阵乘以节点位移向量等于荷载向量,在一个步长内,我们假定刚度矩阵不变,用优化的牛顿法(Mod ...

最新文章

  1. tomcat启动一直报空指针错误
  2. python 定时执行 爬虫 模块_浅析python实现scrapy定时执行爬虫
  3. 缓存击穿/穿透/雪崩
  4. JAVA进阶教学之(String类的构造方法)
  5. mysql客户端 mariadb_配置MariaDB允许客户端远程连接
  6. Vue成大学核心课程
  7. PHP接口(interface)
  8. 易语言c编译,易语言命令行编译工具免费版下载_易语言命令行编译工具最新版下载_3DM软件...
  9. win10下装黑苹果双系统
  10. 全网最详细桥接老式无线路由器教程
  11. 最新触摸精灵开发教程(价值300
  12. 免费GPU汇总及选购
  13. nbiot教学实箱_基于NBIoT的一种智能环卫装置的设计与实现
  14. redis7 Cluster模式 集群
  15. mySQL中stuff,SQL 中STUFF用法
  16. 计算机类年度考核表,涉密人员年度考核表(科研军工类).doc
  17. 25、软件安全-预防账号密码泄露
  18. 今天是转行从事软件销售行业的第四十天
  19. 小程序开发探秘:『 小程序·云开发 』新功能“云调用”上手体验
  20. android加载url显示图片,如何从android imageview中的dataurl加载图像?

热门文章

  1. python编写hello程序_python第一个程序“Hello, world”
  2. 计算机二级自学考试,关于全国计算机等级考试(NCRE)与高等教育自学考试课程衔接的通知...
  3. (转)洗剑炉——一个刚离职运营商员工的心声——别了,你的电信!
  4. python培训﹣首选马哥
  5. SHEEL-远程调用执行命令模板
  6. 湖南省隆回县2011年下学期高二调研试卷语文
  7. Plug-in org.eclipse.wst.jsdt.ui was unable to load class org.eclipse.wst.jsdt.internal.ui.javaeditor
  8. 永信至诚科创板上市:市值28亿 ​奇安信曾是第三大股东
  9. 迈阿密大学计算机学科排名,迈阿密大学计算机科学(论文)专业介绍_计算机科学(论文)专业排名及就业方向和前景-小站留学...
  10. B2 - H - Historic Exhibition(二分图匹配+优化建图)