2016-12-19 4 views
1

を経由して関数を最小化することは本当に簡単です:のPython:私のコードがループ

import numpy 

def f(x): 
    return x**2 +1 

f_min=10 

for x in numpy.arange(-1,10,0.1): 
    if f(x)<f_min : 
     f_min=f(x) 
     x_min=x 
    else: 
     print (x_min) 

それは私に正しい結果(X - > 0)を与えるだけでなく、一度しかし、時代のたくさん。それはなぜですか、どうすればそのようにすることができますか?

+0

yes else節はすべての反復で最初の反復の後にループ内で実行されるためです。それを字下げしないでください。 @ JimFasarakis-Hilliardが言ったように –

+1

が言った。 forループでの印刷を停止します。あなたが最小値を更新するのに失敗するたびに、あなたは最小値が何であるかを表示します。 'else:print(x_min)' – piRSquared

+1

@ JimFasarakis-Hilliardを削除するか、 'else'を削除して' print'を0字下げのレベルにしてください。ここでは 'for'ループのためにあいまいな' else'機能を有効にする必要はありません:) –

答えて

1

あなたに言ったからです。 :-)

文が読めばあなた:

if I have a new minimum, record the value and position; 
otherwise, print the existing minimum. 

あなたが新しい最小を見つけることができません任意の時間を、あなたが印刷されます。この関数はあなたの範囲の初期段階で最小値を持つので、多くの出力が得られます。

グローバル最小値を1回だけ印刷する場合は、ループの外に移動します。この問題を解決するには

for x in numpy.arange(-1,10,0.1): 
    if f(x)<f_min : 
     f_min=f(x) 
     x_min=x 

print (x_min) 
1

、forループの外にprint文を移動:

import numpy 

def f(x): 
    return x**2 +1 

f_min=10 

for x in numpy.arange(-1,10,0.1): 
    if f(x)<f_min : 
     f_min=f(x) 
     x_min=x 

print (x_min) 

これを行うのはなぜ?さて、forループでprintステートメントを実行する前に、forループが実行されるたびに、ifステートメントが真でないときはいつでも、それが印刷されたので、印刷されたものがたくさんあります。今度は、forループから移動すると、一度しか印刷できず、プログラムは期待どおりに動作します。

+0

ありがとう!残念ながら私はあなたの両方が同じと言っても正しい答えを1つだけマークすることができます – user7248647

+0

問題はありません、私たちは同時に答えました=) – heather

関連する問題