隐式欧拉法 /* implicit Euler method */ §1 Euler’s Method x0 x1 欧拉公式的改进: 隐式欧拉法 /* implicit Euler method */ 向后差商近似导数 )) ( , ) 1 x y f h + ) 1 , ... ( - = + n i y x f h Hey! Isn’t the leading term of the local truncation error of Euler’s method ? Seems that we can make a good use of it … 由于未知数 yi+1 同时出现在等式的两边,不能直接得到,故称为隐式 /* implicit */ 欧拉公式,而前者称为显式 /* explicit */ 欧拉公式。 一般先用显式计算一个初值,再迭代求解。 隐式欧拉法的局部截断误差: 即隐式欧拉公式具有 1 阶精度。
梯形公式 /* trapezoid formula */ §1 Euler’s Method 梯形公式 /* trapezoid formula */ — 显、隐式两种算法的平均 注:的确有局部截断误差 , 即梯形公式具有2 阶精度,比欧拉方法有了进步。但注意到该公式是隐式公式,计算时不得不用到迭代法,其迭代收敛性与欧拉公式相似。 需要2个初值 y0和 y1来启动递推 过程,这样的算法称为双步法 /* double-step method */,而前面的三种算法都是单步法 /* single-step method */。 中点欧拉公式 /* midpoint formula */ x0 x2 x1 中心差商近似导数 假设 ,则可以导出 即中点公式具有 2 阶精度。
方 法 显式欧拉 隐式欧拉 梯形公式 中点公式 简单 精度低 稳定性最好 精度低, 计算量大 精度提高 计算量大 精度提高, 显式 §1 Euler’s Method 方 法 显式欧拉 隐式欧拉 梯形公式 中点公式 简单 精度低 稳定性最好 精度低, 计算量大 精度提高 计算量大 精度提高, 显式 多一个初值, 可能影响精度 Can’t you give me a formula with all the advantages yet without any of the disadvantages? Do you think it possible? Well, call me greedy… OK, let’s make it possible.
改进欧拉法 /* modified Euler’s method */ Step 1: 先用显式欧拉公式作预测,算出 ) , ( 1 i y x f h + = Step 2: 再将 代入隐式梯形公式的右边作校正,得到 1 + i y )] , ( ) [ 2 = x f h 注:此法亦称为预测-校正法 /* predictor-corrector method */。可以证明该算法具有 2 阶精度,同时可以看到它是个单步递推格式,比隐式公式的迭代求解过程简单。后面将看到,它的稳定性高于显式欧拉法。
§2 龙格 - 库塔法 /* Runge-Kutta Method */ 建立高精度的单步递推格式。 单步递推法的基本思想是从 ( xi , yi ) 点出发,以某一斜率沿直线达到 ( xi+1 , yi+1 ) 点。欧拉法及其各种变形所能达到的最高精度为2阶。 考察改进的欧拉法,可以将其改写为: 斜率 一定取K1 K2 的平均值吗? 步长一定是一个h 吗?
首先希望能确定系数 1、2、p,使得到的算法格式有2阶精度,即在 的前提假设下,使得 §2 Runge-Kutta Method 将改进欧拉法推广为: ) , ( ] [ 1 2 phK y ph x f K h i + = l 首先希望能确定系数 1、2、p,使得到的算法格式有2阶精度,即在 的前提假设下,使得 Step 1: 将 K2 在 ( xi , yi ) 点作 Taylor 展开 Step 2: 将 K2 代入第1式,得到
存在无穷多个解。所有满足上式的格式统称为2阶龙格 - 库塔格式。 §2 Runge-Kutta Method Step 3: 将 yi+1 与 y( xi+1 ) 在 xi 点的泰勒展开作比较 要求 ,则必须有: 这里有 个未知数, 个方程。 3 2 存在无穷多个解。所有满足上式的格式统称为2阶龙格 - 库塔格式。 注意到, 就是改进的欧拉法。 Q: 为获得更高的精度,应该如何进一步推广?
最常用为四级4阶经典龙格-库塔法 /* Classical Runge-Kutta Method */ : ) ... , ( ] [ 1 2 32 31 3 21 - + = m m m i hK y h x f K b a l 其中i ( i = 1, …, m ),i ( i = 2, …, m ) 和 ij ( i = 2, …, m; j = 1, …, i1 ) 均为待定系数,确定这些系数的步骤与前面相似。 最常用为四级4阶经典龙格-库塔法 /* Classical Runge-Kutta Method */ :
龙格-库塔法的主要运算在于计算 Ki 的值,即计算 f 的值。Butcher 于1965年给出了计算量与可达到的最高精度阶数的关系: §2 Runge-Kutta Method 注: 龙格-库塔法的主要运算在于计算 Ki 的值,即计算 f 的值。Butcher 于1965年给出了计算量与可达到的最高精度阶数的关系: 7 5 3 可达到的最高精度 6 4 2 每步须算Ki 的个数 由于龙格-库塔法的导出基于泰勒展开,故精度主要受解函数的光滑性影响。对于光滑性不太好的解,最好采用低阶算法而将步长h 取小。 HW: p.202 #1, 2
Lab 15. Runge-Kutta (Order Four) §2 Runge-Kutta Method Lab 15. Runge-Kutta (Order Four) Use Runge-Kutta method of order four to approximate the solution of the initial-value problem , , and (1) You are supposed to write a function void RK4 ( double (*f)( ), double a, double b, double y0, int n, FILE *outfile) to approximate the solution of Problem (1) with y’= f, x in [a, b], and the initial value of y being y0. Output the approximating values of y on the n+1 equally spaced grid points from a to b to outfile. Input There is no input file. Instead, you must hand in your function in a *.h file. The rule of naming the *.h file is the same as that of naming the *.c or *.cpp files. Output ( represents a space) For each test case, you are supposed to print n+1 lines, and each line is in the following format: fprintf( outfile, “%8.4f%12.8e\n”, x, y );
#include <stdio.h> #include <math.h> §2 Runge-Kutta Method Sample Judge Program #include <stdio.h> #include <math.h> #include "98115001_15.h" double f0(double x, double y) { return (yx*x+1.0); } void main( ) { FILE *outfile = fopen("out.txt", "w"); int n; double a, b, y0; a = 0.0; b = 2.0; y0 = 0.50; n = 10; RK4(f0, a, b, y0, n, outfile); fprintf(outfile, "\n"); fclose(outfile); } Sample Output ( represents a space) 0.00005.00000000e001 0.20008.29293333e001 0.40001.21407621e+000 0.60001.64892202e+000 0.80002.12720268e+000 1.00002.64082269e+000 1.20003.17989417e+000 1.40003.73234007e+000 1.60004.28340950e+000 1.80004.81508569e+000 2.00005.30536300e+000
§3 收敛性与稳定性 /* Convergency and Stability */ 定义 若某算法对于任意固定的 x = xi = x0 + i h,当 h0 ( 同时 i ) 时有 yi y( xi ),则称该算法是收敛的。 例:就初值问题 考察欧拉显式格式的收敛性。 解:该问题的精确解为 欧拉公式为 对任意固定的 x = xi = i h ,有
What is wrong ??! 稳定性 /* Stability */ 例:考察初值问题 在区间[0, 0.5]上的解。 §3 Convergency and Stability 稳定性 /* Stability */ 例:考察初值问题 在区间[0, 0.5]上的解。 分别用欧拉显、隐式格式和改进的欧拉格式计算数值解。 An Engineer complains: "Math theorems are so unstable that a small perturbation on the conditions will cause a crash on the conclusions!" 0.0 0.1 0.2 0.3 0.4 0.5 精确解 改进欧拉法 欧拉隐式 欧拉显式 节点 xi 1.0000 2.0000 4.0000 8.0000 1.6000101 3.2000101 1.0000 2.5000101 6.2500102 1.5625102 3.9063103 9.7656104 1.0000 2.5000 6.2500 1.5626101 3.9063101 9.7656101 1.0000 4.9787102 2.4788103 1.2341104 6.1442106 3.0590107 What is wrong ??!
§3 Convergency and Stability 定义 若某算法在计算过程中任一步产生的误差在以后的计算中都逐步衰减,则称该算法是绝对稳定的 /*absolutely stable */。 常数,可以是复数 一般分析时为简单起见,只考虑试验方程 /* test equation */ 当步长取为 h 时,将某算法应用于上式,并假设只在初值产生误差 ,则若此误差以后逐步衰减,就称该算法相对于 绝对稳定, 的全体构成绝对稳定区域。我们称算法A 比算法B 稳定,就是指 A 的绝对稳定区域比 B 的大。 h l h =
由此可见,要保证初始误差0 以后逐步衰减, 必须满足: §3 Convergency and Stability 例:考察显式欧拉法 - 1 2 Re Img 由此可见,要保证初始误差0 以后逐步衰减, 必须满足: 例:考察隐式欧拉法 2 1 Re Img 可见绝对稳定区域为: 注:一般来说,隐式欧拉法的绝对稳定性比同阶的显式法的好。
例:隐式龙格-库塔法 其中2阶方法 的绝对稳定区域为 而显式 1~ 4 阶方法的绝对稳定区域为 HW: p.202 #6 无条件稳定 §3 Convergency and Stability 例:隐式龙格-库塔法 其中2阶方法 的绝对稳定区域为 Re Img 而显式 1~ 4 阶方法的绝对稳定区域为 k = 1 2 3 4 - Re Img 无条件稳定 HW: p.202 #6
§4 线性多步法 /* Multistep Method */ 当 10 时,为隐式公式; 1=0 则为显式公式。 用若干节点处的 y 及 y’ 值的线性组合来近似y(xi+1)。 其通式可写为: ) ... ( 1 k i f h y - + = b a 基于数值积分的构造法 将 在 上积分,得到 只要近似地算出右边的积分 ,则可通过 近似y(xi+1) 。而选用不同近似式 Ik,可得到不同的计算公式。
亚当姆斯显式公式 /* Adams explicit formulae */ §4 Multistep Method 亚当姆斯显式公式 /* Adams explicit formulae */ 利用k+1 个节点上的被积函数值 构造 k 阶牛顿后插多项式 , 有 /* 显式计算公式 */ Newton 插值余项 局部截断误差为: 例:k=1 时有
注:一般有 ,其中Bk 与yi+1 计算公式中 fi , …, fik 各项的系数均可查表得到 。 §4 Multistep Method 注:一般有 ,其中Bk 与yi+1 计算公式中 fi , …, fik 各项的系数均可查表得到 。 1 2 3 k fi fi1 fi2 fi3 … Bk Misprint on p.204 常用的是 k = 3 的4阶亚当姆斯显式公式
亚当姆斯隐式公式 /* Adams implicit formulae */ §4 Multistep Method 亚当姆斯隐式公式 /* Adams implicit formulae */ 利用k+1 个节点上的被积函数值 fi+1 , fi , …, fik+1 构造 k 阶牛顿前插多项式。与显式多项式完全类似地可得到一系列隐式公式,并有 ,其中 与 fi+1 , fi , …, fik+1 的系数亦可查表得到。 ~ 1 2 3 k fi+1 fi fi1 fi2 … Bk ~ 小于Bk 较同阶显式稳定 常用的是 k = 3 的4阶亚当姆斯隐式公式
亚当姆斯预测-校正系统 Predicted value pi+1 §4 Multistep Method 亚当姆斯预测-校正系统 /* Adams predictor-corrector system */ Predicted value pi+1 注意:三步所用公式的精度必须相同。通常用经典Runge-Kutta 法配合4阶Adams 公式。 Step 1: 用Runge-Kutta 法计算前 k 个初值; Step 2: 用Adams 显式计算预测值; Step 3: 用同阶Adams 隐式计算校正值。 Hey! Look at the local truncation error of the explicit and implicit Adams methods: and Don’t you think there’s something you can do? 4阶Adams显式公式的截断误差为 4阶Adams隐式公式的截断误差为 当 h 充分小时,可近似认为i i ,则: Modified final value yi+1 Corrected value ci+1 Modified value mi+1 外推技术 /* extrapolation */
应为( ci+1 pi+1 ), 但因ci+1 尚未算出,只好用( ci pi )取代之。 §4 Multistep Method Adams 4th-Order predictor-corrector Algorithm To approximate the the solution of the initial-value problem At (N+1) equally spaced numbers in the interval [a, b]. Input: endpoints a, b; integer N; initial value y0 . Output: approximation y at the (N+1) values of x. Step 1 Set h = (b a) / N ; x0 = a; y0 = y0; Output ( x0, y0 ); Step 2 For i = 1, 2, 3 Compute yi using classical Runge-Kutta method; Output ( xi , yi ); Step 3 For i = 4, …, N do steps 4-10 Step 5 ; /* predict */ Step 6 ; /* modify */ Step 7 ; /* correct */ Step 8 ; /* modify the final value */ Step 9 Output ( xi+1 , yi+1 ); Step 10 For j = 0, 1, 2, 3 Set xi = xi+1 ; yi = yi+1 ; /* Prepare for next iteration */ Step 11 STOP. 应为( ci+1 pi+1 ), 但因ci+1 尚未算出,只好用( ci pi )取代之。