6

次の関数を使用して、ある点での関数の導関数を近似しています。

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として合格ffxています。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)

4

2 に答える 2

6

ほぼ同じ 2 つの数値を減算すると、結果の精度はどちらの入力よりもはるかに低くなります。これにより、全体的な結果の精度が低下します。

次の 2 つの数値があるとします。小数点以下 15 桁まで有効です。

  1.000000000000001
- 1.000000000000000
= 0.000000000000001

何が起こったのですか?結果は 1 桁しかありません。

于 2013-09-25T02:25:15.610 に答える