数值分析复习:Richardson外推和Romberg算法

本篇文章适合个人复习翻阅,不建议新手入门使用
本专栏:数值分析复习 的前置知识主要有:数学分析、高等代数、泛函分析

本节继续考虑数值积分问题

Richardson外推

命题:复合梯形公式的另一形式
f ∈ C ∞ [ a , b ] f\in C^{\infty}[a,b] fC[a,b],记 I = ∫ a b f ( x ) d x I=\int_a^bf(x)\mathrm{d}x I=abf(x)dx ,将复合梯形公式记为
T ( h ) = h 2 ∑ i = 0 n − 1 [ f ( x i ) + f ( x i + 1 ) ] T(h)=\frac{h}{2}\sum\limits_{i=0}^{n-1}[f(x_i)+f(x_{i+1})] T(h)=2hi=0n1[f(xi)+f(xi+1)]

T ( h ) = I + α 1 h 2 + α 2 h 4 + ⋯ + α l h 2 l + ⋯ T(h)=I+\alpha_1h^2+\alpha_2h^4+\cdots+\alpha_lh^{2l}+\cdots T(h)=I+α1h2+α2h4++αlh2l+

其中 α l ( l = 1 , 2 , …   ) \alpha_l(l=1,2,\dots) αl(l=1,2,) h h h 无关

证明
x i + 1 2 = x i + x i + 1 2 , i = 0 , 1 , … , n − 1 x_{i+\frac{1}{2}}=\frac{x_i+x_{i+1}}{2},i=0,1,\dots,n-1 xi+21=2xi+xi+1,i=0,1,,n1

考虑 f ( x ) f(x) f(x) x = x i + 1 2 x=x_{i+\frac{1}{2}} x=xi+21 处的Taylor展开公式
f ( x ) = f ( x i + 1 2 ) + f ′ ( x i + 1 2 ) ( x − x i + 1 2 ) + f ′ ′ ( x i + 1 2 ) 2 ! ( x − x i + 1 2 ) 2 + ⋯ f(x)=f(x_{i+\frac{1}{2}})+f'(x_{i+\frac{1}{2}})(x-x_{i+\frac{1}{2}})+\frac{f''(x_{i+\frac{1}{2}})}{2!}(x-x_{i+\frac{1}{2}})^2+\cdots f(x)=f(xi+21)+f(xi+21)(xxi+21)+2!f′′(xi+21)(xxi+21)2+

若对上述 Taylor 公式代入 x = x i , x = x i + 1 x=x_{i},x=x_{i+1} x=xi,x=xi+1,则得
f ( x i + 1 ) = f ( x i + 1 2 ) + f ′ ( x i + 1 2 ) h 2 + f ′ ′ ( x i + 1 2 ) 2 ! ( h 2 ) 2 + ⋯ f(x_{i+1})=f(x_{i+\frac{1}{2}})+f'(x_{i+\frac{1}{2}})\frac{h}{2}+\frac{f''(x_{i+\frac{1}{2}})}{2!}(\frac{h}{2})^2+\cdots f(xi+1)=f(xi+21)+f(xi+21)2h+2!f′′(xi+21)(2h)2+ f ( x i ) = f ( x i + 1 2 ) + f ′ ( x i + 1 2 ) ( − h 2 ) + f ′ ′ ( x i + 1 2 ) 2 ! ( − h 2 ) 2 + ⋯ f(x_i)=f(x_{i+\frac{1}{2}})+f'(x_{i+\frac{1}{2}})(-\frac{h}{2})+\frac{f''(x_{i+\frac{1}{2}})}{2!}(-\frac{h}{2})^2+\cdots f(xi)=f(xi+21)+f(xi+21)(2h)+2!f′′(xi+21)(2h)2+

两式加和,得到
f ( x i ) + f ( x i + 1 ) 2 = f ( x i + 1 2 ) + h 2 8 f ′ ′ ( x i + 1 2 ) + ⋯ \frac{f(x_i)+f(x_{i+1})}{2}=f(x_{i+\frac{1}{2}})+\frac{h^2}{8}f''(x_{i+\frac{1}{2}})+\cdots 2f(xi)+f(xi+1)=f(xi+21)+8h2f′′(xi+21)+

等式两端求和,乘以 h h h 得到
T ( h ) = h ∑ i = 0 n − 1 f ( x i + 1 2 ) + h 3 8 ∑ i = 0 n − 1 f ′ ′ ( x i + 1 2 ) + ⋯ (1) T(h)=h\sum\limits_{i=0}^{n-1}f(x_{i+\frac{1}{2}})+\frac{h^3}{8}\sum\limits_{i=0}^{n-1}f''(x_{i+\frac{1}{2}})+\cdots\tag 1 T(h)=hi=0n1f(xi+21)+8h3i=0n1f′′(xi+21)+(1)

