Skip to main content

高阶单步法

Eular 方法简单易行,理论上可以通过取充分小的 hh 而达到任意高的精度,但终因收敛阶数低而不实用,只有在解很不光滑的情况下使用。

Taylor 级数法

对于初值问题(1):

{u=f(t,u),t0<tT,u(t0)=a,(1)\left\{ \begin{aligned} &{u}'=f(t,u), t_0<t \le T, \\ &u(t_0)=a,\tag{1} \end{aligned} \right.

u(t)u(t) 为初值问题(1)的解,且在 [t0,T][t_0,T] 上有 q+1q+1 阶连续导数,我们将 u(tm+h)u(t_m+h)tmt_m 处作 q+1q+1 项 Taylor 展开:

u(tm+h)=u(tm)+hu(tm)+h22!u(tm)++hqq!u(q)(tm)+O(hq+1),(2)u(t_m+h) = u(t_m)+hu'(t_m)+\frac{h^2}{2!}u''(t_m) + \dots + \frac{h^q}{q!}u^{(q)}(t_m)+O(h^{q+1}), \tag{2}

由于 u(t)u(t) 满足微分方程,因此其各阶导数 u(j)(t)u^{(j)}(t) 可以通过将 f(t,u(t))f(t,u(t))tt 复合求导 j1j-1 次复合求导 j1j-1 次得到,

{u=f,u=ddtf=ft+fttf,u=d2dt2f=ftt+2fftu+f2fuu+ftt(ft+fttf),(3)\left\{ \begin{aligned} u' &= f, \\ u'' &= \frac{d}{dt}f = f_t + f_{tt}f, \\ u''' &= \frac{d^2}{dt^2}f = f_{tt} + 2ff_{tu} + f^2f_{uu} + f_{tt}(f_t + f_{tt}f),\\ & \dots \dots \tag{3} \end{aligned} \right.

这里 djdtj\frac{d^j}{dt^j} 表示 jj 阶全导数。将(2)式中 O(hq+1)O(h^{q+1}) 项舍去,即得到近似格式:

{um+1=um+hφ(tm,um;h),u0=a.(4)\left\{ \begin{aligned} u_{m+1} &= u_m+h\varphi(t_m,u_m;h),\\ u_0&=a. \tag{4} \end{aligned} \right.

这里

φ(t,u(t);h)=j=1qhj1j!dj1dtj1f(t,u(t)).(5)\varphi (t,u(t);h)=\sum^q_{j=1}\frac{h^{j-1}}{j!}\frac{d^{j-1}}{dt^{j-1}}f(t,u(t)).\tag{5}

上面的两条式子就称为 qq 阶 Taylor 记数法,其局部截断误差就是 Taylor 展开的余项,即

Rm=hq+1(q+1)!d1+1dtq+1f(tm+θh,u(tm+θh)),0θ1.R_m=\frac{h^{q+1}}{(q+1)!}\frac{d^{1+1}}{dt^{q+1}}f(t_m+\theta h,u(t_m+\theta h)),0\le\theta\le1.

q=1q=1时,Talyor 级数为 Euler 方法。

算例 2.4

例 2.4 用 Taylor 级数法求

{u=tu2,u(0)=0,\left\{ \begin{aligned} & u' = t-u^2,\\ & u(0)=0, \end{aligned} \right.

在 t=h 处的近似值。

解: 直接利用复合函数的链式求导法则(3)(直接套用即可),有

{u=tu2u=12uuu=2[(u)2+uu]u(4)=2[3uu+uu]u(5)=2[3(u)2+4uu+uu(4)]\left\{\begin{aligned} &u^{\prime}=t-u^{2} \\ &u^{\prime \prime}=1-2 u u^{\prime} \\ &u^{\prime \prime \prime}=-2\left[\left(u^{\prime}\right)^{2}+u u^{\prime \prime}\right] \\ &u^{(4)}=-2\left[3 u^{\prime} u^{\prime \prime}+u u^{\prime \prime \prime}\right] \\ &u^{(5)}=-2\left[3\left(u^{\prime \prime}\right)^{2}+4 u^{\prime} u^{\prime \prime \prime}+u u^{(4)}\right] \\ &\ldots \ldots \end{aligned}\right.

通过我们已知 u(0)=0u(0)=0 可以得到以下结果:

{u=0u=1u=0u(4)=0u(5)=6\left\{\begin{aligned} &u^{\prime}=0 \\ &u^{\prime \prime}=1 \\ &u^{\prime \prime \prime}=0 \\ &u^{(4)}=0 \\ &u^{(5)}=-6 \\ &\ldots \ldots \end{aligned}\right.

代入 Taylor 级数法,可得

u(h)=h22h520+h8160+,u(h)=\frac{h^2}{2}-\frac{h^5}{20}+\frac{h^8}{160}+\dots,

在上式中截取所需要的项就可以了。同样的,我们来实现一下该算法思想:

首先,我们通过上述例子可以设置步长为 h,这里面其实就包含了上一个解和下一个解的关系,类似于 Euler 法,我们同样可以提出一个显式的迭代格式有:

um+1=um+hu(tm)++hqq!u(q)(tm)+O(hq+1),u_{m+1} = u_{m} + hu\prime(t_m) + \dots + \frac{h^q}{q!}u^{(q)}(t_m)+O(h^{q+1}),

我们设置初始条件为 u0=0,t0=0,T=1u_0=0,t_0=0,T=1,步长跟算例 1 一致设置三种步长分别为 124,128,1210\frac{1}{2^4},\frac{1}{2^8},\frac{1}{2^{10}},以下是我们得到的结果,首先是不同阶在步长都是 124\frac{1}{2^4} 情况下的图像展示:

Euler方法示意图

图 1:2,5,8阶Taylor级数法在步长为 124\frac{1}{2^4} 的结果

Euler方法示意图

图 2:2,5,8阶Taylor级数法在步长为 124\frac{1}{2^4} 的误差

为了能够看出步长对 Taylor 级数法的影响,我们还对 8 阶 Taylor 级数法使用了不同的步长分别为 124,128,1210\frac{1}{2^4},\frac{1}{2^8},\frac{1}{2^{10}} 得到了如下图的结果:

Euler方法示意图

图 3:8阶Taylor级数法在步长为 124,128,1210\frac{1}{2^4},\frac{1}{2^8},\frac{1}{2^{10}} 的结果

Euler方法示意图

图 4:8阶Taylor级数法在步长为 124,128,1210\frac{1}{2^4},\frac{1}{2^8},\frac{1}{2^{10}} 的误差

Runge-Kutta 法

NN 级 Runge-Kutta 方法只是将(4)中的增量函数取作

φ(t,u;h)=i=1Nciki,(6)\varphi(t,u;h)=\sum^N_{i=1}c_ik_i,\tag{6}

其中

{k1=f(t,u),ki=f(t+aih,u+hj=1i1bijkj),i=2,3,N,ai=j=1i1bij.(7)\left\{\begin{aligned} &k_1=f(t,u), \\ &k_i=f(t+a_ih,u+h\sum^{i-1}_{j=1}b_{ij}k_j),i=2,3,\dots N, \\ &a_i=\sum^{i-1}_{j=1}b_{ij}. \\ \end{aligned} \tag{7} \right.

N=1N=1 时,又回到了 Euler 方法。当 N>1N>1 时,我们通过选取参数,使方法具有尽可能高的精度。具体做法是,利用二元函数的 Taylor 展开形式:

f(x+h,y+k)=i=01i!(hx+ky)if(x,y)(8)f(x+h,y+k)=\sum^{\infty}_{i=0}\frac{1}{i!}(h\frac{\partial}{\partial x}+k\frac{\partial}{\partial y})^if(x,y) \tag{8}

将(7)式中各项在 (t,u)(t,u) 处展开后代入(6)式,再令其与(5)式中幂次相同的 hh 项的系数相等,便得到一个关于 ai,bij,cia_i,b_{ij},c_i 的方程组就得到了具体的计算格式。

二阶方法:

N=2N=2 ,利用(8)式将 k2k_2(t,u)(t,u) 展开成 Taylor 级数,得到

k2=f(t+a2h,u+hb21k1)=f(t,u)+[a2hft+hb21k1fu]+12[(a2h)2fu+2a2b21h2k1ftu+(b21h)2k12fuu]+O(h3)\begin{aligned} k_{2}= & f\left(t+a_{2} h, u+h b_{21} k_{1}\right) \\ = & f(t, u)+\left[a_{2} h f_{t}+h b_{21} k_{1} f_{u}\right] +\frac{1}{2}\left[\left(a_{2} h\right)^{2} f_{u}+2 a_{2} b_{21} h^{2} k_{1} f_{t u}+\left(b_{21} h\right)^{2} k_{1}^{2} f_{u u}\right]+O\left(h^{3}\right) \end{aligned}

注意到 k1=f(t,u),b21=a2k_1=f(t,u),b_{21}=a_2, 所以

φ(t,u;h)=(c1+c2)f+c2a2hF+c2a22h22G+O(h3)(9)\varphi(t, u ; h)=\left(c_{1}+c_{2}\right) f+c_{2} a_{2} h F+\frac{c_{2} a_{2}^{2} h^{2}}{2} G+O\left(h^{3}\right) \tag{9}

这里 F=ft+ffu,G=fu+2ftuf+f_uuf2F=f*{t}+f f*{u}, G=f*{u}+2 f*{t u} f+f\_{u u} f^{2} .

另一方面,根据(3)和(5),有

φ(t,u;h)=f(t,u)+h2 d dtf(t,u)+h26 d2 dt2f(t,u)+O(h3)=f+h2F+h26(G+fuF)+O(h3)(10)\begin{aligned} \varphi(t, u ; h) & =f(t, u)+\frac{h}{2} \frac{\mathrm{~d}}{\mathrm{~d} t} f(t, u)+\frac{h^{2}}{6} \frac{\mathrm{~d}^{2}}{\mathrm{~d} t^{2}} f(t, u)+O\left(h^{3}\right) \\ & =f+\frac{h}{2} F+\frac{h^{2}}{6}\left(G+f_{u} F\right)+O\left(h^{3}\right) \tag{10} \end{aligned}

比较(9)式和(10)式中关于 h 幂次项的系数,即有方程组:

{c1+c2=1c2a2=12\left\{\begin{array}{l} c_{1}+c_{2}=1 \\ c_{2} a_{2}=\frac{1}{2} \end{array}\right.

从而得到一个参数的解族。比较常见的二级方法如下:

中点法:

c1=0,c2=1,a2=12c_1=0,c_2=1,a_2=\frac{1}{2},此时

um+1=um+hf(tm+h2,um+h2f(tm,um)),u_{m+1}=u_{m}+h f\left(t_{m}+\frac{h}{2}, u_{m}+\frac{h}{2} f\left(t_{m}, u_{m}\right)\right),

这被称为修正的 Euler 法(或中点法)

Runge-Kutta 二阶法:

c1=c2=12,a2=1c_1=c_2=\frac{1}{2},a_2=1,此时

um+1=um+h2[f(tm,um)+f(tm+h,um+hf(tm,um))]u_{m+1}=u_m+\frac{h}{2}[f(t_m,u_m)+f(t_m+h,u_m+hf(t_m,u_m))]

Heun 二阶法:

c2a22=13c_2a_2^2=\frac{1}{3},也即当 c1=14,c2=34,a2=23c_1=\frac{1}{4},c_2=\frac{3}{4},a_2=\frac{2}{3} 时,即

um+1=um+h4[f(tm,um)+3f(tm+23h,um+2h3f(tm,um))]u_{m+1}=u_m+\frac{h}{4}[f(t_m,u_m)+3f(t_m+\frac{2}{3}h,u_m+\frac{2h}{3}f(t_m,u_m))]

三阶方法:

N=3N=3 ,可得方程组为

{c1+c2+c3=1c2a2+c3a3=12c2a22+c3a32=13c3a2b32=16\left\{\begin{array}{l} c_{1}+c_{2}+c_{3}=1 \\ c_{2} a_{2}+c_{3} a_{3}=\frac{1}{2} \\ c_{2} a_{2}^{2}+c_{3} a_{3}^{2}=\frac{1}{3} \\ c_{3} a_{2} b_{32}=\frac{1}{6} \end{array}\right.

该格式对应的局部截断误差为 O(h4)O(h^4) ,下面是常用的两个三阶算法

Kutta 三阶方法:

{um+1=um+h6(k1+4k2+k3)k1=f(tm,um)k2=f(tm+h2,um+h2k1)k3=f(tm+h,umhk1+2hk2)\left\{\begin{aligned} &u_{m+1} =u_{m}+\frac{h}{6}\left(k_{1}+4 k_{2}+k_{3}\right) \\ &k_{1} =f\left(t_{m}, u_{m}\right) \\ &k_{2} =f\left(t_{m}+\frac{h}{2}, u_{m}+\frac{h}{2} k_{1}\right) \\ &k_{3} =f\left(t_{m}+h, u_{m}-h k_{1}+2 h k_{2}\right) \end{aligned}\right.

容易看出, f(t,u)f(t,u)uu 无关时,它恰为 Simpson 公式。

Henu 三阶方法:

其导出思想与 Heun 二阶方法完全一致,形式也差不多,为

{um+1=um+h4(k1+3k3)k1=f(tm,um)k2=f(tm+h3,um+h3k1)k3=f(tm+2h3,um+2h3k2)\left\{\begin{aligned} &u_{m+1} =u_{m}+\frac{h}{4}\left(k_{1}+3 k_{3}\right) \\ &k_{1} =f\left(t_{m}, u_{m}\right) \\ &k_{2} =f\left(t_{m}+\frac{h}{3}, u_{m}+\frac{h}{3} k_{1}\right) \\ &k_{3} =f\left(t_{m}+\frac{2 h}{3}, u_{m}+\frac{2 h}{3} k_{2}\right) \end{aligned}\right.

四阶方法:

类似地,当 N=4N=4 时,含 13 个未知量,11 个方程组成的方程组,局部截断误差为 O(h5)O(h^5). 常用以下两种:

古典 Runge-Kutta 方法

这是最常用的,当 f(t,u)f(t,u) 与 u 无关的时就是 Simpson 公式。

{um+1=um+h6(k1+2k2+2k3+k4),k1=f(tm,um),k2=f(tm+h2,um+h2k1),v3=f(tm+h2,um+h2k2),k4=f(tm+h,um+hk3).\left\{\begin{array}{l} &u_{m+1}=u_{m}+\frac{h}{6}\left(k_{1}+2 k_{2}+2 k_{3}+k_{4}\right), \\ &k_{1}=f\left(t_{m}, u_{m}\right), \\ &k_{2}=f\left(t_{m}+\frac{h}{2}, u_{m}+\frac{h}{2} k_{1}\right), \\ &v_{3}=f\left(t_{m}+\frac{h}{2}, u_{m}+\frac{h}{2} k_{2}\right), \\ &k_{4}=f\left(t_{m}+h, u_{m}+h k_{3}\right) . \end{array}\right.

Kutta 四阶方法

它的导出思想与 Kutta 三阶方法相四个结点的 Newton-Cotes 数值积分公式(四个结点的 Newton-Cotes 数值积分公式)。

{um+1=um+h8(k1+3k2+3k3+k4)k1=f(tm,um)k2=f(tm+h3,um+h3k1)k3=f(tm+2h3,umh3k1+hk2)k4=f(tm+h,um+hk1hk2+hk3)\left\{\begin{aligned} u_{m+1} & =u_{m}+\frac{h}{8}\left(k_{1}+3 k_{2}+3 k_{3}+k_{4}\right) \\ k_{1} & =f\left(t_{m}, u_{m}\right) \\ k_{2} & =f\left(t_{m}+\frac{h}{3}, u_{m}+\frac{h}{3} k_{1}\right) \\ k_{3} & =f\left(t_{m}+\frac{2 h}{3}, u_{m}-\frac{h}{3} k_{1}+h k_{2}\right) \\ k_{4} & =f\left(t_{m}+h, u_{m}+h k_{1}-h k_{2}+h k_{3}\right) \end{aligned}\right.

算例 2.5

用 Runge-Kutta 方法求解:

{u=u2tu,0<t1,u(0)=1.\left\{\begin{aligned} & u\prime = u - \frac{2t}{u},0<t\le1, \\ &u(0)=1. \end{aligned}\right.

解: 我们使用上面的所有格式进行实验,首先取步长为 124\frac{1}{2^4} 然后得到了二阶 Runge-Kutta 方法的比较如下图所示:

Euler方法示意图

图 5:2阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的结果

Euler方法示意图

图 6:2阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的误差

三阶 Runge-Kutta 方法的比较如下:

Euler方法示意图

图 7:3阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的结果

Euler方法示意图

图 8:3阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的误差

四阶 Runge-Kutta 方法的比较如下:

Euler方法示意图

图 9:4阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的结果

Euler方法示意图

图 10:4阶Runge-Kutta法在步长为 124\frac{1}{2^4} 的误差

上文中提到所有 Runge-Kutta 方法在时间步长为 124,1210\frac{1}{2^4},\frac{1}{2^{10}} 的误差结果比较

Euler方法示意图

图 9:所有Runge-Kutta法在步长为 124\frac{1}{2^4} 的误差比较

Euler方法示意图

图 10:所有Runge-Kutta法在步长为 1210\frac{1}{2^{10}} 的误差比较