900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 欧拉法 改进的欧拉法 龙格-库塔法求解初值问题

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

时间:2019-09-03 08:39:36

相关推荐

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

求解初值问题

简介前期准备欧拉法改进的欧拉法龙格-库塔法标准四阶显式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,clcf=@(x,y)x^3-y/x;h=0.1;%% Euler methodx=[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 methody2=[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 formulay3=[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 formulay4=[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 formulay5=[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 formulay6=[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);endy=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 ulegend('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')

结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。