次の関数を使用して、ある点での関数の導関数を近似しています。
def prime_x(f, x, h):
if not f(x+h) == f(x) and not h == 0.0:
return (f(x+h) - f(x)) / h
else:
raise PrecisionError
テストとして、私は3.0として合格f
しfx
ています。x
どこfx
にある:
def fx(x):
import math
return math.exp(x)*math.sin(x)
これはexp(x)*(sin(x)+cos(x))
導関数として持っています。さて、Googleと私の電卓によると
exp(3)*(sin(3)+cos(3)) = -17.050059
.
ここまでは順調ですね。しかし、小さい値で関数をテストすることにしたときh
、次の結果が得られました。
print prime_x(fx, 3.0, 10**-5)
-17.0502585578
print prime_x(fx, 3.0, 10**-10)
-17.0500591423
print prime_x(fx, 3.0, 10**-12)
-17.0512493014
print prime_x(fx, 3.0, 10**-13)
-17.0352620898
print prime_x(fx, 3.0, 10**-16)
__main__.PrecisionError: Mantissa is 16 digits
h が減少すると (ある時点以降)、エラーが増加するのはなぜですか? f(x+h)
が に等しくなるまで逆を期待していましたf(x)
。