2011-12-09 4 views
0

私自身の方法でコードを作成しようとしましたが、間違った答えが見つかりました。MITについて6.00 course lec06 - ニュートンの方法

私はthis page.を読み込んで処理を開始しようとしている:

enter image description here

F(x)= x^2と-E

数学:

enter image description here

をだから私のコード:

def sqrtRootNR(num, count, epsl): 
    """ 
    for test 
    """ 
    num = float(num) 
    guess = num/2.0 
    diff = guess ** 2.0 - num 
    _cnt = 0 
    while abs(diff) > epsl and _cnt < count: 
     guess = guess - (guess ** 2.0 + epsl)/(guess * 2.0) 
     diff = guess ** 2.0 - num 
     _cnt = _cnt +1 
    print guess, _cnt 

sqrtRootNR(2, 100, 0.0001) 

しかし、私は間違った答えを得ました。

この関数の出力は、次のとおり

D:\ POC> Pythonのsq.py

0.0595177826557 100

+3

どのような回答を得ましたか?あなたはどんな答えを期待しましたか?中間値を印刷しましたか?彼らはあなたの手動計算に対応していましたか? –

+1

'f(x)とは何ですか?それは 'f(x)= sqrt(x)'であり、あなたは 'f(x)= num'を解いていますか? – ja72

答えて

1

(guess ** 2.0 + epsl)から(guess ** 2 - num)に変更してください。あなたはあなたのエラーに比例した金額、すなわちステップごとにあなたの見積もりを調整したいと思います。あなたのdiff変数。

6
プログラミングにおける一つの重要な技術はここされる情報を知っている

一番便利。あなたはいくつかの簡単なデバッグ情報を追加する場合:

while abs(diff) > epsl and _cnt < count: 
    guess = guess - (guess ** 2.0 + epsl)/(guess * 2.0) 
    diff = guess ** 2.0 - num 
    print guess, _cnt 
    _cnt = _cnt +1 
print guess, _cnt 

あなたはあなたのプログラムが間違ってすぐに行くことがわかります。

$ ./sqrt.py 
0.49995 0 
0.249874989999 1 
0.124737394941 2 
0.0619678553654 3 
0.0301770577385 4 
0.0134316410297 5 
0.00299326718803 6 
-0.0152075217183 7 
-0.00431591416548 8 
0.00942707405618 9 
-0.000590335594744 10 
.... 
それが負になるまでの動作が非常になったときに、番号ごとに反復を半減するように見える

一目でわかりにくい。しかし、最初の数回の反復が間違っていることは明らかです。

私にはかなり怪しいに見える何か:(guess ** 2.0 + epsl)

平方根のためのニュートン法を評価する際にあなたが実際にイプシロンを使用してはならない - 結局のところ、あなたはエラーが以下であることを確認しようとしていますイプシロン。

1

また、あなたは、関数f = X^2 + eps1のゼロを探しているように見えますguess = 0.5 * (guess + num/guess)

2

を使用することができます。 eps1が正の場合、実際のゼロは存在しません。これは、あなたが見たように、あなたのプログラムがある時点の後に永久に0周りに振動することを意味します。 eps1を負の値に設定すると、ルートが見つかるはずです。

ニュートンの方法は防弾ではなく、発散する場合があります。

関連する問題