常微分方程数值解法 下载本文

?h2?y(xn?1)?yn?1?1?h2?(h)[yn?1?yn?1]. (2.11) 15(2.11)是事后估计式, 记

?h2??h???yn?1?yn?1 (2,12)

对给定的步长h,若???(?是预先指定的精度),说明步长h太大,应折半进行计算,直至

?h2????为止,这时取yn???,则将步长h加倍,直到???为止,这时?1作为近似值;如果

再将步长折半一次,就把这次所得结果作为近似值。

变步长的Runge-Kutta方法的计算步骤如下: 设误差上限为?,误差最小下限为步长为h.

(h)(1) 用步长h和Runge-Kutta公式计算yn?1,用步长

?M,M?1,步长最大值为h0,从xn出发进行计算。

h?h2?计算两步得yn?1,并计算?; 2(2) 若???,说明步长过大,应将h折半,返回(1)重新计算; (3) 若???,说明步长过小,在下一步将h放大,但不超过h0. M这种通过加倍和减半处理步长的Runge-Kutta方法就称为变步长Runge-Kutta方法。从表面上看,为了选择步长,每一步的计算量增加了,但从总体考虑还是合算的。

§3 线性多步法

上一节介绍的Runge-Kutta方法是单步法,计算yn?1时,只用到yn, 而已知信息yn?1、

yn?2等没有被直接利用。可以设想如果充分利用已知信息yn?1,yn?2,…来计算yn?1,那么

不但有可能提高精度,而且大大减少了计算量,这就是构造所谓线性多步法的基本思想。构造Runge-Kutta公式是利用Taylor展开的方法,本节利用数值积分公式来构造线性多步法公式。为清晰简明起见,只介绍简单的线性多步法,至于一般情形可完全类似推导出来。

考虑如下形式的求解公式

k?1i?0k?1yn?1???iyn?i?h??ifn?i, (3.1)

i??1其中fi?f(xj,yj),?i(i?0,1,?,k?1),?j(j??1,0,?,k?1)为与n无关的常数。由

于按公式(3.1)计算yn?1时,需要知道yn,yn?1,?,yn?k?1这k个值,所以称为k步法,又

yn?i(i?0,1,?,k?1)及fn?i(i??1,0,1,?,k?1)都是线性的,所以称(3.1)为线性多步(这里

是k步)法。

当??1?0,公式中不含fn?1,这时公式就显式的;当??1?0,称为隐式的。

13

我们知道常微分初值问题(1.1)与积分

y(xn?1)?y(xn)??是等价的。对

xn?1xnf(t,y(t))dt (3.2)

dy?f(x,y(x))作多项式插值,利用插值型求积公式,便可得到相应的线性多dx步法公式。下面我们讨论最简单的多步法——Admas方法

一、Adams显式与隐式公式

为了导出求微分方程(1.1)的数值解法,我们将(3.2)右边积分的被积函数用插值多项式来近似替代。从插值角度来看,插值多项式次数越高越精确,但不能过高(因为高次插值会出现龙格现象),这里,我们取三次插值多项。插值节点除xn,xn?1外,通常还要在[xn,xn?1]内再取两点作为插值节点,但取区间[xn,xn?1]内的点时,函数值又不知道。由于已知

yn?1,yn?2,yn?3,?, 所以我们取插值节点xn?2,xn?1,xn,xn?1,作三次插值多项式

(t?xn)(t?xn?1)(t?xn?2)p3(t)?f(xn?1,y(xn?1))(xn?1?xn)(xn?1?xn?1)(xn?1?xn?2) ? ?(t?xn?1)(t?xn?1)(t?xn?2)f(xn,y(xn))(xn?xn?1)(xn?xn?1)(xn?xn?2)

(t?xn?1)(t?xn)(t?xn?2)f(xn?1,y(xn?1))(xn?1?xn?1)(xn?1?xn)(xn?1?xn?2)(t?xn?1)(t?xn?1)(t?xn?1)?f(xn?2,y(xn?2)) (xn?2?xn?1)(xn?2?xn)(xn?2?xn?1)1?3(t?xn)(t?xn?1)(t?xn?2)f(xn?1,y(xn?1))6h1 ?3(t?xn?1)(t?xn?1)(t?xn?2)f(xn,y(xn))2h (3.3)

1 ?3(t?xn?1)(t?xn)(t?xn?2)f(xn?1,y(xn?1))2h1 ?3(t?xn?1)(t?xn)(t?xn?1)f(xn?2,y(xn?2))6h其中h?xi?xi?1(i?n?1,n,n?1).

插值余项为

