2

私のプログラムは、ニュートンのアルゴリズムを使用して根を見つけます。ルートが見つからないことを印刷するルートを見つけるのに十分な反復がない場合、最後の部分に問題があります。

for i in range(N):
    f= evaluate(p,deg,x0)
    s=evaluate(d,deg-1,x0)
    if s==0:
        print "Can't divide by 0"
        return -1
    x1=x0 - f/s
    print ("Iteration %d" %(i+1))
    print "%f" %x0
    if abs(x1-x0)<tol:
        print "Found a root %f" %x1
        return 0
    else:
        x0=x1
    if abs(x1-x0)>tol:
       print "root not found"

どういうわけか、最後のifステートメントをスキップして何も出力しないようです。別の場所に配置しようとしました。前のifステートメントの前に配置すると、x0 = x1部分がスキップされます。何が悪いのか混乱しています。

N は反復回数、x0 は初期推定値です。

4

2 に答える 2

1

ルートが見つからないことを表示するロジックが正しくありません。abs(x0 - x1) > tolこれはルートの検索には関係ないため、チェックする必要はありません。考えてみてください。 と の間の差は非常に大きい可能性がx0ありx1ますが、根を見つけるための正しい軌道に乗っている可能性があります。一部の反復とx1は異なるという理由だけで、反復から飛び出したくはありません。x0

for次のように、ループの外側にエラー ステートメントを配置することをお勧めします。

for i in range(N):
    f = evaluate(p,deg,x0)
    s = evaluate(d,deg-1,x0)

    if s==0:
        print "Can't divide by 0"
        return -1
    x1=x0 - f/s
    print ("Iteration %d" %(i+1))
    print "%f" %x0
    if abs(x1-x0)<tol:
        print "Found a root %f" %x1
        return 0
    else:
        x0=x1

# If we exhaust the for-loop without returning due to
# a found root, then there must have been an error with
# convergence, so just print that at exit.
print "Error: did not converge to the root in %d iterations."%(N)
print "Check your initial guess and check your functions for cyclic points."
于 2012-04-12T01:28:07.723 に答える
0

ニュートンの方法で永遠に何もしていないので、あなたが望むのはもっと似ていると思います:

x1 = sys.maxint # the first iteration is a throw-away
                # you could do this a different way, but you have a lot of global 
                # variables that I don't know how to handle.
for i in range(N):
    # ....
    if abs(x1-x0)<tol:
        # ...

    # you want these two lines together, somehow.
    x0 = x1
    x1 = x0 - f/s

    #...
    # no "else" down here

# no "if abs(x1-x0)>tol:", because it's taken care of by the return(0)
# earlier. Also note the unindent.
print "root not found"
于 2012-04-12T01:24:00.580 に答える