import numpy as np
# n intervals, n+1 points
def trapz(a,b,n,f):
h = (b-a)/n
x = np.linspace(a,b,n+1)
y = f(x)
res = np.sum(y[1:n]) + 0.5*(y[0] + y[n])
return h*res
Exact integral is 0.5
f = lambda x: x
print("Integral = ", trapz(0.0,1.0,10,f))
Integral = 0.5
Exact integral is $1/3$
f = lambda x: x**2
print("Integral = ", trapz(0.0,1.0,10,f))
Integral = 0.3350000000000001
The exact integral is $-\frac{1}{2}(1+\exp(\pi))$.
f = lambda x: np.exp(x)*np.cos(x)
qe = -0.5*(1.0 + np.exp(np.pi)) # Exact integral
n,N = 4,10
e = np.zeros(N)
for i in range(N):
e[i] = trapz(0.0,np.pi,n,f) - qe
if i > 0:
print('%6d %24.14e %14.5e'%(n,e[i],e[i-1]/e[i]))
else:
print('%6d %24.14e'%(n,e[i]))
n = 2*n
4 -1.26567653098185e+00 8 -3.11816113365945e-01 4.05905e+00 16 -7.76577835071954e-02 4.01526e+00 32 -1.93958006245669e-02 4.00385e+00 64 -4.84778281250620e-03 4.00096e+00 128 -1.21187271271594e-03 4.00024e+00 256 -3.02963615787633e-04 4.00006e+00 512 -7.57406187865683e-05 4.00002e+00 1024 -1.89351368735657e-05 4.00000e+00 2048 -4.73378310594796e-06 4.00000e+00
An example of a periodic function $$ f(x) = \exp(\sin(x)), \qquad x \in [0,2\pi] $$
f = lambda x: np.exp(np.sin(x))
qe = 7.9549265210128 # Exact integral
n,N = 2,15
e = np.zeros(N)
for i in range(N):
e[i] = trapz(0.0,2*np.pi,n,f) - qe
print('%6d %24.14e'%(n,e[i]))
n = n + 1
2 -1.67174121383321e+00 3 -2.82600848168890e-04 4 3.43969188092368e-02 5 -3.45941231216784e-09 6 -2.82600848168890e-04 7 3.46389583683049e-14 8 1.25168897735506e-06 9 4.52970994047064e-14 10 -3.45941053581100e-09 11 4.44089209850063e-14 12 6.57429666262033e-12 13 4.35207425653061e-14 14 3.46389583683049e-14 15 4.44089209850063e-14 16 4.61852778244065e-14
The error converges rapidly to machine zero. It is very small for even number of points.
n,N = 3,10
e = np.zeros(N)
for i in range(N):
e[i] = trapz(0.0,2*np.pi,n,f) - qe
print('%6d %24.14e'%(n,e[i]))
n = n + 2
3 -2.82600848168890e-04 5 -3.45941231216784e-09 7 3.46389583683049e-14 9 4.52970994047064e-14 11 4.44089209850063e-14 13 4.35207425653061e-14 15 4.44089209850063e-14 17 4.52970994047064e-14 19 4.52970994047064e-14 21 4.52970994047064e-14