F(4)(?)r3(t)?(t?xn?1)(t?xn)(t?xn?1)(t?xn?2), (3.4)

4!其中F(x)?f(x,y(x)),xn?2???xn?1,故有

f(t,y(t))?p3(t)?r3(t). (3.5)

将(3.5)代入(3.2)右端的积分,并略去r3(t),令t?xn?uh,再将y(xn?2)、y(xn?1)、y(xn)、

14

y(xn?1)分别用近似值yn?2、yn?1、yn、yn?1表示,得

11yn?1?yn?hf(xn?1,yn?1)?u(u?1)(u?2)du0611?hf(xn,yn)?(u?1)(u?1)(u?2)du0211?hf(xn?1,yn?1)?(u?1)u(u?2)du(3.6)

0211?hf(xn?2,yn?2)?(u?1)u(u?1)du061?yn?h[9f(xn?1,yn?1)?19f(xn,yn)?5f(xn?1,yn?1)?f(xn?2,yn?2)].24(3.6)称为四阶隐式Adams(外推)公式。

若插值节点取为xn、xn?1、xn?2、xn?3,则三次插值多项式为

1(t?xn?1)(t?xn?2)(t?xn?3)f(xn,y(xn))36h1 ?3(t?xn)(t?xn?2)(t?xn?3)f(xn?1,y(xn?1))2h

1 ?3(t?xn)(t?xn?1)(t?xn?3)f(xn?2,y(xn?2))2h1 ?3(t?xn)(t?xn?1)(t?xn?2)f(xn?3,y(xn?3)),6hp3(t)?插值余项为

r3(t)?于是有

1(4)F(?)(t?xn)(t?xn?1)(t?xn?2)(t?xn?3), xn?3???xn, 4! f(t,y(t))?p3(t)?r3(t). (3.7) 将(3.7)代入(3.2)右端,略去余项,积分,并用yi近似替代y(xi)(i?n?3,n?2,n?1,n),便得

yn?1?yn?1h[55f(xn,yn)?59f(xn?1,yn?1)?37f(xn?2,yn?2)?9f(xn?3,yn?3)] (3.8) 24这就是四阶显式Adams(内插)公式。

由余项表示式(3.4)得,四阶隐式Adams公式的截断误差为

xn?1Tn?1??xn1(4)F(?)(t?xn?1)(t?xn)(t?xn?1)(t?xn?2)dt. 24令t?xn?uh,由第二积分中值定理得

15

Tn?1?1(4)F(?)(t?xn?1)(t?xn)(t?xn?1)(t?xn?2)du24 (3.9)

195(5) ??hy(?),xn?2???xn?1.720这表明四阶隐式Adams方法的局部截断误差为O(h5)。

同理可得四阶显式Adams方法的误差为

Tn?1?2515(5)hy(?),xn?3???xn. (3.10) 720即四阶显式Adams方法的局部误差也为O(h5)。

二、初始值的计算

在Adams公式(3.6)或(3.8)中需要多个初始值才能进行计算,例如用公式(3.6)计算yn?1时就需要知道yn、yn?1、yn?2,而微分方程(1.1)只提供了一个初始值,还有两个初值需要用其他方法来计算。因此,一般来说线性多步法不是自动开始的方法。因为微分方程的初始值在定解时起着重要作用,所以补充的初始值精度要高一些。对于四阶Adams公式而言(隐式的或显式的),局部截断误差为O(h),因此用于确定补充初始值的其他方法的局部截断误差至少应不低于O(h5),否则由于初始值不准确,会影响到最后的结果。对四阶Adams公式而言,最常用的补充初始值的方法是用四阶Runge-Kutta方法,最好用较小步长,如

5h来计算Adams2公式中所缺少的那个初值。还可以用Taylor展开法,如将y(x)在x?x0处作Taylor展开

y(x)?y(x0)?y?(x0)(x?x0)?取它的前若干项,使余项满足精度要求。

1y??(x0)(x?x0)2??, 2!四阶显式Adams公式,在补充缺少的初值后就可计算了。每步只算一个函数值,局部截断误差可达到O(h),这是单步法难以达到的。而隐式Adams公式,每步需要解一个非线性方程。与显式Adams公式相比,在计算上增加了许多困难。但是隐式方法的精度及稳定性比显式方法好得多(同阶的Adams显式与隐式相比)。

5三、预测—校正方法

在实际应用中,为了保留隐式Adams方法的优点,一般将显式公式与隐式公式联合使用,用显式公式提供预测值,用隐式公式加以校正,这样,即不用求解非线性方程,又能达到较高的精度。这种方法称为预测—校正方法。而一般Adams预测—校正过程是

16