Код пропускает цикл, даже если условие оценивается как истинное

Я не могу заставить эту часть моей программы войти в цикл while. После подстановки значений для poly, x_0 и epsilon программа вычисляет значение для ans с помощью функции evaluate_poly(), которая работает правильно и в моем конкретном случае дает ответ -13.2119. Мое используемое значение эпсилон равно 0.0001. Поскольку abs(ans) на самом деле больше, чем epsilon, почему он пропускает цикл?

Я разместил оператор print ans прямо под строкой x_01 = 0, чтобы убедиться, что он правильно вычисляет перед циклом while, а также оператор print epsilon, чтобы убедиться, что он правильно принимает мое значение epsilon (что он и делает).

def compute_root(poly, x_0, epsilon):
    """uses newton's method to find a root of a polynomial function"""

    ans = evaluate_poly(poly, x_0)
    x_01 = 0

    while abs(ans) > epsilon:

        Dpoly = compute_deriv(poly)
        Fprime = evaluate_poly(Dpoly, x_01)
        return ans

        x_01 = x_0 - (ans/Fprime)
        print x_01
        return x_01

    print ans

person Brad Galpin    schedule 15.06.2013    source источник
comment
>>> abs(-13.2119) > 0.0001 возвращает True   -  person njzk2    schedule 16.06.2013


Ответы (2)


Вы помещаете два оператора return в свой цикл. При первом попадании функция завершается только мгновенно. Таким образом, не только цикл while завершается в первом цикле, но операторы печати никогда не достигаются.

person kirbyfan64sos    schedule 15.06.2013

У вас есть return ans внутри вашего цикла. Таким образом, в этот момент функция завершится, и print никогда не будет достигнуто.

Если ans действительно равно -13.2119, то он входит в цикл, просто он не выполняет все в нем из-за return.

Даже если убрать строку return ans внутри цикла, в его конце тоже будет return x_01. Таким образом, в этом случае цикл будет выполняться не более одного раза, что сделает его таким же, как оператор if.

person interjay    schedule 15.06.2013
comment
поэтому, если я добавлю return в конец тела функции, он выполнит остальную часть тела? цель программы - найти значение x_0, которое даст ответ ‹ 0,0001 (не уверен, имеет ли это какое-то значение для вашего ответа или нет, лол) - person Brad Galpin; 16.06.2013
comment
@BradGalpin: вам нужно удалить операторы return из цикла, потому что они немедленно выйдут из функции. Но сейчас ans не обновляется внутри цикла, поэтому он будет работать бесконечно. Вам нужно обновить ans до нового значения в цикле. И вы, вероятно, хотите вернуть x, а не ans в конце. - person interjay; 16.06.2013
comment
ах, ладно, я думал, что оператор return обновит значение выше цикла while, а затем заставит его переоценить цикл while. Кроме того, операторы печати в цикле while были нужны только для того, чтобы помочь мне определить, где что-то происходило/не происходило. Спасибо за помощь - person Brad Galpin; 16.06.2013