from math import exp, sin, cos, log10
def f(x):
return exp(sin(2*x))
def fprime(x):
return 2*exp(sin(2*x))*cos(2*x)
def calc_fd(f,x,h):
fd = (f(x+h) - f(x))/h
return fd
def calc_cd(f,x,h):
cd = (f(x+h/2) - f(x-h/2))/h
return cd
if __name__ == '__main__':
x = 0.5
an = fprime(x) # Analytical result
hs = [10**(-i) for i in range(1,7)]
rowf = "{0:1.0e} {1:1.16f} {2:1.16f}"
print("h abs. err. rich fd abs. err. rich cd")
for h in hs:
fdrich = 2*calc_fd(f,x,h/2) - calc_fd(f,x,h) # forward-difference Richardson
fd = abs(fdrich-an)
cdrich = (4*calc_cd(f,x,h/2) - calc_cd(f,x,h))/3 # -difference Richardson
cd = abs(cdrich-an)
print(rowf.format(h,fd,cd))h abs. err. rich fd abs. err. rich cd
1e-01 0.0259686059827384 0.0000098728370874
1e-02 0.0002695720500006 0.0000000009897421
1e-03 0.0000027005434182 0.0000000000011098
1e-04 0.0000000270109117 0.0000000000043667
1e-05 0.0000000003389138 0.0000000000280513
1e-06 0.0000000006941852 0.0000000002500959
