Eular 方法简单易行,理论上可以通过取充分小的 h 而达到任意高的精度,但终因收敛阶数低而不实用,只有在解很不光滑的情况下使用。
Taylor 级数法
对于初值问题(1):
{u′=f(t,u),t0<t≤T,u(t0)=a,(1)
设 u(t) 为初值问题(1)的解,且在 [t0,T] 上有 q+1 阶连续导数 ,我们将 u(tm+h) 在 tm 处作 q+1 项 Taylor 展开:
u(tm+h)=u(tm)+hu′(tm)+2!h2u′′(tm)+⋯+q!hqu(q)(tm)+O(hq+1),(2)
由于 u(t) 满足微分方程,因此其各阶导数 u(j)(t) 可以通过将 f(t,u(t)) 对 t 复合求导 j−1 次复合求导 j−1 次得到,
⎩⎨⎧u′u′′u′′′=f,=dtdf=ft+fttf,=dt2d2f=ftt+2fftu+f2fuu+ftt(ft+fttf),……(3)
这里 dtjdj 表示 j 阶全导数。将(2)式中 O(hq+1) 项舍去,即得到近似格式:
{um+1u0=um+hφ(tm,um;h),=a.(4)
这里
φ(t,u(t);h)=j=1∑qj!hj−1dtj−1dj−1f(t,u(t)).(5)
上面的两条式子就称为 q 阶 Taylor 记数法,其局部截断误差就是 Taylor 展开的余项,即
Rm=(q+1)!hq+1dtq+1d1+1f(tm+θh,u(tm+θh)),0≤θ≤1.
当q=1时,Talyor 级数为 Euler 方法。
算例 2.4
例 2.4 用 Taylor 级数法求
{u′=t−u2,u(0)=0,
在 t=h 处的近似值。
解: 直接利用复合函数的链式求导法则(3)(直接套用即可),有
⎩⎨⎧u′=t−u2u′′=1−2uu′u′′′=−2[(u′)2+uu′′]u(4)=−2[3u′u′′+uu′′′]u(5)=−2[3(u′′)2+4u′u′′′+uu(4)]……
通过我们已知 u(0)=0 可以得到以下结果:
⎩⎨⎧u′=0u′′=1u′′′=0u(4)=0u(5)=−6……
代入 Taylor 级数法,可得
u(h)=2h2−20h5+160h8+…,
在上式中截取所需要的项就可以了。同样的,我们来实现一下该算法思想:
首先,我们通过上述例子可以设置步长为 h,这里面其实就包含了上一个解和下一个解的关系,类似于 Euler 法,我们同样可以提出一个显式的迭代格式有:
um+1=um+hu′(tm)+⋯+q!hqu(q)(tm)+O(hq+1),
我们设置初始条件为 u0=0,t0=0,T=1,步长跟算例 1 一致设置三种步长分别为 241,281,2101,以下是我们得到的结果,首先是不同阶在步长都是 241 情况下的图像展示:

图 1:2,5,8阶Taylor级数法在步长为 241 的结果

图 2:2,5,8阶Taylor级数法在步长为 241 的误差
为了能够看出步长对 Taylor 级数法的影响,我们还对 8 阶 Taylor 级数法使用了不同的步长分别为 241,281,2101 得到了如下图的结果:

图 3:8阶Taylor级数法在步长为 241,281,2101 的结果

图 4:8阶Taylor级数法在步长为 241,281,2101 的误差
Runge-Kutta 法
N 级 Runge-Kutta 方法只是将(4)中的增量函数取作
φ(t,u;h)=i=1∑Nciki,(6)
其中
⎩⎨⎧k1=f(t,u),ki=f(t+aih,u+hj=1∑i−1bijkj),i=2,3,…N,ai=j=1∑i−1bij.(7)
当 N=1 时,又回到了 Euler 方法。当 N>1 时,我们通过选取参数,使方法具有尽可能高的精度。具体做法是,利用二元函数的 Taylor 展开形式:
f(x+h,y+k)=i=0∑∞i!1(h∂x∂+k∂y∂)if(x,y)(8)
将(7)式中各项在 (t,u) 处展开后代入(6)式,再令其与(5)式中幂次相同的 h 项的系数相等,便得到一个关于 ai,bij,ci 的方程组就得到了具体的计算格式。
二阶方法:
取 N=2 ,利用(8)式将 k2 在 (t,u) 展开成 Taylor 级数,得到
k2==f(t+a2h,u+hb21k1)f(t,u)+[a2hft+hb21k1fu]+21[(a2h)2fu+2a2b21h2k1ftu+(b21h)2k12fuu]+O(h3)
注意到 k1=f(t,u),b21=a2, 所以
φ(t,u;h)=(c1+c2)f+c2a2hF+2c2a22h2G+O(h3)(9)
这里 F=f∗t+ff∗u,G=f∗u+2f∗tuf+f_uuf2.
另一方面,根据(3)和(5),有
φ(t,u;h)=f(t,u)+2h dt df(t,u)+6h2 dt2 d2f(t,u)+O(h3)=f+2hF+6h2(G+fuF)+O(h3)(10)
比较(9)式和(10)式中关于 h 幂次项的系数,即有方程组:
{c1+c2=1c2a2=21
从而得到一个参数的解族。比较常见的二级方法如下:
中点法:
取 c1=0,c2=1,a2=21,此时
um+1=um+hf(tm+2h,um+2hf(tm,um)),
这被称为修正的 Euler 法(或中点法)。
Runge-Kutta 二阶法:
取 c1=c2=21,a2=1,此时
um+1=um+2h[f(tm,um)+f(tm+h,um+hf(tm,um))]
Heun 二阶法:
当 c2a22=31,也即当 c1=41,c2=43,a2=32 时,即
um+1=um+4h[f(tm,um)+3f(tm+32h,um+32hf(tm,um))]
三阶方法:
取 N=3 ,可得方程组为
⎩⎨⎧c1+c2+c3=1c2a2+c3a3=21c2a22+c3a32=31c3a2b32=61
该格式对应的局部截断误差为 O(h4) ,下面是常用的两个三阶算法
Kutta 三阶方法:
⎩⎨⎧um+1=um+6h(k1+4k2+k3)k1=f(tm,um)k2=f(tm+2h,um+2hk1)k3=f(tm+h,um−hk1+2hk2)
容易看出, f(t,u) 与 u 无关时,它恰为 Simpson 公式。
Henu 三阶方法:
其导出思想与 Heun 二阶方法完全一致,形式也差不多,为
⎩⎨⎧um+1=um+4h(k1+3k3)k1=f(tm,um)k2=f(tm+3h,um+3hk1)k3=f(tm+32h,um+32hk2)
四阶方法:
类似地,当 N=4 时,含 13 个未知量,11 个方程组成的方程组,局部截断误差为 O(h5). 常用以下两种:
古典 Runge-Kutta 方法
这是最常用的,当 f(t,u) 与 u 无关的时就是 Simpson 公式。
⎩⎨⎧um+1=um+6h(k1+2k2+2k3+k4),k1=f(tm,um),k2=f(tm+2h,um+2hk1),v3=f(tm+2h,um+2hk2),k4=f(tm+h,um+hk3).
Kutta 四阶方法
它的导出思想与 Kutta 三阶方法相四个结点的 Newton-Cotes 数值积分公式(四个结点的 Newton-Cotes 数值积分公式)。
⎩⎨⎧um+1k1k2k3k4=um+8h(k1+3k2+3k3+k4)=f(tm,um)=f(tm+3h,um+3hk1)=f(tm+32h,um−3hk1+hk2)=f(tm+h,um+hk1−hk2+hk3)
算例 2.5
用 Runge-Kutta 方法求解:
⎩⎨⎧u′=u−u2t,0<t≤1,u(0)=1.
解:
我们使用上面的所有格式进行实验,首先取步长为 241 然后得到了二阶 Runge-Kutta 方法的比较如下图所示:

图 5:2阶Runge-Kutta法在步长为 241 的结果

图 6:2阶Runge-Kutta法在步长为 241 的误差
三阶 Runge-Kutta 方法的比较如下:

图 7:3阶Runge-Kutta法在步长为 241 的结果

图 8:3阶Runge-Kutta法在步长为 241 的误差
四阶 Runge-Kutta 方法的比较如下:

图 9 :4阶Runge-Kutta法在步长为 241 的结果

图 10:4阶Runge-Kutta法在步长为 241 的误差
上文中提到所有 Runge-Kutta 方法在时间步长为 241,2101 的误差结果比较

图 9:所有Runge-Kutta法在步长为 241 的误差比较

图 10:所有Runge-Kutta法在步长为 2101 的误差比较