2016-12-19 17 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) 

Это дает мне правильный результат (х -> 0), но не только один раз, а много раз. Почему это и как я могу удержать его от этого?

+0

yes, потому что ваше предложение 'else' выполняется в цикле после первой итерации для каждой итерации. Отменить его. –

+1

как @ JimFasarakis-Hilliard сказал. Остановите печать в цикле for. На каждой итерации вы не обновляете минимум, вместо этого вы печатаете, что такое минимум. Избавьтесь от 'else: print (x_min)' – piRSquared

+1

@ JimFasarakis-Hilliard или просто удалите 'else' и поставьте' print' на уровне 0-indent. Не нужно включать скрытые функции 'else' для цикла' for' здесь :) –

ответ

1

Потому что вы сказали это. :-)

Ваш если заявление гласит:

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

Каждый раз, когда вы не можете найти нового минимума, печати. Поскольку эта функция имеет свой минимум в начале диапазона, вы получаете много выходных данных.

Если вы хотите, чтобы глобальный минимум печатался только один раз, сделайте это только один раз: переместите его за пределы цикла.

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

Чтобы это исправить, переместите оператор печати из для цикла:

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, каждый раз, когда цикл for прошел, всякий раз, когда оператор if не был прав, он печатался, поэтому вы получили кучу печатных вещей. Теперь, когда вы перемещаете его из цикла for, его можно печатать только один раз, и программа работает так, как вы ожидаете.

+0

спасибо! к сожалению, я могу только отметить один ответ как правильный, хотя вы оба сказали то же самое – user7248647

+0

не проблема, мы ответили в то же время =) – heather

 Смежные вопросы

  • Нет связанных вопросов^_^