0

私は独自の方法でコーディングしようとしましたが、間違った答えが得られたことがわかりました。

このページを読みました。そして、プロセスを開始してみてください:

ここに画像の説明を入力

f(x)=x^2-e

数学:

ここに画像の説明を入力

だから私のコードがあります:

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

4

4 に答える 4

6

プログラミングの重要なスキルの 1 つは、どの情報がどこで最も役立つかを知ることです。簡単なデバッグ情報を追加すると、次のようになります。

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)

平方根のニュートン法を評価するときは、実際にはイプシロンを使用しないでください。結局のところ、エラーがイプシロンよりも小さいことを確認しようとしています。

于 2011-12-09T02:31:28.900 に答える
2

関数f=x ^ 2+eps1のゼロを探しているようです。eps1が正の場合、実際のゼロはありません。これは、あなたが見たように、あなたのプログラムが特定のポイントの後に永遠に0の周りで振動することを意味します。eps1を負の値に設定すると、ルートが見つかると思います。

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

于 2011-12-09T04:19:58.797 に答える
1

式を に変更(guess ** 2.0 + epsl)(guess ** 2 - num)ます。エラーに比例する量だけ、すべてのステップで見積もりを調整したいと考えています。あなたのdiff変数。

于 2011-12-09T02:35:43.313 に答える
1

また、使用することができますguess = 0.5 * (guess + num/guess)

于 2011-12-09T02:39:29.647 に答える