#
#
# WORKSHEET # 24
#
# RICHARDSON EXTRAPOLATION
#
#
--------------------------------------------------------------------------------
# In this worksheet we describe a quite elementary method, called Romberg integration, for
# improving on the accuracy of numerical methods of integration. We apply it first to the
# trapezoidal rule.
--------------------------------------------------------------------------------
> restart;
--------------------------------------------------------------------------------
> h:=n->(b-a)/n;
b - a
h := n -> -----
n
--------------------------------------------------------------------------------
> X:=(i,n)->a+i*(b-a)/n;
i (b - a)
X := (i,n) -> a + ---------
n
--------------------------------------------------------------------------------
> Trap:=n->(h(n)/2)*sum(f(X(i,n))+f(X(i+1,n)),i=0..n-1);
/n - 1 \
|----- |
| \ |
Trap := n -> 1/2 h(n) | ) (f(X(i, n)) + f(X(i + 1, n)))|
| / |
|----- |
\i = 0 /
--------------------------------------------------------------------------------
# Writing T[n] for Trap[n] we can prove the following formula, under reasonable
# differentiability assumptions on the function f(x). The last term in the formula, that is
# O(h^(2*m+2)), indicates any function of h that is bounded by K*h^(2*m+2) as h tends to
# 0, where K is a constant. The important point here is that the constant K and the
# coefficients a[k] depend only on f(x), a and b, and not on the step size h. We refer to the
# trapezoidal rule as an order 2 method since the first term in the error is a[2]*h^2, i.e.
# degree 2 in the step size h. Doubling n changes the step size from h to h/2 and
# consequently the first term in the error changes from a[2]*h^2 to (1/4)*a[2]*h^2, that is
# the leading term in the error has been quartered.
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[n]+Sum(a[k]*h^(2*k),k=1..m)+O(h^(2*m+2));
b / m \
/ |----- |
| | \ (2 k)| (2 m + 2)
| f(x) dx = T[n] + | ) a[k] h | + O(h )
| | / |
/ |----- |
a \k = 1 /
--------------------------------------------------------------------------------
# For m=2 this formula becomes
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[n]+a[2]*h^2+a[4]*h^4+O(h^6);
b
/
| 2 4 6
| f(x) dx = T[n] + a[2] h + a[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
# Now repeat this for step size h/2, that is double the value of n to 2*n.
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[2*n]+a[2]*(h/2)^2+a[4]*(h/2)^4+O(h^6);
b
/
| 2 4 6
| f(x) dx = T[2 n] + 1/4 a[2] h + 1/16 a[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
# By performing elementary arithmetic on these last 2 equations we can eliminate the h^2
# terms from the error.
--------------------------------------------------------------------------------
> (1/3)*(4*(")-"");
b
/
| 4 6
| f(x) dx = 4/3 T[2 n] - 1/4 a[4] h + O(h ) - 1/3 T[n]
|
/
a
--------------------------------------------------------------------------------
# That is (4*T[2n]-T[n])/3 is a "better approximation" since the first term in the error now
# has order 4. This is a "new" rule of numerical integration.
--------------------------------------------------------------------------------
> T[1]:=n->(4*Trap(2*n)-Trap(n))/3;
T[1] := n -> 4/3 Trap(2 n) - 1/3 Trap(n)
--------------------------------------------------------------------------------
> a:=0;b:=1;
a := 0
b := 1
--------------------------------------------------------------------------------
> f:=x->1/(x+1);\
1
f := x -> -----
x + 1
--------------------------------------------------------------------------------
> J:=int(f(x),x=a..b);\
J := ln(2)
--------------------------------------------------------------------------------
> evalf(ln(2));
.6931471806
--------------------------------------------------------------------------------
> seq([n,evalf(J-Trap(n)),evalf(J-T[1](n))],n=1..5);n:='n':
[1, -.0568528194, -.0012972638], [2, -.0151861527, -.0001067877],
-5
[3, -.0068528194, -.0000226126], [4, -.0038766289, -.73501*10 ],
-5
[5, -.0024877400, -.30501*10 ]
--------------------------------------------------------------------------------
# The error terms J-T[1](n) are a lot smaller than the error terms J-Trap(n).
--------------------------------------------------------------------------------
# Let's compare T[1] with simpson's rule.
--------------------------------------------------------------------------------
> Simpson:=n->(h(n)/3)*sum(f(X(2*i,n))+4*f(X(2*i+1,n))+f(X(2*i+2,n)),i=0..n/2-1);
Simpson :=
/1/2 n - 1 \
| ----- |
| \ |
n -> 1/3 h(n) | ) (f(X(2 i, n)) + 4 f(X(2 i + 1, n)) + f(X(2 i + 2, n)))|
| / |
| ----- |
\ i = 0 /
--------------------------------------------------------------------------------
> seq([evalf(J-T[1](n)),evalf(J-Simpson(2*n))],n=1..5);n:='n':
[-.0012972638, -.0012972638], [-.0001067877, -.0001067877],
-5 -5
[-.0000226126, -.0000226126], [-.73501*10 , -.73501*10 ],
-5 -5
[-.30501*10 , -.30501*10 ]
--------------------------------------------------------------------------------
# These numbers are the same, and in fact T[1](n)=Simpson(2*n).
--------------------------------------------------------------------------------
> f:='f':
--------------------------------------------------------------------------------
> T[1](1);
1/6 f(0) + 2/3 f(1/2) + 1/6 f(1)
--------------------------------------------------------------------------------
> Simpson(2);
1/6 f(0) + 2/3 f(1/2) + 1/6 f(1)
--------------------------------------------------------------------------------
> for k from 1 to 5 do print(T[1](k)-Simpson(2*k)) od;k:='k':
0
0
0
0
0
--------------------------------------------------------------------------------
> a:='a':b:='b':
--------------------------------------------------------------------------------
# We can use the trapezoidal rules T[n], T[2*n] to estimate the error made in
# approximating Int(f(x),x=a..b) by T[n] or T[2*n].
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[n]+a[2]*h^2+a[4]*h^4+O(h^6);
b
/
| 2 4 6
| f(x) dx = T[n] + a[2] h + a[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[2*n]+a[2]*(h/2)^2+a[4]*(h/2)^4+O(h^6);
b
/
| 2 4 6
| f(x) dx = T[2 n] + 1/4 a[2] h + 1/16 a[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
> ""-";
2 15 4
0 = T[n] + 3/4 a[2] h + ---- a[4] h - T[2 n]
16
--------------------------------------------------------------------------------
# There is a mistake here, due to the ambiguity in the big O notation The big O terms are
# not the same and therefore should not be cancelled. If we only consider the terms out to
# h^4 then the correct formula should read:
--------------------------------------------------------------------------------
> 0=T[n]-T[2*n]+(3/4)*a[2]*h^2+O(h^4);
2 4
0 = T[n] - T[2 n] + 3/4 a[2] h + O(h )
--------------------------------------------------------------------------------
> (1/4)*a[2]*h^2=(T[2*n]-T[n])/3+O(h^4);
2 4
1/4 a[2] h = 1/3 T[2 n] - 1/3 T[n] + O(h )
--------------------------------------------------------------------------------
# Now recall that the lowest order term in the error for T[2*n] is (1/4)*a[2]*h^2. In other
# words (T[2*n]-T[n])/3 gives a good indication of the error made in T[2*n]. In a similar
# fashion we see that 4*(T[2*n]-T[n])/3 is a good indication of the error made in T[n].
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)-T[2*n]=(T[2*n]-T[n])/3+O(h^4);
b
/
| 4
| f(x) dx - T[2 n] = 1/3 T[2 n] - 1/3 T[n] + O(h )
|
/
a
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)-T[n]=4*(T[2*n]-T[n])/3+O(h^4);
b
/
| 4
| f(x) dx - T[n] = 4/3 T[2 n] - 4/3 T[n] + O(h )
|
/
a
--------------------------------------------------------------------------------
# We can also "solve" for the coefficient a[2].
--------------------------------------------------------------------------------
> a[2]=4*(T[2*n]-T[n])/(3*h^2)+O(h^2);
T[2 n] - T[n] 2
a[2] = 4/3 ------------- + O(h )
2
h
--------------------------------------------------------------------------------
# If we do several calculations and see that the values of 4*(T[2*n]-T[n])/(3*h^2) are
# stabilizing to a certain value then we may reasonably say that a[2] is this value. Once we
# have an idea of the value of a[2] we can control the first term in the error of the
# trapezoidal rule.
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=T[n]+a[2]*h^2+O(h^4);
b
/
| 2 4
| f(x) dx = T[n] + a[2] h + O(h )
|
/
a
--------------------------------------------------------------------------------
# For example, suppose we want to use the trapezoidal rule to estimate Int(f(x),x=a..b) to
# within 10^(-8). We do several calculations of the trapezoidal rule first to get an idea of
# the value of a[2], and then we choose the step size h so that abs(a[2]*h^2)<10^(-8).
# Assuming that the higher order terms O(h^4) can be ignored this step size should be
# sufficient.
--------------------------------------------------------------------------------
# We can apply this idea of extrapolating rules to Simpson's rule. Let S[n] denote
# Simpson(n). Recall that n must be even for Simpson's rule.
--------------------------------------------------------------------------------
> Simpson:=n->(h(n)/3)*sum(f(X(2*i,n))+4*f(X(2*i+1,n))+f(X(2*i+2,n)),i=0..n/2-1);
Simpson :=
/1/2 n - 1 \
| ----- |
| \ |
n -> 1/3 h(n) | ) (f(X(2 i, n)) + 4 f(X(2 i + 1, n)) + f(X(2 i + 2, n)))|
| / |
| ----- |
\ i = 0 /
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=S[n]+b[4]*h^4+ O(h^6);
b
/
| 4 6
| f(x) dx = S[n] + b[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=S[2*n]+(1/16)*b[4]*h^4+ O(h^6);
b
/
| 4 6
| f(x) dx = S[2 n] + 1/16 b[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
# Again we do elementary arithmetic on these last 2 formulas.
--------------------------------------------------------------------------------
> (16*"-"")/15;
b
/
| 16 6
| f(x) dx = ---- S[2 n] + O(h ) - 1/15 S[n]
| 15
/
a
--------------------------------------------------------------------------------
# Thus we have the "improved" approximation, improved in the sense that the first term in
# the error is now of order 6.
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=(16*S[2*n]-S[n])/15;
b
/
| 16
| f(x) dx = ---- S[2 n] - 1/15 S[n]
| 15
/
a
--------------------------------------------------------------------------------
# Of course we can also solve for b[4].
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=S[n]+b[4]*h^4+ O(h^6);
b
/
| 4 6
| f(x) dx = S[n] + b[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
> Int(f(x),x=a..b)=S[2*n]+(1/16)*b[4]*h^4+ O(h^6);
b
/
| 4 6
| f(x) dx = S[2 n] + 1/16 b[4] h + O(h )
|
/
a
--------------------------------------------------------------------------------
> "-"";
15 4
0 = S[2 n] - ---- b[4] h - S[n]
16
--------------------------------------------------------------------------------
# We have to add the big O term in.
--------------------------------------------------------------------------------
> b[4]*h^4=(16/15)*(S[2*n]-S[n])+O(h^6);
4 16 16 6
b[4] h = ---- S[2 n] - ---- S[n] + O(h )
15 15
--------------------------------------------------------------------------------
# This gives us the first order term in the error for S[n].
--------------------------------------------------------------------------------
> b[4]=(16/15)*(S[2*n]-S[n])/(h^4)+O(h^6);
16 S[2 n] - S[n] 6
b[4] = ---- ------------- + O(h )
15 4
h
--------------------------------------------------------------------------------
> Simpson[1]:=n->(16*Simpson(2*n)-Simpson(n))/15;
Simpson[1] := n -> 16/15 Simpson(2 n) - 1/15 Simpson(n)
--------------------------------------------------------------------------------
> a:=0:b:=1:n:='n':
--------------------------------------------------------------------------------