应用数学课堂笔记——常微分方程数值解

此为应用数学第5次课。

常微分方程数值方法

差分法、有限元法、谱方法等。这里只介绍显式欧拉法。

欧拉法及其变种

问题描述:在 x [ a , b ] x \in [a,b] 求解 y y ,满足
y = f ( x , y ) , y ( x 0 ) = y 0 y'= f(x,y), y(x_0)=y_0

[ a , b ] [a,b] 等分成 N N 份,每份长度为 h h x 0 = a , x i = a + i h x_0=a, x_i=a+ih 。令 y ( x i ) y(x_i) x i x_i 处的真实值, y i y_i 为拟合值。

前向欧拉法

由泰勒展开,有
y ( x i ) = y ( x i + Δ x ) y ( x i ) Δ x + o ( Δ x ) y'(x_i) = \frac{y( x_i+\Delta x ) - y(x_i)}{\Delta x} + o(\Delta x)

近似得到,
y ( x i ) y ( x i + h ) y ( x i ) h y'(x_i) \approx \frac{y(x_i+h)-y(x_i)}{h}

因为 y ( x i ) = f ( x i , y ( x i ) ) y'(x_i) = f(x_i, y(x_i)) ,所以有
y ( x i + 1 ) y ( x i ) h f ( x i , y ( x i ) ) y(x_{i+1}) - y(x_i) \approx h f(x_i, y(x_i))

从而得到前向欧拉法,
y i + 1 = y i + h f ( x i , y i ) y_{i+1} = y_i + h f(x_i, y_i)

后向欧拉法

类似的,有
y ( x i + 1 ) y ( x i + 1 ) y ( x i ) h y'(x_{i+1}) \approx \frac{y(x_{i+1})-y(x_i)}{h}

由于 y ( x i + 1 ) = f ( x i + 1 , y i + 1 ) y'(x_{i+1}) = f(x_{i+1}, y_{i+1}) ,得到
y i + 1 = y i + h f ( x i + 1 , y i + 1 ) y_{i+1} = y_i + h f(x_{i+1}, y_{i+1})

但由于 y i + 1 y_{i+1} 不预先知道,所以需要方程解出 y i + 1 y_{i+1} ,为隐式欧拉法了。可以使用预估校正法来利用后向欧拉的思想。

预估校正法

先用前向欧拉法得到对 y i + 1 y_{i+1} 的估计 y ˉ i + 1 \bar{y}_{i+1} ,即
y ˉ i + 1 = y i + h f ( x i , y i ) \bar{y}_{i+1} = y_i + h f(x_i, y_i)

再用后向欧拉法进行校正
y i + 1 = y i + h f ( x i + 1 , y ˉ i + 1 ) y_{i+1} = y_i + h f(x_{i+1}, \bar{y}_{i+1})

梯形法

综合一下前向欧拉和后向欧拉,可以得到一个平均主义的变种:
y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y i + 1 ) ] y_{i+1} = y_i + \frac{h}{2} [ f(x_i, y_i) + f(x_{i+1}, y_{i+1}) ]

当然这仍然是一种隐式欧拉法。

在预估校正法中也可以采用类似的思想,有
y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y ˉ i + 1 ) ] y_{i+1} = y_i + \frac{h}{2} [ f(x_i, y_i) + f(x_{i+1}, \bar{y}_{i+1}) ]

2阶龙格库塔

2阶龙格库塔如下:
y i + 1 = y i + h [ 1 2 k 1 + 1 2 k 2 ] k 1 = f ( x i , y i ) k 2 = f ( x i , y i + h k 1 ) \begin{aligned} y_{i+1} &= y_i + h[\frac{1}{2} k_1 + \frac{1}{2} k_2] \\ k_1 &= f(x_i, y_i) \\ k_2 &= f(x_i, y_i + h k_1) \end{aligned}

可以看到,2阶龙格库塔和预估校正的梯形法非常类似,它们都使用了 y ˉ i + 1 \bar{y}_{i+1} 处的梯度作为估计,只不过唯一的区别在于,预估校正法将这个梯度作用在 x i + 1 x_{i+1} 处作为后向估计,而2阶龙格库塔将它作为对 x i x_i 处梯度的估计。

4阶龙格库塔

这是最常用的龙格库塔法(因为如果阶数再高,还不如对 h h 取小一点)。

