2017-05-26 3 views
0
def differentiate(fn,lvl,value): 
    d=0.0000001 
    if lvl==0: 
     return fn(value) 
    else: 
     return (differentiate(fn,lvl-1,value+d)-differentiate(fn,lvl-1,value))/d 
def i(x): 
    return 1 + x + x**2 + x**3 + x**4 +x**5+x**6 

私はlvlがiが微分された回数であるi(lvl)(0)を見つけようとしています。私のコードが異なるdに対してまったく異なる出力を与える理由はわかりません。例えば任意のヘルプ:)関数のn次微分値の求め方は?

をappretiateます、

for x in range(7): 
    print(differentiate(i,x,0)) 

私が得ることを期待:1,1,2,6,24,120,720。 しかし、私はdの値によって異なる値を得ています。

+0

ようこそ、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供し、[良い質問をします](http://stackoverflow.com/あなたの質問に答えられる可能性を高めるために、あなたの質問に答えてください。現在、それは不明確で再現性がありません。 – Nuageux

+0

あなたはおそらく[破滅的な取り消し](https://en.wikipedia.org/wiki/Loss_of_significance)に出くわしているでしょう。 –

+0

数字ではなく解析的にアプローチできますか? – fafl

答えて

2

問題は分かりやすいです。あなたはこのようなf(0 + d)などの値を評価している

、すなわち

1 + 0.0000001 + 0.0000001² + 0.0000001³ + 0.0000001^4 + 5 0.0000001^5 = 
1.00000010000001000000100000010000005 

倍精度浮動小数点数は約15桁を表現することができます。

高次の数値微分は非常に困難です。

関連する問題