本文参考书为马东升著《数值计算方法》
未知函数为一元函数的微分方程叫常微分方程,讨论一阶常微分方程的初值问题
{ y ′ = f ( x , y ) y ( x 0 ) = y 0 \begin{cases}y'=f(x,y)\\y(x_0)=y_0\end{cases} {y′=f(x,y)y(x0)=y0
过 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0) 做曲线 y ( x ) y(x) y(x) 的切线 y ′ ( x 0 ) y'(x_0) y′(x0) 与直线 x = x 1 x=x_1 x=x1 交于 P 1 ( x 1 , y 1 ) P_1(x_1,y_1) P1(x1,y1) ,用 y 1 y_1 y1 作为 y ( x ) y(x) y(x) 上的点 y ( x 1 ) y(x_1) y(x1) 的近似值。然后过 P 1 ( x 1 , y 1 ) P_1(x_1,y_1) P1(x1,y1) 作切线,这样一直继续下去
例: 求解初值问题
{ y ′ = y − 2 x y , 0 < x < 1 y ( 0 ) = 1 \begin{cases} y'=y-\dfrac {2x}y\ ,\ 0
解: 欧拉公式为
y n + 1 = y n + h ( y n − 2 x n y n ) y_{n+1}=y_n+h(y_n-\dfrac {2x_n}{y_n}) yn+1=yn+h(yn−yn2xn)
取步长为 h = 0.1 h=0.1 h=0.1 , n = 0 , 1 , ⋯ , 9 n=0,1,\cdots,9 n=0,1,⋯,9 时,有
n = 0 y 1 = y 0 + h ( y 0 − 2 x 0 y 0 ) = 1 + 0.1 ( 1 − 2 × 0 1 ) = 1.1 n = 1 y 2 = y 1 + h ( y 1 − 2 x 1 y 1 ) = 1.1 + 0.1 ( 1.1 − 2 × 0.1 1.1 ) ≈ 1.191818 ⋮ n=0\quad y_1=y_0+h(y_0-\dfrac {2x_0}y_0)=1+0.1(1-\dfrac {2\times 0}1)=1.1\\ n=1\quad y_2=y_1+h(y_1-\dfrac {2x_1}y_1)=1.1+0.1(1.1-\dfrac {2\times 0.1}{1.1})\approx 1.191818\\ \vdots n=0y1=y0+h(y0−y2x00)=1+0.1(1−12×0)=1.1n=1y2=y1+h(y1−y2x11)=1.1+0.1(1.1−1.12×0.1)≈1.191818⋮
局部截断误差和阶
设第 n n n 步是准确的, 即 y ( x n ) = y n y(x_n)=y_n y(xn)=yn ,将 y ( x n + 1 ) − y n + 1 y(x_{n+1})-y_{n+1} y(xn+1)−yn+1 定义为数值方法的局部截断误差
若局部截断误差为 O ( h p + 1 ) O(h^{p+1}) O(hp+1) , p p p 为正整数,则称数值公式为 p p p 阶公式
由于 h < 1 h<1 h<1 ,故 p p p 越大,精度越高
欧拉公式的截断误差是 O ( h 2 ) O(h^2) O(h2) ,公式是 1 阶的
隐式(后退)欧拉公式
用向后差商 1 h [ y ( x n + 1 ) − y ( x n ) ] \dfrac 1h[\ y(x_{n+1})-y(x_n)\ ] h1[ y(xn+1)−y(xn) ]
y n + 1 = y n + h f ( x n + 1 , y n + 1 ) y_{n+1}=y_n+hf(x_{n+1},y_{n+1}) yn+1=yn+hf(xn+1,yn+1)
精度与显式欧拉公式相同
y n + 1 = y n − 1 + 2 h f ( x n , y n ) y_{n+1}=y_{n-1}+2hf(x_n,y_n) yn+1=yn−1+2hf(xn,yn)
这是一种二阶方法
与梯形求积公式相对应
y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y n + 1 ) ] y_{n+1}=y_n+\dfrac h2[\ f(x_n,y_n)+f(x_{n+1},y_{n+1})\ ] yn+1=yn+2h[ f(xn,yn)+f(xn+1,yn+1) ]
局部截断误差为 O ( h 3 ) O(h^3) O(h3) ,为二阶方法
梯形公式是将欧拉公式与隐式(后退)欧拉公式的算术平均,也是隐式公式
先用欧拉公式计算出 y n + 1 y_{n+1} yn+1 作为初始值,取作预报值,带入梯形公式,得到校正值 y n + 1 y_{n+1} yn+1 ,写成预报—校正公式
{ y ‾ n + 1 = y n + h f ( x n , y n ) y n + 1 = y n + h 2 [ f ( x n , y n ) + f ( x n + 1 , y ‾ n + 1 ) ] \begin{cases} \overline y_{n+1}=y_n+hf(x_n,y_n)\\ y_{n+1}=y_n+\dfrac h2[\ f(x_n,y_n)+f(x_{n+1},\overline y_{n+1})\ ] \end{cases} ⎩⎨⎧yn+1=yn+hf(xn,yn)yn+1=yn+2h[ f(xn,yn)+f(xn+1,yn+1) ]
或者表示为下列平均化形式
{ y p = y n + h f ( x n , y n ) y c = y n + h f ( x n + 1 , y p ) y n + 1 = 1 2 ( y p + y c ) \begin{cases} y_p=y_n+hf(x_n,y_n)\\ y_c=y_n+hf(x_{n+1},y_p)\\ y_{n+1}=\dfrac 12(y_p+y_c) \end{cases} ⎩⎪⎪⎨⎪⎪⎧yp=yn+hf(xn,yn)yc=yn+hf(xn+1,yp)yn+1=21(yp+yc)
例: 用改进欧拉法解初值问题
{ y ′ = y − 2 x y y ( 0 ) = 1 \begin{cases} y'=y-\dfrac {2x}y\\ y(0)=1 \end{cases} ⎩⎨⎧y′=y−y2xy(0)=1
其中 x ∈ [ 0 , 1 ] x\in [\ 0\ ,1\ ] x∈[ 0 ,1 ]
解: 改进欧拉法为
{ y p = y n + h ( y n − 2 x n y n ) y c = y n + h ( y p − 2 x n + 1 y p ) y n + 1 = 1 2 ( y p + y c ) \begin{cases} y_p=y_n+h(y_n-\dfrac {2x_n}{y_n})\\ y_c=y_n+h(y_p-\dfrac {2x_{n+1}}{y_p})\\ y_{n+1}=\dfrac 12(y_p+y_c) \end{cases} ⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧yp=yn+h(yn−yn2xn)yc=yn+h(yp−yp2xn+1)yn+1=21(yp+yc)
取 h = 0.1 h=0.1 h=0.1 , n = 0 , 1 , ⋯ , 9 n=0,1,\cdots,9 n=0,1,⋯,9 进行计算
当 n = 0 n=0 n=0 时,
y p = y 0 + h ( y 0 − 2 x 0 y 0 ) = 1 + 0.1 ( 1 − 2 × 0 1 ) = 1.1 y c = y 0 + h ( y p − 2 x 1 y p ) = 1 + 0.1 ( 1.1 − 2 × 0.1 1.1 ) = 1.091818 y 1 = 1 2 ( y p + y c ) = 1.095909 y_p=y_0+h(y_0-\dfrac {2x_0}{y_0})=1+0.1(1-\dfrac {2\times 0}1)=1.1\\ y_c=y_0+h(y_p-\dfrac {2x_1}{y_p})=1+0.1(1.1-\dfrac {2\times 0.1}{1.1})=1.091818\\ y_1=\dfrac 12(y_p+y_c)=1.095909 yp=y0+h(y0−y02x0)=1+0.1(1−12×0)=1.1yc=y0+h(yp−yp2x1)=1+0.1(1.1−1.12×0.1)=1.091818y1=21(yp+yc)=1.095909
⋯ ⋯ \cdots\cdots ⋯⋯
用 f ( x , y ) f(x,y) f(x,y) 在几个不同点的数值加权平均代替 f ( x n + θ h , y ( x n + θ h ) ) f(x_n+\theta h,y(x_n+\theta h)) f(xn+θh,y(xn+θh)) 的值,而使截断误差的阶数尽可能高
基本形式
{ y n + 1 = y n + h [ ( 1 − λ ) k 1 + λ k 2 ] k 1 = f ( x n , y n ) k 2 = f ( x n + p h , y n + p h k 1 ) \begin{cases} y_{n+1}=y_n+h[\ (1-\lambda)k_1+\lambda k_2\ ]\\ k_1=f(x_n,y_n)\\ k_2=f(x_n+ph,y_n+phk_1) \end{cases} ⎩⎪⎨⎪⎧yn+1=yn+h[ (1−λ)k1+λk2 ]k1=f(xn,yn)k2=f(xn+ph,yn+phk1)
二阶龙格—库塔法构造条件
λ p = 1 2 \lambda p=\dfrac 12 λp=21
此为不定方程,有无穷多解。所有满足上式格式的统称为二阶龙格—库塔法
取 p = 1 , λ = 1 2 p=1,\lambda=\dfrac 12 p=1,λ=21 ,得
{ y n + 1 = y n + h [ k 1 + k 2 ] k 1 = f ( x n , y n ) k 2 = f ( x n + h , y n + h k 1 ) \begin{cases} y_{n+1}=y_n+h[\ k_1+k_2\ ]\\ k_1=f(x_n,y_n)\\ k_2=f(x_n+h,y_n+hk_1) \end{cases} ⎩⎪⎨⎪⎧yn+1=yn+h[ k1+k2 ]k1=f(xn,yn)k2=f(xn+h,yn+hk1)
这就是改进欧拉公式
取 p = 1 2 , λ = 1 p=\dfrac 12,\lambda=1 p=21,λ=1 ,得
{ y n + 1 = y n + h k 2 k 1 = f ( x n , y n ) k 2 = f ( x n + h 2 , y n + h 2 k 1 ) \begin{cases} y_{n+1}=y_n+hk_2\\ k_1=f(x_n,y_n)\\ k_2=f(x_n+\dfrac h2,y_n+\dfrac h2 k_1) \end{cases} ⎩⎪⎪⎨⎪⎪⎧yn+1=yn+hk2k1=f(xn,yn)k2=f(xn+2h,yn+2hk1)
三阶龙格—库塔法
增加一个节点加权
例: 用经典龙格—库塔法求解初值问题
{ y ′ = − y + x + 1 y ( 0 ) = 1 \begin{cases} y'=-y+x+1\\ y(0)=1 \end{cases} {y′=−y+x+1y(0)=1
的计算公式,并取步长 h = 0.2 h=0.2 h=0.2 ,计算 y ( 0.4 ) y(0.4) y(0.4) 的近似值
解: 由题得 f ( x , y ) = − y + x + 1 f(x,y)=-y+x+1 f(x,y)=−y+x+1 ,计算如下
{ y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( x n , y n ) = − y n + x n + 1 k 2 = f ( x n + h 2 , y n + h 2 k 1 ) = − y n − h 2 k 1 + x n + h 2 + 1 k 3 = f ( x n + h 2 , y n + h 2 k 2 ) = − y n − h 2 k 2 + x n + h 2 + 1 k 4 = f ( x n + h , y n + h k 3 ) = − y n − h k 3 + x n + h + 1 \begin{cases} y_{n+1}=y_n+\dfrac h6(k_1+2k_2+2k_3+k_4)\\ k_1=f(x_n,y_n)=-y_n+x_n+1\\ k_2=f(x_n+\dfrac h2,y_n+\dfrac h2k_1)=-y_n-\dfrac h2k_1+x_n+\dfrac h2+1\\ k_3=f(x_n+\dfrac h2,y_n+\dfrac h2k_2)=-y_n-\dfrac h2k_2+x_n+\dfrac h2+1\\ k_4=f(x_n+h,y_n+hk_3)=-y_n-hk_3+x_n+h+1 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧yn+1=yn+6h(k1+2k2+2k3+k4)k1=f(xn,yn)=−yn+xn+1k2=f(xn+2h,yn+2hk1)=−yn−2hk1+xn+2h+1k3=f(xn+2h,yn+2hk2)=−yn−2hk2+xn+2h+1k4=f(xn+h,yn+hk3)=−yn−hk3+xn+h+1
代入计算后得
y n + 1 = y n + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) ≈ 0.818733 y n + 0.181267 x n + 0.2 y_{n+1}=y_n+\dfrac h6(k_1+2k_2+2k_3+k_4)\approx 0.818733y_n+0.181267x_n+0.2 yn+1=yn+6h(k1+2k2+2k3+k4)≈0.818733yn+0.181267xn+0.2
由于 y ( 0 ) = y 0 = 1 y(0)=y_0=1 y(0)=y0=1 ,取 x 0 = 0 , h = 0.2 x_0=0,h=0.2 x0=0,h=0.2
故 y ( 0.2 ) ≈ y 1 = 1.018733 y(0.2)\approx y_1=1.018733 y(0.2)≈y1=1.018733 , y ( 0.4 ) ≈ y 2 = 1.070324 y(0.4)\approx y_2=1.070324 y(0.4)≈y2=1.070324
变步长龙格—库塔法
比较复杂
若某算法对于任意固定的 x = x i = x 0 + i h x=x_i=x_0+ih x=xi=x0+ih ,当 h → 0 ( i → ∞ ) h\rightarrow 0(i\rightarrow \infty) h→0(i→∞) 时有 y i → y ( x i ) y_i\rightarrow y(x_i) yi→y(xi) ,则称该算法是收敛的
例: 就初值问题 { y ′ = λ y y ( 0 ) = y 0 \begin{cases}y'=\lambda y\\y(0)=y_0\end{cases} {y′=λyy(0)=y0 考察欧拉显式格式的收敛性
解: 该问题精确解为 y ( x ) = y 0 e λ x y(x)=y_0e^{\lambda x} y(x)=y0eλx
欧拉公式为 y i + 1 = y i + h λ y i = ( 1 + λ h ) y i y_{i+1}=y_i+h\lambda y_i=(1+\lambda h)y_i yi+1=yi+hλyi=(1+λh)yi ,即 y i = ( 1 + λ h ) i y 0 y_i=(1+\lambda h)^iy_0 yi=(1+λh)iy0
对任意固定的 x = x i = i h x=x_i=ih x=xi=ih ,有
y i = y 0 ( 1 + λ h ) x i h = y 0 [ ( 1 + λ h ) 1 λ h ] λ x i → y 0 e λ x i = y ( x i ) y_i=y_0(1+\lambda h)^{\dfrac {x_i}h}=y_0[\ (1+\lambda h)^{\dfrac 1{\lambda h}}]^{\lambda x_i}\\ \rightarrow y_0e^{\lambda x_i}=y(x_i) yi=y0(1+λh)hxi=y0[ (1+λh)λh1]λxi→y0eλxi=y(xi)
故收敛
若某算法在计算过程中任一步产生的误差在以后的计算中都逐步衰减,则称该算法是绝对稳定的