计算方法(六):常微分方程初值问题的数值解法

文章目录

  • 常微分方程初值问题的数值解法
    • 欧拉(Euler)方法与改进欧拉方法
      • 欧拉方法
      • 欧拉公式的局部截断误差与精度分析
      • 改进欧拉方法
    • 龙格-库塔(Runge-Kutta)法
      • 构造原理
      • 经典龙格-库塔法
      • 步长的自动选择
    • 收敛性与稳定性
      • 收敛性
      • 稳定性
    • 一阶方程组与高阶方程的数值解法
      • 一阶方程组初值问题的数值解法
      • 高阶方程初值问题的数值解法
    • 边值问题的数值解法
      • 打靶法
      • 有限差分法

常微分方程初值问题的数值解法

本文着重讨论一阶常微分方程初值问题
{ 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
的数值解法。

初值问题简介:一阶常微方程初值问题:
{ d y d x = f ( x , y ) , x ∈ [ a , b ] y ( a ) = y 0 \begin{cases}\frac{dy}{dx}=f(x,y),x\in[a,b]\\y(a)=y_0\end{cases} {dxdy=f(x,y),x[a,b]y(a)=y0
解的存在唯一性问题:设 x 0 ∈ [ a , b ] , f ( x , y ) x_0\in[a,b],f(x,y) x0[a,b],f(x,y) x x x 连续且关于 y y y 满足利普希茨条件:存在常数 L L L,使 ∀ x ∈ [ a , b ] \forall x\in[a,b] x[a,b] 及任何实数 y 1 , y 2 y_1,y_2 y1,y2,有
∣ f ( x , y 1 ) − f ( x , y 2 ) ∣ ≤ L ∣ y 1 − y 2 ∣ |f(x,y_1)-f(x,y_2)|\leq L|y_1-y_2| f(x,y1)f(x,y2)Ly1y2
则上述初值问题在 [ a , b ] [a,b] [a,b] 上存在唯一解。

解的适定性问题:

定义:称上述初值问题对初始值 y 0 y_0 y0 和函数 f ( x , y ) f(x,y) f(x,y)适定的,如果存在常数 K > 0 , η > 0 K>0,\eta>0 K>0,η>0,对任意 0 < ε < η 0<\varepsilon<\eta 0<ε<η,当
∣ y 0 − y ~ 0 ∣ < ε ∣ f ( x , y ) − f ~ ( x , y ) ∣ < ε ∀ ( x , y ) ∈ [ x 0 , b ] × ( − ∞ , ∞ ) |y_0-\tilde y_0|<\varepsilon\\|f(x,y)-\tilde f(x,y)|<\varepsilon\\\forall(x,y)\in[x_0,b]\times(-\infin,\infin) y0y~0<εf(x,y)f~(x,y)<ε(x,y)[x0,b]×(,)
时,初值问题
{ z ′ = f ~ ( x , z ) , x 0 ≤ x ≤ b z ( x 0 ) = y ~ 0 \begin{cases}z'=\tilde f(x,z),x_0\leq x\leq b\\z(x_0)=\tilde y_0\end{cases} {z=f~(x,z),x0xbz(x0)=y~0
的解存在,且
∣ y ( x ) − z ( x ) ∣ ≤ K ε |y(x)-z(x)|\leq K\varepsilon y(x)z(x)Kε

定理:假设 f ( x , y ) f(x,y) f(x,y) [ x 0 , b ] × ( − ∞ , ∞ ) [x_0,b]\times(-\infin,\infin) [x0,b]×(,) 上对 y y y 满足利普希茨条件,则初值问题是适定的。

欧拉(Euler)方法与改进欧拉方法

欧拉方法

初值问题:
{ 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
的解 y = y ( x ) y=y(x) y=y(x) 代表通过点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的一条曲线,称为微分方程的积分曲线。积分曲线上每一点 ( x , y ) (x,y) (x,y) 的切线的斜率 y ′ ( x ) y'(x) y(x) 等于函数 f ( x , y ) f(x,y) f(x,y) 在这点的值。

几何意义:欧拉法是过点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 作曲线的切线与 x 1 x_1 x1 交于点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),用 y 1 y_1 y1 作为曲线 y ( x ) y(x) y(x) 上的点 ( x 1 , y ( x 1 ) ) (x_1,y(x_1)) (x1,y(x1)) 的纵坐标 y ( x 1 ) y(x_1) y(x1) 的近似值。

( x 0 , y 0 ) (x_0,y_0) (x0,y0) f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0) 为斜率的切线方程:
y − y 0 = f ( x 0 , y 0 ) ( x − x 0 ) y-y_0=f(x_0,y_0)(x-x_0) yy0=f(x0,y0)(xx0)
x = x 1 x=x_1 x=x1 时,得
y 1 = y 0 + f ( x 0 , y 0 ) ( x 1 − x 0 ) y_1=y_0+f(x_0,y_0)(x_1-x_0) y1=y0+f(x0,y0)(x1x0)
y 1 y_1 y1 作为解 y ( x 1 ) y(x_1) y(x1) 的近似值,之后再过点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) f ( x 1 , y 1 ) f(x_1,y_1) f(x1,y1) 为斜率作直线
y − y 1 = f ( x 1 , y 1 ) ( x − x 1 ) y-y_1=f(x_1,y_1)(x-x_1) yy1=f(x1,y1)(xx1)
以此类推,一般地,已求得点 ( x i , y i ) (x_i,y_i) (xi,yi),以 f ( x i , y i ) f(x_i,y_i) f(xi,yi) 为斜率作直线
y − y i = f ( x i , y i ) ( x − x i ) y-y_i=f(x_i,y_i)(x-x_i) yyi=f(xi,yi)(xxi)
x = x i + 1 x=x_{i+1} x=xi+1 时,得
y i + 1 = y i + f ( x i , y i ) ( x i + 1 − x i ) y_{i+1}=y_i+f(x_i,y_i)(x_{i+1}-x_i) yi+1=yi+f(xi,yi)(xi+1xi)
y ( x i + 1 ) ≈ y i + 1 y(x_{i+1})\approx y_{i+1} y(xi+1)yi+1,这样就可算出一系列数值解 y 1 , y 2 , ⋯   , y n y_1,y_2,\cdots,y_n y1,y2,,yn

通常取 x i + 1 − x i = h i = h x_{i+1}-x_i=h_i=h xi+1xi=hi=h,则计算格式为:
{ y i + 1 = y i + h f ( x i , y i ) x i = x 0 + i h , i = 0 , 1 , 2 , ⋯ \begin{cases}y_{i+1}=y_i+hf(x_i,y_i)\\x_i=x_0+ih,i=0,1,2,\cdots\end{cases} {yi+1=yi+hf(xi,yi)xi=x0+ih,i=0,1,2,
数值微分和数值积分等的角度:在 x i x_i xi 点微分方程:
y ′ ( x i ) = f ( x i , y ( x i ) ) y'(x_i)=f(x_i,y(x_i)) y(xi)=f(xi,y(xi))
用差商 y ( x i + 1 ) − y ( x i ) h \frac{y(x_{i+1})-y(x_i)}{h} hy(xi+1)y(xi) 代替其中的导数项 y ′ ( x i ) y'(x_i) y(xi),即
y ′ ( x i ) ≈ y ( x i + 1 ) − y ( x i ) h y ( x i + 1 ) ≈ y ( x i ) + h y ′ ( x i ) = y ( x i ) + h f ( x i , y ( x i ) ) y'(x_i)\approx\frac{y(x_{i+1})-y(x_i)}{h}\\y(x_{i+1})\approx y(x_i)+hy'(x_i)=y(x_i)+hf(x_i,y(x_i)) y(xi)hy(xi+1)y(xi)y(xi+1)y(xi)+hy(xi)=y(xi)+hf(xi,y(xi))
y = y ( x i ) y=y(x_i) y=y(xi) 的近似值 y i y_i yi 代入上式右端,记所得结果为 y i + 1 y_{i+1} yi+1,就有:
y i + 1 = y i + h f ( x i , y i ) , i = 0 , 1 , ⋯   , n − 1 y_{i+1}=y_i+hf(x_i,y_i),i=0,1,\cdots,n-1 yi+1=yi+hf(xi,yi),i=0,1,,n1
上述也称显式欧拉公式向前欧拉公式

若将方程 y ′ = f ( x , y ) y'=f(x,y) y=f(x,y) 的两端从 x n x_n xn x n + 1 x_{n+1} xn+1 求积分
∫ x n x n + 1 y ′ d x = ∫ x n x n + 1 f ( x , y ( x ) ) d x y ( x n + 1 ) = y ( x n ) + ∫ x n x n + 1 f ( x , y ( x ) ) d x \int_{x_n}^{x_{n+1}}y'dx=\int_{x_n}^{x_{n+1}}f(x,y(x))dx\\y(x_{n+1})=y(x_n)+\int_{x_n}^{x_{n+1}}f(x,y(x))dx xnxn+1ydx=xnxn+1f(x,y(x))dxy(xn+1)=y(xn)+xnxn+1f(x,y(x))dx
用左矩形计算积分项: ∫ x n x n + 1 f ( x , y ( x ) ) d x ≈ h f ( x n , y ( x n ) ) \int_{x_n}^{x_{n+1}}f(x,y(x))dx\approx hf(x_n,y(x_n)) xnxn+1f(x,y(x))dxhf(xn,y(xn)),代入上式得
y ( x n + 1 ) ≈ y ( x n ) + h f ( x n , y ( x n ) ) y(x_{n+1})\approx y(x_n)+hf(x_n,y(x_n)) y(xn+1)y(xn)+hf(xn,y(xn))
泰勒展开:对 y ( x n + 1 ) y(x_{n+1}) y(xn+1) x n x_n xn 处按二阶泰勒展开有
y ( x n + 1 ) = y ( x n + h ) = y ( x n ) + h y ′ ( x n ) + 1 2 ! h 2 y ′ ′ ( ε n ) , x n ≤ ε n ≤ x n + 1 y ( x n + 1 ) ≈ y ( x n ) + h y ′ ( x n ) = y ( x n ) + h f ( x n , y ( x n ) ) y(x_{n+1})=y(x_n+h)=y(x_n)+hy'(x_n)+\frac{1}{2!}h^2y''(\varepsilon_n),x_n\leq\varepsilon_n\leq x_{n+1}\\y(x_{n+1})\approx y(x_n)+hy'(x_n)=y(x_n)+hf(x_n,y(x_n)) y(xn+1)=y(xn+h)=y(xn)+hy(xn)+2!1h2y(εn),xnεnxn+1y(xn+1)y(xn)+hy(xn)=y(xn)+hf(xn,y(xn))
用近似值 y n y_n yn 代替 y ( x n ) y(x_n) y(xn),有
y n + 1 = y n + h f ( x n , y n ) y_{n+1}=y_n+hf(x_n,y_n) yn+1=yn+hf(xn,yn)

欧拉公式的局部截断误差与精度分析

定义1:在 y i y_i yi 准确的前提下,即 y j = y ( x j ) ( j ≤ i ) y_j=y(x_j)(j\leq i) yj=y(xj)(ji) 时,用数值方法计算 y i + 1 y_{i+1} yi+1 误差
R i + 1 = y ( x i + 1 ) − y i + 1 R_{i+1}=y(x_{i+1})-y_{i+1} Ri+1=y(xi+1)yi+1
称为该数值方法计算 y i + 1 y_{i+1} yi+1 时的局部截断误差

定义2:若一个数值方法的局部截断误差为 O ( h p + 1 ) O(h^{p+1}) O(hp+1),则称这种数值方法的阶数 p p p。显然,步长 h ( < 1 ) h(<1) h(<1) 越小, p p p 值越高,则局部截断误差越小,计算精度越高。

欧拉法的局部截断误差:假定 y i = y ( x i ) y_i=y(x_i) yi=y(xi),则有
y i + 1 = y ( x i ) + h f ( x i , y ( x i ) ) = y ( x i ) + h y ′ ( x i ) y_{i+1}=y(x_i)+hf(x_i,y(x_i))=y(x_i)+hy'(x_i) yi+1=y(xi)+hf(xi,y(xi))=y(xi)+hy(xi)
二阶泰勒公式:
y ( x i + 1 ) = y ( x i + h ) = y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( ζ i ) , x i < ζ i < x i + 1 R i + 1 = y ( x i + 1 ) − y i + 1 = h 2 2 y ′ ′ ( ζ i ) y(x_{i+1})=y(x_i+h)=y(x_i)+hy'(x_i)+\frac{h^2}{2}y''(\zeta_i),x_i<\zeta_iy(xi+1)=y(xi+h)=y(xi)+hy(xi)+2h2y(ζi),xi<ζi<xi+1Ri+1=y(xi+1)yi+1=2h2y(ζi)
如果 y ( x ) y(x) y(x) 有三阶导数,则:
R i + 1 = y ( x i + 1 ) − y i + 1 = h 2 2 y ′ ′ ( x i ) + h 3 6 y ′ ′ ′ ( ζ i ) R_{i+1}=y(x_{i+1})-y_{i+1}=\frac{h^2}{2}y''(x_i)+\frac{h^3}{6}y'''(\zeta_i) Ri+1=y(xi+1)yi+1=2h2y(xi)+6h3y(ζi)
欧拉法的局部截断误差为 O ( h 2 ) O(h^2) O(h2),欧拉方法为一阶方法

改进欧拉方法

设改用向后差商 1 h ( y ( x i + 1 ) − y ( x i ) ) \frac{1}{h}(y(x_{i+1})-y(x_i)) h1(y(xi+1)y(xi)) 替代方程 y ′ ( x i + 1 ) = f ( x i + 1 , y ( x i + 1 ) ) y'(x_{i+1})=f(x_{i+1},y(x_{i+1})) y(xi+1)=f(xi+1,y(xi+1)) 中的导数项 y ′ ( x i + 1 ) y'(x_{i+1}) y(xi+1),再离散化,可得:
y i + 1 = y i + h f ( x i + 1 , y i + 1 ) y_{i+1}=y_i+hf(x_{i+1},y_{i+1}) yi+1=yi+hf(xi+1,yi+1)
称为向后欧拉公式(又称隐式欧拉公式)。

向后欧拉公式的显式化(迭代):
y i + 1 ( k + 1 ) = y i + h f ( x i + 1 , y i + 1 ( k ) ) , k = 0 , 1 , 2 , ⋯ y_{i+1}^{(k+1)}=y_i+hf(x_{i+1},y_{i+1}^{(k)}),k=0,1,2,\cdots yi+1(k+1)=yi+hf(xi+1,yi+1(k)),k=0,1,2,
隐式欧拉公式的局部截断误差:
R i + 1 = − h 2 2 y ′ ′ ( x i ) + O ( h 3 ) R_{i+1}=-\frac{h^2}{2}y''(x_i)+O(h^3) Ri+1=2h2y(xi)+O(h3)
两步欧拉格式:为了改善精度,改用中心差商 1 2 h ( y ( x i + 1 ) − y ( x i − 1 ) ) \frac{1}{2h}(y(x_{i+1})-y(x_{i-1})) 2h1(y(xi+1)y(xi1)) 替代方程 y ′ ( x i ) = f ( x i , y ( x i ) ) y'(x_i)=f(x_i,y(x_i)) y(xi)=f(xi,y(xi)) 中的导数项,并取离散化得:
y i + 1 = y i − 1 + 2 h f ( x i , y i ) y_{i+1}=y_{i-1}+2hf(x_i,y_i) yi+1=yi1+2hf(xi,yi)
y i = y ( x i ) , y i − 1 = y ( x i − 1 ) y_i=y(x_i),y_{i-1}=y(x_{i-1}) yi=y(xi),yi1=y(xi1),前两步准确,则对两步欧拉格式,有
y i + 1 = y ( x i − 1 ) + 2 h f ( x i , y ( x i ) ) y_{i+1}=y(x_{i-1})+2hf(x_i,y(x_i)) yi+1=y(xi1)+2hf(xi,y(xi))
y ( x i + 1 ) y(x_{i+1}) y(xi+1) 泰勒展开:
y ( x i + 1 ) = y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( x i ) + h 3 6 y ′ ′ ′ ( ζ i ) y ( x i − 1 ) = y ( x i ) − h y ′ ( x i ) + h 2 2 y ′ ′ ( x i ) − h 3 6 y ′ ′ ′ ( ζ i ) y ( x i + 1 ) − y ( x i − 1 ) = 2 h y ′ ( x i ) + h 3 3 y ′ ′ ′ ( ζ i ) , x i − 1 < ζ i < x i + 1 y(x_{i+1})=y(x_i)+hy'(x_i)+\frac{h^2}{2}y''(x_i)+\frac{h^3}{6}y'''(\zeta_i)\\y(x_{i-1})=y(x_i)-hy'(x_i)+\frac{h^2}{2}y''(x_i)-\frac{h^3}{6}y'''(\zeta_i)\\y(x_{i+1})-y(x_{i-1})=2hy'(x_i)+\frac{h^3}{3}y'''(\zeta_i),x_{i-1}<\zeta_iy(xi+1)=y(xi)+hy(xi)+2h2y(xi)+6h3y(ζi)y(xi1)=y(xi)hy(xi)+2h2y(xi)6h3y(ζi)y(xi+1)y(xi1)=2hy(xi)+3h3y(ζi),xi1<ζi<xi+1
所以有
R i + 1 = y ( x i + 1 ) − y i + 1 = h 3 3 y ′ ′ ′ ( ζ i ) = O ( h 3 ) R_{i+1}=y(x_{i+1})-y_{i+1}=\frac{h^3}{3}y'''(\zeta_i)=O(h^3) Ri+1=y(xi+1)yi+1=3h3y(ζi)=O(h3)
所以这是一种二阶方法

梯形公式和改进的欧拉方法:将方程 y ′ = f ( x , y ) y'=f(x,y) y=f(x,y) 的两端从 x i , x i + 1 x_i,x_{i+1} xi,xi+1,求积分得
y ( x i + 1 ) = y ( x i ) + ∫ x i x i + 1 f ( x , y ( x ) ) d x y(x_{i+1})=y(x_i)+\int_{x_i}^{x_{i+1}}f(x,y(x))dx y(xi+1)=y(xi)+xixi+1f(x,y(x))dx
用梯形方法代替矩形方法:
∫ x i x i + 1 f ( x , y ( x ) ) d x ≈ h 2 [ f ( x i , y ( x i ) ) + f ( x i + 1 , y ( x i + 1 ) ) ] \int_{x_i}^{x_{i+1}}f(x,y(x))dx\approx\frac{h}{2}[f(x_i,y(x_i))+f(x_{i+1},y(x_{i+1}))] xixi+1f(x,y(x))dx2h[f(xi,y(xi))+f(xi+1,y(xi+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})] yi+1=yi+2h[f(xi,yi)+f(xi+1,yi+1)]
梯形公式显式化
{ y i + 1 ( 0 ) = y i + h f ( x i , y i ) y i + 1 ( k + 1 ) = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y i + 1 ( k ) ) ] , k = 0 , 1 , 2 , ⋯ \begin{cases}y_{i+1}^{(0)}=y_i+hf(x_i,y_i)\\y_{i+1}^{(k+1)}=y_i+\frac{h}{2}[f(x_i,y_i)+f(x_{i+1},y_{i+1}^{(k)})],k=0,1,2,\cdots\end{cases} {yi+1(0)=yi+hf(xi,yi)yi+1(k+1)=yi+2h[f(xi,yi)+f(xi+1,yi+1(k))],k=0,1,2,
∣ y i + 1 ( k + 1 ) − y i + 1 ( k ) ∣ ≤ ε |y_{i+1}^{(k+1)}-y_{i+1}^{(k)}|\leq\varepsilon yi+1(k+1)yi+1(k)ε 控制迭代次数,其中 ε \varepsilon ε 为允许误差,把满足误差要求的 y i + 1 ( k + 1 ) y_{i+1}^{(k+1)} yi+1(k+1) 作为 y ( x i + 1 ) y(x_{i+1}) y(xi+1) 的近似值 y i + 1 y_{i+1} yi+1

在实用上,当 h h h 取值较小,先用欧拉格式得一个初步近似值 y i + 1 ( 0 ) y_{i+1}^{(0)} yi+1(0),称之为预估值,预估值的精度不高,用它替代梯形法右端的 y i + 1 y_{i+1} yi+1,再直接计算出 y i + 1 y_{i+1} yi+1,并称之为校正值,得到改进的欧拉方法(预估—校正公式)
{ 预 估 : y i + 1 ( 0 ) = y i + h f ( x i , y i ) 校 正 : y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y i + 1 ( 0 ) ) ] \begin{cases}预估:y_{i+1}^{(0)}=y_i+hf(x_i,y_i)\\校正:y_{i+1}=y_i+\frac{h}{2}[f(x_i,y_i)+f(x_{i+1},y_{i+1}^{(0)})]\end{cases} {yi+1(0)=yi+hf(xi,yi)yi+1=yi+2h[f(xi,yi)+f(xi+1,yi+1(0))]
上式可以表示为嵌套形式
y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y i + h f ( x i , y i ) ) ] y_{i+1}=y_i+\frac{h}{2}[f(x_i,y_i)+f(x_{i+1},y_i+hf(x_i,y_i))] yi+1=yi+2h[f(xi,yi)+f(xi+1,yi+hf(xi,yi))]
或者表示成下列平均化形式
{ y p = y i + h f ( x i , y i ) y c = y i + h f ( x i + 1 , y p ) y i + 1 = 1 2 ( y p + y c ) \begin{cases}y_p=y_i+hf(x_i,y_i)\\y_c=y_i+hf(x_{i+1},y_p)\\y_{i+1}=\frac{1}{2}(y_p+y_c)\end{cases} yp=yi+hf(xi,yi)yc=yi+hf(xi+1,yp)yi+1=21(yp+yc)
改进的欧拉方法是二阶方法。

龙格-库塔(Runge-Kutta)法

构造原理

y i = y ( x i ) y_i=y(x_i) yi=y(xi),将 y ( x i + 1 ) y(x_{i+1}) y(xi+1) x i x_i xi 处展开:
y ( x i + 1 ) = y ( x i + h ) = y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( x i ) + h 3 3 ! y ′ ′ ′ ( x i ) + . . . y(x_{i+1})=y(x_i+h)=y(x_i)+hy'(x_i)+\frac{h^2}{2}y''(x_i)+\frac{h^3}{3!}y'''(x_i)+... y(xi+1)=y(xi+h)=y(xi)+hy(xi)+2h2y(xi)+3!h3y(xi)+...
取上式前两项就是局部截断误差为 O ( h 2 ) O(h^2) O(h2) 的欧拉格式

取前三项,可得局部截断误差为 O ( h 3 ) O(h^3) O(h3) 的公式:
y ( x i + 1 ) ≈ y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( x i ) = y ( x i ) + h f ( x i , y ( x i ) ) + h 2 2 [ f x ( x i , y ( x i ) ) + f ( x i , y ( x i ) ) ⋅ f y ( x i , y ( x i ) ) ] y(x_{i+1})\approx y(x_i)+hy'(x_i)+\frac{h^2}{2}y''(x_i)\\=y(x_i)+hf(x_i,y(x_i))+\frac{h^2}{2}[f_x(x_i,y(x_i))+f(x_i,y(x_i))·f_y(x_i,y(x_i))] y(xi+1)y(xi)+hy(xi)+2h2y(xi)=y(xi)+hf(xi,y(xi))+2h2[fx(xi,y(xi))+f(xi,y(xi))fy(xi,y(xi))]
可以构造:
y i + 1 = y i + h f ( x i , y i ) + h 2 2 [ f x ( x i , y i ) + f ( x i , y i ) f y ( x i , y i ) ] y_{i+1}=y_i+hf(x_i,y_i)+\frac{h^2}{2}[f_x(x_i,y_i)+f(x_i,y_i)f_y(x_i,y_i)] yi+1=yi+hf(xi,yi)+2h2[fx(xi,yi)+f(xi,yi)fy(xi,yi)]
类似的,若取前 p + 1 p+1 p+1 项,可得到局部截断误差为 O ( h p + 1 ) O(h^{p+1}) O(hp+1) 的数值计算公式。

基本思路:用复合函数的计算来代替各阶偏导数,通过不同点的函数值组合间接使用泰勒展开来达到高阶局部截断误差的目的。

m m m 为一个正整数,称方程:
{ y i + 1 = y i + h ( a 1 K 1 + a 2 K 2 + ⋯ + a m K m ) K 1 = f ( x i , y i ) K 2 = f ( x i + λ 2 h , y i + μ 2 h K 1 ) ⋯ ⋯ K m = f ( x i + λ m h , y i + μ m h K m − 1 ) \begin{cases}y_{i+1}=y_i+h(a_1K_1+a_2K_2+\cdots+a_mK_m)\\K_1=f(x_i,y_i)\\K_2=f(x_i+\lambda_2h,y_i+\mu_2hK_1)\\\cdots\cdots\\K_m=f(x_i+\lambda_mh,y_i+\mu_mhK_{m-1})\end{cases} yi+1=yi+h(a1K1+a2K2++amKm)K1=f(xi,yi)K2=f(xi+λ2h,yi+μ2hK1)Km=f(xi+λmh,yi+μmhKm1)
m m m 级龙格-库塔法,其中 0 ≤ λ j ≤ 1 , a j , μ j 0\leq\lambda_j\leq1,a_j,\mu_j 0λj1,aj,μj 是待定常数,由局部截断误差阶等来确定。

基本选取原则 y n + 1 y_{n+1} yn+1 的展开表达式:
y i + 1 = y i + a 1 h + 1 2 ! a 2 h 2 + 1 3 ! a 3 h 3 + ⋯ y_{i+1}=y_i+a_1h+\frac{1}{2!}a_2h^2+\frac{1}{3!}a_3h^3+\cdots yi+1=yi+a1h+2!1a2h2+3!1a3h3+
y ( x i + 1 ) y(x_{i+1}) y(xi+1) ( x i , y i ) (x_i,y_i) (xi,yi) 处的泰勒展开式:
y ( x i + 1 ) = y ( x i ) + h y ′ ( x i ) + h 2 2 ! y ′ ′ ( x i ) + h 3 3 ! y ′ ′ ′ ( x i ) + ⋯ y(x_{i+1})=y(x_i)+hy'(x_i)+\frac{h^2}{2!}y''(x_i)+\frac{h^3}{3!}y'''(x_i)+\cdots y(xi+1)=y(xi)+hy(xi)+2!h2y(xi)+3!h3y(xi)+
上述两式要有尽可能多的项重合,以减小局部截断误差。

m = 2 m=2 m=2 为例:
{ y i + 1 = y i + h ( a 1 K 1 + a 2 K 2 ) K 1 = f ( x i , y i ) K 2 = f ( x i + λ 2 h , y i + μ 2 h K 1 ) \begin{cases}y_{i+1}=y_i+h(a_1K_1+a_2K_2)\\K_1=f(x_i,y_i)\\K_2=f(x_i+\lambda_2h,y_i+\mu_2hK_1)\end{cases} yi+1=yi+h(a1K1+a2K2)K1=f(xi,yi)K2=f(xi+λ2h,yi+μ2hK1)
K 2 K_2 K2 ( x i , y i ) (x_i,y_i) (xi,yi) 处泰勒展开,且 y i = y ( x i ) y_i=y(x_i) yi=y(xi),有:
y i + 1 = y i + h ( a 1 K 1 + a 2 K 2 ) = y i + a 1 h f ( x i , y i ) + a 2 h f ( x i + λ 2 h , y i + μ 2 h K 1 ) = y i + a 1 h f ( x i , y i ) + a 2 h [ f ( x i , y i ) + λ 2 h f x ( x i , y i ) + μ 2 h K 1 f y ( x i , y i ) + O ( h 2 ) ] = y i + ( a 1 + a 2 ) f ( x i , y i ) h + a 2 [ λ 2 f x ( x i , y i ) + μ 2 f ( x i , y i ) f y ( x i , y i ) ] h 2 + O ( h 3 ) y_{i+1}=y_i+h(a_1K_1+a_2K_2)\\=y_i+a_1hf(x_i,y_i)+a_2hf(x_i+\lambda_2h,y_i+\mu_2hK_1)\\=y_i+a_1hf(x_i,y_i)+a_2h[f(x_i,y_i)+\lambda_2hf_x(x_i,y_i)+\mu_2hK_1f_y(x_i,y_i)+O(h^2)]\\=y_i+(a_1+a_2)f(x_i,y_i)h+a_2[\lambda_2f_x(x_i,y_i)+\mu_2f(x_i,y_i)f_y(x_i,y_i)]h^2+O(h^3) yi+1=yi+h(a1K1+a2K2)=yi+a1hf(xi,yi)+a2hf(xi+λ2h,yi+μ2hK1)=yi+a1hf(xi,yi)+a2h[f(xi,yi)+λ2hfx(xi,yi)+μ2hK1fy(xi,yi)+O(h2)]=yi+(a1+a2)f(xi,yi)h+a2[λ2fx(xi,yi)+μ2f(xi,yi)fy(xi,yi)]h2+O(h3)
又:
y ( x i + 1 ) = y ( x i + h ) = y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( x i ) + O ( h 3 ) = y i + f ( x i , y i ) h + 1 2 [ f x ( x i , y i ) + f ( x i , y i ) f y ( x i , y i ) ] h 2 + O ( h 3 ) y(x_{i+1})=y(x_i+h)=y(x_i)+hy'(x_i)+\frac{h^2}{2}y''(x_i)+O(h^3)\\=y_i+f(x_i,y_i)h+\frac{1}{2}[f_x(x_i,y_i)+f(x_i,y_i)f_y(x_i,y_i)]h^2+O(h^3) y(xi+1)=y(xi+h)=y(xi)+hy(xi)+2h2y(xi)+O(h3)=yi+f(xi,yi)h+21[fx(xi,yi)+f(xi,yi)fy(xi,yi)]h2+O(h3)
比较 y i + 1 、 y ( x i + 1 ) y_{i+1}、y(x_{i+1}) yi+1y(xi+1) 的表达式,选取:
{ a 1 + a 2 = 1 a 2 λ 2 = 1 2 a 2 μ 2 = 1 2 \begin{cases}a_1+a_2=1\\a_2\lambda_2=\dfrac{1}{2}\\a_2\mu_2=\dfrac{1}{2}\end{cases} a1+a2=1a2λ2=21a2μ2=21
得到一族二阶龙格-库塔法

a 1 = 0 , a 2 = 1 , λ 2 = μ 2 = 1 2 a_1=0,a_2=1,\lambda_2=\mu_2=\dfrac{1}{2} a1=0,a2=1,λ2=μ2=21,得到中点公式
y i + 1 = y i + h f ( x i + 1 2 h , y i + h 2 f ( x i , y i ) ) y_{i+1}=y_i+hf(x_i+\dfrac{1}{2}h,y_i+\dfrac{h}{2}f(x_i,y_i)) yi+1=yi+hf(xi+21h,yi+2hf(xi,yi))
a 1 = 1 4 , a 2 = 3 4 , λ 2 = μ 2 = 2 3 a_1=\dfrac{1}{4},a_2=\dfrac{3}{4},\lambda_2=\mu_2=\dfrac{2}{3} a1=41,a2=43,λ2=μ2=32,得到休恩公式
y i + 1 = y i + 1 4 h [ f ( x i , y i ) + 3 f ( x i + 2 3 h , y i + 2 3 h f ( x i , y i ) ) ] y_{i+1}=y_i+\frac{1}{4}h[f(x_i,y_i)+3f(x_i+\frac{2}{3}h,y_i+\frac{2}{3}hf(x_i,y_i))] yi+1=yi+41h[f(xi,yi)+3f(xi+32h,yi+32hf(xi,yi))]
a 1 = 1 2 , a 2 = 1 2 , λ 2 = μ 2 = 1 a_1=\dfrac{1}{2},a_2=\dfrac{1}{2},\lambda_2=\mu_2=1 a1=21,a2=21,λ2=μ2=1,得到改进欧拉公式
y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i + 1 , y + h f ( x i , y i ) ) ] y_{i+1}=y_i+\frac{h}{2}[f(x_i,y_i)+f(x_{i+1},y+hf(x_i,y_i))] yi+1=yi+2h[f(xi,yi)+f(xi+1,y+hf(xi,yi))]

经典龙格-库塔法

m = 4 m=4 m=4 时,可得到四阶经典龙格-库塔法
{ y i + 1 = y i + h 6 ( K 1 + 2 K 2 + 2 K 3 + 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{cases}y_{i+1}=y_i+\dfrac{h}{6}(K_1+2K_2+2K_3+K_4)\\K_1=f(x_i,y_i)\\K_2=f(x_i+\dfrac{h}{2},y_i+\dfrac{h}{2}K_1)\\K_3=f(x_i+\dfrac{h}{2},y_i+\dfrac{h}{2}K_2)\\K_4=f(x_i+h,y_i+hK_3)\end{cases} yi+1=yi+6h(K1+2K2+2K3+K4)K1=f(xi,yi)K2=f(xi+2h,yi+2hK1)K3=f(xi+2h,yi+2hK2)K4=f(xi+h,yi+hK3)
具有四阶精度,即局部截断误差为 O ( h 5 ) O(h^5) O(h5)

一般地, m m m 级龙格-库塔法所能达到的最大阶 p p p 的关系如下:

计算方法(六):常微分方程初值问题的数值解法_第1张图片

步长的自动选择

以四阶经典龙格-库塔法为例。从结点 x i x_i xi 出发,以 h h h 为步长求一个近似值记为 y i + 1 ( h ) y_{i+1}^{(h)} yi+1(h),由于局部截断误差为 O ( h 5 ) O(h^5) O(h5) ,所以有
y ( x i + 1 ) − y i + 1 ( h ) ≈ c h 5 y(x_{i+1})-y_{i+1}^{(h)}\approx ch^5 y(xi+1)yi+1(h)ch5
假定系数 c c c 变化很慢,近似常数,并且在 h h h 很小时, c c c h h h 无关。然后将步长折半,即取 h 2 \dfrac{h}{2} 2h 为步长,从 x i x_i xi 跨两步到 x i + 1 x_{i+1} xi+1,求得一个近似值 y i + 1 ( h 2 ) y_{i+1}^{(\frac{h}{2})} yi+1(2h),每跨一步的截断误差是 c ( h 2 ) 5 c(\dfrac{h}{2})^5 c(2h)5,因此有
y ( x i + 1 ) − y i + 1 ( h 2 ) ≈ 2 c ( h 2 ) 5 y(x_{i+1})-y_{i+1}^{(\frac{h}{2})}\approx 2c(\dfrac{h}{2})^5 y(xi+1)yi+1(2h)2c(2h)5
步长折半后,误差大约减少了 1 16 \dfrac{1}{16} 161,即
y ( x i + 1 ) − y i + 1 ( h 2 ) y ( x i + 1 ) − y i + 1 ( h ) ≈ 1 16 \frac{y(x_{i+1})-y_{i+1}^{(\frac{h}{2})}}{y(x_{i+1})-y_{i+1}^{(h)}}\approx\frac{1}{16} y(xi+1)yi+1(h)y(xi+1)yi+1(2h)161
由此易得出下列误差估计式:
y ( x i + 1 ) ≈ 2 4 y i + 1 ( h 2 ) − y i + 1 ( h ) 2 4 − 1 y(x_{i+1})\approx\frac{2^4y_{i+1}^{(\frac{h}{2})}-y_{i+1}^{(h)}}{2^4-1} y(xi+1)24124yi+1(2h)yi+1(h)
取:
y i + 1 = 2 4 y i + 1 ( h 2 ) − y i + 1 ( h ) 2 4 − 1 y_{i+1}=\frac{2^4y_{i+1}^{(\frac{h}{2})}-y_{i+1}^{(h)}}{2^4-1} yi+1=24124yi+1(2h)yi+1(h)
作为 y ( x i + 1 ) y(x_{i+1}) y(xi+1) 的近似值,精度比 y i + 1 ( h ) 、 y i + 1 ( h 2 ) y_{i+1}^{(h)}、y_{i+1}^{(\frac{h}{2})} yi+1(h)yi+1(2h) 都高。(理查森外推方法)

也可以写成:
y ( x i + 1 ) − y i + 1 ( h 2 ) ≈ y i + 1 ( h 2 ) − y i + 1 ( h ) 2 4 − 1 y(x_{i+1})-y_{i+1}^{(\frac{h}{2})}\approx\frac{y_{i+1}^{(\frac{h}{2})}-y_{i+1}^{(h)}}{2^4-1} y(xi+1)yi+1(2h)241yi+1(2h)yi+1(h)
可以通过检查步长折半前后两次计算结果的偏差
Δ = ∣ y i + 1 ( h 2 ) − y i + 1 ( h ) ∣ \Delta=|y_{i+1}^{(\frac{h}{2})}-y_{i+1}^{(h)}| Δ=yi+1(2h)yi+1(h)
来判断所选的步长是否合适:

  1. 对于给定的精度 ε \varepsilon ε,如果 Δ > ε \Delta>\varepsilon Δ>ε,反复将步长折半进行计算,直至 Δ < ε \Delta<\varepsilon Δ<ε,这时取步长折半后的“新值”作为结果;
  2. 如果 Δ < ε \Delta<\varepsilon Δ<ε,反复将步长加倍,直至 Δ > ε \Delta>\varepsilon Δ>ε,这时取步长加倍后的“老值”作为结果。

上述为变步长方法

收敛性与稳定性

收敛性

定义3:若一个数值方法对任意固定的点 x i = x 0 + i h x_i=x_0+ih xi=x0+ih,当 h = x i − x 0 i → 0 h=\dfrac{x_i-x_0}{i}\to0 h=ixix00(即 i → ∞ i\to\infin i),都有 y i → y ( x i ) y_i\to y(x_i) yiy(xi) ,则该方法是收敛的

收敛性与方法的整体截断误差有关,记整体截断误差 ε i = y ( x i ) − y i \varepsilon_i=y(x_i)-y_i εi=y(xi)yi 为在 x i x_i xi 处的准确值 y ( x i ) y(x_i) y(xi) 与数值方法得到的近似值 y i y_i yi 之间的误差,则有:

定理1:设 f ( x , y ) f(x,y) f(x,y) 关于 y y y 满足利普希茨条件,即存在常数 L L L,使得:
∣ f ( x , y 1 ) − f ( x , y 2 ) ∣ ≤ L ∣ y 1 − y 2 ∣     ( ∀ x ∈ [ a , b ] ) |f(x,y_1)-f(x,y_2)|\leq L|y_1-y_2|\ \ \ (\forall x\in[a,b]) f(x,y1)f(x,y2)Ly1y2   (x[a,b])
y ′ ′ ( x ) y''(x) y(x) 有界,记 M = max ⁡ x ∈ [ a , b ] ∣ y ′ ′ ( x ) ∣ M=\max_{x\in[a,b]}|y''(x)| M=maxx[a,b]y(x),则欧拉方法的整体截断误差有估计式:
∣ ε i ∣ ≤ e L ( b − a ) ∣ ε 0 ∣ + M h 2 L ( e L ( b − a ) − 1 ) |\varepsilon_i|\leq e^{L(b-a)}|\varepsilon_0|+\frac{Mh}{2L}(e^{L(b-a)}-1) εieL(ba)ε0+2LMh(eL(ba)1)
其中 ε 0 = y ( x 0 ) − y 0 \varepsilon_0=y(x_0)-y_0 ε0=y(x0)y0

ε 0 = 0 \varepsilon_0=0 ε0=0 时,有
∣ ε i ∣ ≤ M h 2 L ( e L ( b − a ) − 1 ) = O ( h ) |\varepsilon_i|\leq\frac{Mh}{2L}(e^{L(b-a)}-1)=O(h) εi2LMh(eL(ba)1)=O(h)
即具有一阶收敛速度

整体截断误差与局部截断误差之间关系: 整体截断误差= O ( h − 1 ∗ O(h^{-1}* O(h1局部截断误差)。

稳定性

如果存在正常数 C 、 h 0 C、h_0 Ch0,使得对任意初始值 y 0 、 z 0 y_0、z_0 y0z0 的欧拉方法的解 y i 、 z i y_i、z_i yizi 满足估计式:
∣ y i − z i ∣ ≤ C ∣ y 0 − z 0 ∣ ,   x 0 ≤ x 0 + i h ≤ b ,    h ≤ h 0 |y_i-z_i|\leq C|y_0-z_0|, \ x_0\leq x_0+ih\leq b,\ \ h\leq h_0 yiziCy0z0, x0x0+ihb,  hh0
则称欧拉方法是稳定的

定理(*):设 f ( x , y ) f(x,y) f(x,y) 关于 y y y 满足利普希茨条件,则欧拉方法是稳定的。

定义4:设用某一数值方法计算 y i y_i yi 时,所得到的实际计算结果为 y ~ i \tilde y_i y~i,且由误差 δ i = y i − y ~ i \delta_i=y_i-\tilde y_i δi=yiy~i 引起以后各结点处 y j ( j > i ) y_j(j>i) yj(j>i) 的误差为 δ j \delta_j δj,如果总有 ∣ δ j ∣ ≤ ∣ δ i ∣ |\delta_j|\leq|\delta_i| δjδi,则称该方法是绝对稳定的。

一个数值方法的绝对稳定性与方法本身有关,也与 f ( x , y ) f(x,y) f(x,y) 和步长 h h h 有关。

稳定性问题比较复杂,为简化讨论,通常考虑如下试验方程,取 f ( x , y ) = λ y f(x,y)=\lambda y f(x,y)=λy
y ′ = λ y y'=\lambda y y=λy
其中 λ \lambda λ 是一个复常数,记 h ~ = λ h \tilde h=\lambda h h~=λh。能使某一数值方法绝对稳定的 h ~ \tilde h h~ 的允许取值范围称为该方法的绝对稳定域

欧拉方法的绝对稳定性:
y i + 1 = y i + h f ( x i , y i ) = y i + h λ y i = ( 1 + h ~ ) y i y_{i+1}=y_i+hf(x_i,y_i)=y_i+h\lambda y_i=(1+\tilde h)y_i yi+1=yi+hf(xi,yi)=yi+hλyi=(1+h~)yi
y i y_i yi 有误差而变为 y ~ i \tilde y_i y~i 时,有
y ~ i + 1 = ( 1 + h ~ ) y ~ i \tilde y_{i+1}=(1+\tilde h)\tilde y_i y~i+1=(1+h~)y~i
δ i = y i − y ~ i \delta_i=y_i-\tilde y_i δi=yiy~i,两式相减有
δ i + 1 = ( 1 + h ~ ) δ i \delta_{i+1}=(1+\tilde h)\delta_i δi+1=(1+h~)δi
要使误差不增加,需满足:
∣ 1 + h ~ ∣ ≤ 1 |1+\tilde h|\leq1 1+h~1
欧拉方法的绝对稳定区域是以(-1,0)为中心、半径为1的圆形区域。欧拉方法是条件稳定的。

向后欧拉方法绝对稳域 ∣ 1 − h ~ ∣ > 1 |1-\tilde h|>1 1h~>1

改进欧拉方法的绝对稳域:
y i + 1 = y i + h 2 [ λ y i + λ ( y i + h λ y i ) ] = ( 1 + h ~ + 1 2 h ~ 2 ) y i δ i + 1 = ( 1 + h ~ + 1 2 h ~ 2 ) δ i ∣ 1 + h ~ + 1 2 h ~ 2 ∣ ≤ 1 y_{i+1}=y_i+\frac{h}{2}[\lambda y_i+\lambda(y_i+h\lambda y_i)]=(1+\tilde h+\frac{1}{2}\tilde h^2)y_i\\\delta_{i+1}=(1+\tilde h+\frac{1}{2}\tilde h^2)\delta_i\\|1+\tilde h+\frac{1}{2}\tilde h^2|\leq1 yi+1=yi+2h[λyi+λ(yi+hλyi)]=(1+h~+21h~2)yiδi+1=(1+h~+21h~2)δi1+h~+2

你可能感兴趣的:(计算方法)