y i + 1 = y i + h [ 1 6 k 1 + 1 3 k 2 + 1 3 k 3 + 1 6 k 4 ] k 1 = f ( x i , y i ) k 2 = f ( x i + h / 2 , y i + h / 2 k 1 ) k 3 = f ( x i + h / 2 , y i + h / 2 k 2 ) k 4 = f ( x i + h , y i + h k 3 ) \begin{aligned} y_{i+1} &= y_i + h [\frac{1}{6} k_1 + \frac{1}{3} k_2 + \frac{1}{3} k_3 + \frac{1}{6} k_4] \\ k_1 &= f(x_i, y_i) \\ k_2 &= f(x_i + h/2, y_i + h/2 k_1) \\ k_3 &= f(x_i + h/2, y_i + h/2 k_2) \\ k_4 &= f(x_i + h, y_i + h k_3) \end{aligned}

当然这里的系数也是可以变的,只要最终的泰勒展开能够消掉只剩高阶微量就可以了。比如上课提到的GiU公式,就是另一套系数下的龙格库塔。

n阶龙格库塔法

龙格库塔可以继续细分到很高阶,它的格式为
y n + 1 = y n + h i = 0 L λ i k i , λ i = 1 k 1 = f ( x n , y n ) k 2 = f ( x n + c 2 h , y n + c 2 h k 1 ) k 3 = f ( x n + c 3 h , y n + c 3 h ( a 31 k 1 + a 32 k 2 ) ) k i = f ( x n + c i h , y n + c i h j = 1 i 1 a i j k j ) \begin{aligned} y_{n+1} &= y_n + h \sum_{i=0}^{L} \lambda_i k_i, \sum \lambda_i = 1 \\ k_1 &= f(x_n, y_n) \\ k_2 &= f(x_n + c_2 h, y_n + c_2 h k_1) \\ k_3 &= f(x_n + c_3 h, y_n + c_3 h (a_{31} k_1 + a_{32} k_2)) \\ & \cdots \\ k_i &= f(x_n + c_i h, y_n + c_i h \sum_{j=1}^{i-1} a_{ij} k_j) \end{aligned}

但正如之前所述,太高阶意义不大,因此还是4阶最常用。

精度

定义:设 y ( x ) y(x) 是精确解,若存在最大整数 p p ,使得 y i y ( x i ) = o ( h p + 1 ) |y_i-y(x_i)| = o(h^{p+1}) ,则称该方法是 p p 阶精度的。

前向欧拉法

y ( x i + 1 ) y i + 1 = y ( x i + 1 ) y ( x i ) h f ( x i , y ( x i ) ) = y ( x i ) + h y ( x i ) + h 2 2 y ( x i ) + o ( h 3 ) y ( x i ) h y ( x i ) = h 2 2 y ( x i ) + o ( h 3 ) = o ( h 2 ) \begin{aligned} |y(x_{i+1}) - y_{i+1}| &= |y(x_{i+1}) - y(x_i) - h f(x_i, y(x_i))| \\ &= |y(x_i) + h y'(x_i) + \frac{h^2}{2} y''(x_i) + o(h^3) - y(x_i) - h y'(x_i)| \\ &= |\frac{h^2}{2} y''(x_i) + o(h^3)| = o(h^2) \end{aligned}

所以前向欧拉为一阶精度。

后向欧拉法

类似的,后向欧拉法也是一阶精度。

梯形法

