2016-10-19 6 views
1

私はデルタおよびイプシロンを使用して、ルートを立方体findsがプログラムを記述しようとしていますが、私のプログラムが無限ループで実行されますなぜ私が把握カントので、私はこだわっている中で、デルタとイプシロンを使用して乗根を見つけるは、Python

num = 100 

    epsilon = 0.01 
    guess = num/3.0 


    while abs(guess**3 - num) >= epsilon: 
     delta = abs(guess**3 - num)/100 
     if guess**3 > num: 
      guess = (guess - delta) 
     if guess**3 < num: 
      guess = (guess + delta) 
    print("Guess:", guess) 
+0

私の推測では、** 3あなたの 'の推測ということです - num'は' epsilon' –

+0

未満だ値に収束したことがない私は、問題の根本ので、オフトピックとして、この質問を閉じるために投票しています不正な数学的アルゴリズムです。 –

+0

あなたの推測がより正確になるほど、デルタは小さくなります。下位と下位の値を加算/減算し続けます。 – Stumpp

答えて

2

まず、別のifブロックの代わりにif/elifを使用する必要があります。

次のことを考えてみましょう: guess**3 > numTrueときguess**3 < num(条件ならば、次は)最初の更新を逆転させた、再びTrueになるように、あなたはその値を減らすことによってguessを更新します。要約すると、guessの値は決してそのループで変更されず、ループは無限大に旋回します。

numの値が大きくなると大きな値になるため、deltaの値を正則にしたい(ペナルティをかけます)。

num = 100 

epsilon = 0.01 
guess = num/3.0 

while abs(guess**3 - num) >= epsilon: 
    delta = abs(guess**3 - num)/num 
    if guess**3 > num: 
     guess = (guess - delta*epsilon**0.5) 
    elif guess**3 < num: 
     guess = (guess + delta*epsilon**0.5) 
print("Guess:", guess) 
+0

はい、「等価分岐」を忘れないでください: 'guess ** 3> = num' –

+0

@EugenKonkov Good平等は「推測」の更新を必要としない。条件が次の反復で評価されるとき、等価は単純にwhileループを停止します。 –