另一方面,对Taylor公式从 x i x_i xi x i + 1 x_{i+1} xi+1 进行积分,得到
∫ x i x i + 1 f ( x ) d x = h ⋅ f ( x i + 1 2 ) + f ′ ( x i + 1 2 ) 2 [ ( h 2 ) 2 − ( − h 2 ) 2 ] + f ′ ′ ( x i + 1 2 ) 6 [ ( h 2 ) 3 − ( − h 2 ) 3 ] + ⋯ \int_{x_i}^{x_{i+1}}f(x)\mathrm{d}x=h\cdot f(x_{i+\frac{1}{2}})+\frac{f'(x_{i+\frac{1}{2}})}{2}[(\frac{h}{2})^2-(-\frac{h}{2})^2]+\frac{f''(x_{i+\frac{1}{2}})}{6}[(\frac{h}{2})^3-(-\frac{h}{2})^3]+\cdots xixi+1f(x)dx=hf(xi+21)+2f(xi+21)[(2h)2(2h)2]+6f′′(xi+21)[(2h)3(2h)3]+

等式两端求和得

I = ∑ i = 0 n − 1 ∫ x i x i + 1 f ( x ) d x = h ∑ i = 0 n − 1 f ( x i + 1 2 ) + h 3 24 ∑ i = 0 n − 1 f ′ ′ ( x i + 1 2 ) + ⋯ (2) I=\sum\limits_{i=0}^{n-1}\int_{x_i}^{x_{i+1}}f(x)\mathrm{d}x=h\sum\limits_{i=0}^{n-1}f(x_{i+\frac{1}{2}}) +\frac{h^3}{24}\sum\limits_{i=0}^{n-1}f''(x_{i+\frac{1}{2}}) +\cdots\tag 2 I=i=0n1xixi+1f(x)dx=hi=0n1f(xi+21)+24h3i=0n1f′′(xi+21)+(2)

结合(1)(2)式,可得
T ( h ) = I + h 3 12 ∑ i = 0 n − 1 f ′ ′ ( x i + 1 2 ) + ⋯ (3) T(h)=I+\frac{h^3}{12}\sum\limits_{i=0}^{n-1}f''(x_{i+\frac{1}{2}})+\cdots\tag 3 T(h)=I+12h3i=0n1f′′(xi+21)+(3)

类似(2)式的推导,可得
∫ a b f ′ ′ ( x ) d x = h ∑ i = 0 n − 1 f ′ ′ ( x i + 1 2 ) + h 3 24 ∑ i = 0 n − 1 f ( 4 ) ( x i + 1 2 ) + ⋯ \int_a^bf''(x)\mathrm{d}x=h\sum\limits_{i=0}^{n-1}f''(x_{i+\frac{1}{2}})+\frac{h^3}{24}\sum\limits_{i=0}^{n-1}f^{(4)}(x_{i+\frac{1}{2}})+\cdots abf′′(x)dx=hi=0n1f′′(xi+21)+24h3i=0n1f(4)(xi+21)+

结合 ∫ a b f ′ ′ ( x ) d x = f ′ ( b ) − f ′ ( a ) \int_a^bf''(x)\mathrm{d}x=f'(b)-f'(a) abf′′(x)dx=f(b)f(a),可将(3)式化为
T ( h ) = I + α 1 h 2 + h 5 c 4 ∑ i = 0 n − 1 f ( 4 ) ( x i + 1 2 ) + ⋯ T(h)=I+\alpha_1h^2+h^5c_4\sum\limits_{i=0}^{n-1}f^{(4)}(x_{i+\frac{1}{2}})+\cdots T(h)=I+α1h2+h5c4i=0n1f(4)(xi+21)+

重复上述操作,考虑 ∫ a b f ( 4 ) ( x ) d x \int_a^bf^{(4)}(x)\mathrm{d}x abf(4)(x)dx,消去 h 5 h^5 h5 的项,得到 h 4 h^4 h4 的项,继续重复操作,可得
T ( h ) = I + α 1 h 2 + α 2 h 4 + ⋯ + α l h 2 l + ⋯ T(h)=I+\alpha_1h^2+\alpha_2h^4+\cdots+\alpha_lh^{2l}+\cdots T(h)=I+α1h2+α2h4++αlh2l+

定义:Richardson外推
从低阶精度格式的截断误差的渐近展开式出发,做简单线性计算从而得到高阶精度格式的方法称为Richardson外推

例:
考虑复合梯形公式 T ( h ) T(h) T(h) 满足的式子
T ( h ) = I + α 1 h 2 + α 2 h 4 + ⋯ + α l h 2 l + ⋯ T(h)=I+\alpha_1h^2+\alpha_2h^4+\cdots+\alpha_lh^{2l}+\cdots T(h)=I+α1h2+α2h4++αlh2l+

此时截断误差量级为 O ( h 2 ) O(h^{2}) O(h2)

取步长为 h 2 \frac{h}{2} 2h,则有
T ( h 2 ) = I + α 1 h 2 4 + α 2 h 4 16 + ⋯ + α l h 2 l 2 2 l + ⋯ T(\frac{h}{2})=I+\alpha_1\frac{h^2}{4}+\alpha_2\frac{h^4}{16}+\cdots+\alpha_l\frac{h^{2l}}{2^{2l}}+\cdots T(2h)=I+α14h2+α216h4++αl22lh2l+

结合这两个式子,消去 h 2 h^{2} h2项,得
4 T ( h 2 ) − T ( h ) 3 = I − 1 4 α 2 h 4 + ⋯ + α l 3 ( 1 2 2 l − 1 ) h 2 l + ⋯ \frac{4T(\frac{h}{2})-T(h)}{3}=I-\frac{1}{4}\alpha_2h^4+\cdots+\frac{\alpha_l}{3}(\frac{1}{2^{2l}}-1)h^{2l}+\cdots 34T(2h)T(h)=I41α2h4++3αl(22l11)h2l+
T 1 ( h ) = 4 T ( h 2 ) − T ( h ) 3 T_1(h)=\frac{4T(\frac{h}{2})-T(h)}{3} T1(h)=34T(2h)T(h),且
T 1 ( h ) = I + β 2 h 4 + β 3 h 6 + ⋯ + β l h 2 l + ⋯ T_1(h)=I+\beta_2h^4+\beta_3h^6+\cdots+\beta^lh^{2l}+\cdots T1(h)=I+β2h4+β3h6++βlh2l+
若用 T 1 ( h ) T_1(h) T1(h) 估计 I I I ,则截断误差量级提高到 O ( h 4 ) O(h^{4}) O(h4)
类似地,可继续做……

注:只要截断误差可表示为 h h h 的幂级数,均可使用 Richardson外推提高精度

Romberg(龙贝格)算法

Romberg算法用以解决问题:对预先给定的精度 ε \varepsilon ε,求 I = ∫ a b f ( x ) d x I=\int_a^bf(x)\mathrm{d}x I=abf(x)dx 的近似值

记梯形公式为
T ( 1 , 1 ) = ( b − a ) 2 [ f ( a ) + f ( b ) ] T(1,1)=\frac{(b-a)}{2}[f(a)+f(b)] T(1,1)=2(ba)[f(a)+f(b)]

设对区间 [ a , b ] [a,b] [a,b] m m m 次等分得到的复合梯形公式为 T ( m + 1 , 1 ) T(m+1,1) T(m+1,1)
设对 T ( s , t ) T(s,t) T(s,t) 进行一次 Richardson外推得到的积分为 T ( s + 1 , t + 1 ) T(s+1,t+1) T(s+1,t+1)

由Richardson外推过程,可归纳地证明
T ( s + 1 , t + 1 ) = 4 n T ( s + 1 , t ) − T ( s , t ) 4 n − 1 T(s+1,t+1)=\frac{4^nT(s+1,t)-T(s,t)}{4^n-1} T(s+1,t+1)=4n14nT(s+1,t)T(s,t)

故可设计算法依次计算如下表格

在这里插入图片描述

由 Euler-Maclaurin 公式,可保证当 t → ∞ t\to \infty t 时, T ( t , t ) T(t,t) T(t,t) 收敛于积分的真实值 I I I

随着节点加密(即 s → ∞ s\to\infty s), T ( s , t ) T(s,t) T(s,t) 也收敛于 I I I

故对预先设置的误差限 ε \varepsilon ε,用
max ⁡ { ∣ T ( s + 1 , s + 1 ) − T ( s , s ) ∣ , ∣ T ( s + 1 , s + 1 ) − T ( s + 1 , s ) ∣ } < ε \max\{|T(s+1,s+1)-T(s,s)|,|T(s+1,s+1)-T(s+1,s)|\}<\varepsilon max{T(s+1,s+1)T(s,s),T(s+1,s+1)T(s+1,s)}<ε

代替
∣ T ( s , s ) − I ∣ < ε |T(s,s)-I|<\varepsilon T(s,s)I<ε

此时 T ( s + 1 , s + 1 ) T(s+1,s+1) T(s+1,s+1) 即为 I I I 的近似值

matlab代码如下,其中节点从1开始计数 x 1 , x 2 , … , x n + 1 x_1,x_2,\dots,x_{n+1} x1,x2,,xn+1

%程序:龙贝格算法求数值积分
%输入:被积函数f,积分上限b,下限a,要求的误差限tol
%输出:T数表,误差估计err
%     用到的梯形公式函数值个数cnt(即节点个数)
%     数值积分结果ans
function [q,cnt] = romberg(f,a,b,tol)

% 计算初始梯形公式T(1,1)
n=1;        %节点个数 $n+1$
h = b-a;    %初始步长
fv = [f(a);f(b)];     %初始的梯形公式所需的函数值
T(1,1) = .5*h*(fv(1)+fv(2));
cnt = 2;         % 返回函数值的个数

%计算梯形公式
err = 100*abs(tol); k=0;    % 初始化 err 使其大于误差,启动循环
while err > tol &k < 10
    k = k+1; n=2*n; h=h/2;  % 节点数翻倍,步长减半
    fvnew = zeros(n+1,1);   % 初始化,预备储存位置
    fvnew(1:2:n+1) = fv(1:n/2+1);%定义边界点x1,x(n+1)处的函数值
    for i =2:2:n           %定义其余节点处的函数值
        fvnew(i)= f(a+(i-1)*h);
    end
    cnt = cnt +(n/2);       %计算函数值个数,即节点个数
    fv = fvnew;
    %计算新的梯形公式
    trap = .5*(fv(1)+fv(n+1));
    for i= 2:n            % 估计积分
        trap = trap + fv(i);
    end
    T(k+1,1)=h*trap;

    % 作Richardson外推
    for j=2:k+1
        T(k+1,j) = ((4^(j-1))*T(k+1,j-1)-T(k,j-1))/(4^(j-1)-1);
    end
    q = T(k+1,k+1);

    % 估计误差
    err =max([abs(q-T(k,k));abs(q-T(k+1,k))]);
end
disp(T(1:k+1,1:k+1));
disp(['err = ' num2str(err, '%g')]);
disp(['cnt = ' num2str(cnt)]);

参考书籍:《数值分析》李庆扬 王能超 易大义 编

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Richardson外推法是一种提高数值解精度的方法,可以用于常微分方程的数值解。下面以一个简单的例题来说明如何使用Richardson外推法。 考虑初值问题:$y^\prime = -2ty^2, y(0) = 1$,我们要在区间$[0,1]$上求解该问题的数值解。 首先,我们将区间$[0,1]$分成$n$个等长子区间,每个子区间的长度为$h = \frac{1}{n}$。接下来,我们使用欧拉方法求解该初值问题,得到数值解$y_n$: $y_{i+1} = y_i + hf(t_i,y_i) = y_i - 2th_iy_i^2$ 其中,$t_i = ih$。 然后,我们利用Richardson外推法提高数值解精度。具体地,我们定义两个不同的步长$h_1$和$h_2$,使得$h_2 = 2h_1$。然后,我们可以通过以下公式计算Richardson外推法的数值解$y_n^{(2)}$: $y_n^{(2)} = \frac{2^{p+1}y_{n}^{(1)} - y_{n}^{(2)}}{2^{p}-1}$ 其中,$y_{n}^{(1)}$是使用步长$h_1$求解的数值解,$y_{n}^{(2)}$是使用步长$h_2$求解的数值解,$p$是欧拉方法的阶数,对于欧拉方法,$p=1$。 在本例中,我们可以选择$h_1 = 0.1$和$h_2 = 0.2$。然后,我们可以使用欧拉方法求解出$y_{n}^{(1)}$和$y_{n}^{(2)}$,并代入上述公式计算Richardson外推法的数值解$y_n^{(2)}$。 下面是用Python实现该算法的代码: ```python import numpy as np def f(t,y): return -2*t*y**2 # 初始条件 t0 = 0 y0 = 1 # 区间[0,1]分成100个子区间 n = 100 h1 = 0.1 # 步长1 h2 = 2*h1 # 步长2 # 使用欧拉方法求解数值解 t1 = np.linspace(t0,1,n+1) y1 = np.zeros(n+1) y1[0] = y0 for i in range(n): y1[i+1] = y1[i] + h1*f(t1[i],y1[i]) # 使用欧拉方法和步长2求解数值解 t2 = np.linspace(t0,1,int(n/2)+1) y2 = np.zeros(int(n/2)+1) y2[0] = y0 for i in range(int(n/2)): y2[i+1] = y2[i] + h2*f(t2[i],y2[i]) # 使用Richardson外推法提高数值解精度 p = 1 # 欧拉方法的阶数 yn2 = (2**(p+1)*y1[n] - y2[int(n/2)])/(2**p - 1) print("Richardson外推法的数值解为:", yn2) ``` 运行该代码,可以得到Richardson外推法的数值解为:$y_n^{(2)} = 0.5633076693433849$。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值