y ( x i + 1 ) y i + 1 = y ( x i + 1 ) y ( x i ) h 2 [ f ( x i , y ( x i ) ) + f ( x i + 1 , y ( x i + 1 ) ] = y ( x i ) + h y ( x i ) + h 2 2 y ( x i ) + h 3 6 y ( x i ) + o ( h 4 ) y ( x i ) h 2 [ y ( x i ) + y ( x i + 1 ) ] = h y ( x i ) + h 2 2 y ( x i ) + h 3 6 y ( x i ) + o ( h 4 ) h 2 [ y ( x i ) + y ( x i ) + h y ( x i ) + h 2 2 y ( x i ) + o ( h 4 ) ] = 1 12 h 3 y ( x i ) + o ( h 4 ) = o ( h 3 ) \begin{aligned} |y(x_{i+1}) - y_{i+1}| &= |y(x_{i+1}) - y(x_i) - \frac{h}{2} [ f(x_i, y(x_i)) + f(x_{i+1}, y(x_{i+1})] | \\ &= |y(x_i) + h y'(x_i) + \frac{h^2}{2} y''(x_i) + \frac{h^3}{6} y'''(x_i) + o(h^4) - y(x_i) - \frac{h}{2} [ y'(x_i) + y'(x_{i+1}) ]| \\ &= |h y'(x_i) + \frac{h^2}{2} y''(x_i) + \frac{h^3}{6} y'''(x_i) + o(h^4) - \frac{h}{2} [ y'(x_i) + y'(x_i) + h y''(x_i) + \frac{h^2}{2} y'''(x_i) + o(h^4) ]| \\ &= |-\frac{1}{12} h^3 y'''(x_i) + o(h^4) | = o(h^3) \end{aligned}

所以梯形法为二阶精度。

龙格库塔法

按照Butcher的结果,对于阶数为 r r 的龙格库塔法,当 r = 1 , 2 , 3 , 4 r=1,2,3,4 时,精度为 r r ;当 r = 5 , 6 , 7 r=5,6,7 时,精度为 r 1 r-1 ;当 r = 8 , 9 r=8,9 时,精度为 r 2 r-2 ;之后的精度小于 r 2 r-2 。证明略。

收敛性证明

引理

如果 ξ i + 1 A ξ i + B |\xi_{i+1}| \le A|\xi_i| + B ,则 ξ i + 1 A k ξ 0 + A k 1 A 1 B |\xi_{i+1}| \le A^k |\xi_0| + \frac{A^k-1}{A-1} B A 1 A \ne 1 。( A = 1 A=1 时更简单,略)。

证明非常简单,就是一个等比数列求和。

收敛性定理

y n + 1 = y n + h ϕ ( x n , y n , h ) y_{n+1} = y_n + h \phi (x_n, y_n, h) ,如果 y y 是精确解, y i y_i 是数值解,且存在 c 0 c_0 ,使得局部截断误差
T i + 1 = y ( x i + 1 ) [ y ( x i ) + h ϕ ( x i , y ( x i ) , h ) ] c 0 h p + 1 |T_{i+1}| = | y(x_{i+1}) - [ y(x_i) + h \phi (x_i, y(x_i), h) ] | \le c_0 h^{p+1}

且存在 h 0 h_0 ,使得
max ( x , y ) D δ p ( x , y , h ) y L \max_{(x,y) \in D_{\delta}} \left| \frac{\partial p(x,y,h)}{\partial y} \right| \le L

其中
D δ = { ( x , y ) x [ a , b ] , y [ y ( x ) δ , y ( x ) + δ ] } D_{\delta} = \{ (x,y) | x \in [a,b], y \in [y(x)-\delta, y(x) + \delta] \}

则,当 h < min h 0 , ( δ / c 0 ) 1 / p h < \min{h_0, (\delta/c_0)^{1/p}} 时,有最大截断误差
E ( h ) = max { y ( x i + 1 ) y i + 1 } c h p E(h) = \max \{ y(x_{i+1}) - y_{i+1} \} \le c h^p

其中, c = c 0 L [ e L ( b a ) 1 ] c = \frac{c_0}{L} \left[ e^{L(b-a)} - 1 \right]

证明

y ( x i + 1 ) = y ( x i ) + h ϕ ( x i , y ( x i ) , h ) + T i + 1 y i + 1 = y i + h ϕ ( x i , y i , h ) y ( x i + 1 ) y i + 1 = y ( x i ) y i + h [ ϕ ( x i , y ( x i ) , h ) ϕ ( x i , y i , h ) ] + T i + 1 \begin{aligned} y(x_{i+1}) &= y(x_i) + h \phi (x_i, y(x_i), h) + T_{i+1} \\ y_{i+1} &= y_i + h \phi (x_i, y_i, h) \\ y(x_{i+1}) - y_{i+1} &= y(x_i) - y_i + h [ \phi (x_i, y(x_i), h) - \phi (x_i, y_i, h) ] + T_{i+1} \end{aligned}

数学归纳法。当 i = 0 i=0 y ( x 0 ) y 0 = 0 c h p | y(x_0) - y_0 | = 0 \le c h^p 。假设 i i 时成立, y ( x i ) y i c h p | y(x_i) - y_i| \le c h^p ,则 i + 1 i+1 时,
y ( x i + 1 ) y i + 1 y ( x i ) y i + h ϕ ( x i , y ( x i ) , h ) ϕ ( x i , y i , h ) + T i + 1 y ( x i ) y i + h ϕ y ( y ( x i ) y i ) + o [ ( y ( x i ) y i ) 3 ] + c 0 h p + 1 ( L h + 1 ) y ( x i ) y i + c 0 h p + 1 + o ( h 2 p + 1 ) \begin{aligned} | y(x_{i+1}) - y_{i+1} | & \le | y(x_i) - y_i | + h | \phi (x_i, y(x_i), h) - \phi (x_i, y_i, h) | + | T_{i+1} | \\ & \le | y(x_i) - y_i | + h \left| \frac{\partial \phi}{\partial y} (y(x_i) - y_i) + o[(y(x_i)-y_i)^3] \right| + c_0 h^{p+1} \\ & \le (L h + 1) | y(x_i) - y_i | + c_0 h^{p+1} + o(h^{2p+1}) \end{aligned}

稳定性分析

对于 y = f ( x , y ) y'=f(x,y) ,令 { y i } \{y_i\} 是数值解, { ζ i } \{\zeta_i\} 是如下问题的解:
ζ i + 1 = ζ i + h [ ϕ ( x i , ζ i , h ) + δ i + 1 ] , ζ 0 = ζ ( x 0 ) + δ 0 \zeta_{i+1} = \zeta_i + h[\phi(x_i, \zeta_i, h) + \delta_{i+1}], \\ \zeta_0 = \zeta(x_0) + \delta_0

若存在 C , ϵ 0 , h 0 C, \epsilon_0, h_0 ,使得当 ϵ ( 0 , ϵ 0 ) , h ( 0 , h 0 ) , δ i < ϵ \epsilon \in (0, \epsilon_0), h \in (0, h_0), |\delta_i| < \epsilon ,对于 i \forall i ,都有 ζ i y i < C ϵ |\zeta_i - y_i| < C \epsilon ,则称该方法是稳定的。

说人话,按照我个人的理解,收敛性证明是在看 y i y_i 能不能逼近 y ( x i ) y(x_i) ,而稳定性分析则在看我们能不能稳定地计算出 y i y_i 。我们给每次的 y i y_i 增加上一个不大于 ϵ \epsilon 的小误差,然后看这样算出来的 ζ i \zeta_i 是否和 y i y_i 之间的误差仍在常数倍误差内。

以下我们以 y = λ y y' = \lambda y ,即 y = e λ x y=e^{\lambda x} 为例。

前向欧拉法

y n + 1 = y n + h f ( x n , y n ) = y n + h λ y n = ( 1 + h λ ) y n y_{n+1} = y_n + h f(x_n, y_n) = y_n + h \lambda y_n = (1+h\lambda) y_n
ζ n + 1 = ( 1 + h λ ) ζ n \zeta_{n+1} = (1+h\lambda) \zeta_n

ϵ n = y n ζ n \epsilon_n = y_n - \zeta_n ,则
ϵ n = ( 1 + h λ ) ϵ n 1 = = ( 1 + h λ ) n ϵ 0 \epsilon_n = (1+h\lambda) \epsilon_{n-1} = \cdots = (1+h\lambda)^n \epsilon_0

1 + h λ < 1 |1+h\lambda|<1 ,则稳定;否则不稳定。将其绘制到 λ \lambda - h h 复平面上(注意这里以 λ h \lambda h 整体的复平面,而不是 x x 轴为 λ \lambda y y 轴为 h h ),为一个圆心为 ( 1 , 0 ) (-1, 0) ,半径为 1 1 的圆内部。

梯形法

y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y n + 1 ) ] = y n + h 2 [ λ y n + λ y n + 1 ] y_{n+1} = y_n + \frac{h}{2} [ f(x_n, y_n) + f(x_{n+1}, y_{n+1}) ] = y_n + \frac{h}{2} [ \lambda y_n + \lambda y_{n+1} ]

即, ( 1 λ h 2 ) y n + 1 = ( 1 + λ h 2 ) y n (1 - \frac{\lambda h}{2}) y_{n+1} = (1 + \frac{\lambda h}{2}) y_n

即,
ϵ n + 1 = 1 + λ h 2 1 λ h 2 ϵ n \epsilon_{n+1} = \left| \frac{1+\frac{\lambda h}{2}}{1-\frac{\lambda h}{2}} \right| \epsilon_n

( 1 + λ h 2 ) / ( 1 λ h 2 ) < 1 | (1+\frac{\lambda h}{2}) / (1-\frac{\lambda h}{2}) | < 1 ,则稳定;否则不稳定。将其绘制到 λ \lambda - h h 复平面上,为整个第二和第三象限。

后向欧拉法

y n + 1 = y n + h f ( x n , y n ) = y n + h λ y n + 1 y_{n+1} = y_n + h f(x_n, y_n) = y_n + h \lambda y_{n+1}

即, ϵ n + 1 = 1 1 λ h ϵ n \epsilon_{n+1} = \left| \frac{1}{1-\lambda h} \right| \epsilon_n

1 / ( 1 λ h ) < 1 | 1/(1-\lambda h) | < 1 ,则稳定;否则不稳定。将其绘制到 λ \lambda - h h 复平面上,为圆心为 ( 1 , 0 ) (1,0) ,半径为 1 1 的圆外部。

猜你喜欢

转载自blog.csdn.net/yucong96/article/details/83350259