Ошибка переполнения при использовании метода Ньютона в Python

Я пытаюсь выполнить метод Ньютона в Python для решения проблемы. Я следовал подходу некоторых примеров, но получаю ошибку переполнения. У вас есть какие-либо идеи, что вызывает это?

def f1(x):
    return x**3-(2.*x)-5.

def df1(x):
    return (3.*x**2)-2.


def Newton(f, df, x, tol):

    while True:
        x1 = f(x) - (f(x)/df(x))

        t = abs(x1-x)

        if t < tol:
            break
        x = x1

    return x


init = 2



print Newton(f1,df1,init,0.000001)

person alkey    schedule 11.05.2014    source источник
comment
Почему вы не используете docs.scipy.org/doc/scipy/reference/ оптимизировать.html ? FWIW, мой любимый fmin_l_bfgs_b. Пробовали ли вы использовать функцию для проверки согласованности вашей цели и градиента?   -  person jrennie    schedule 11.05.2014
comment
Это может быть домашнее задание.   -  person Ramchandra Apte    schedule 11.05.2014


Ответы (3)


Метод Ньютона

Метод Ньютона

so x1 = f(x) - (f(x)/df(x))

должно быть

x1 = x - (f(x)/df(x))

person Ramchandra Apte    schedule 11.05.2014
comment
Итак, мое решение работает? Если это так, вы можете принять это. - person Ramchandra Apte; 11.05.2014

В вашем коде есть ошибка. Так должно быть

def Newton(f, df, x, tol):

    while True:
        x1 = x - (f(x)/df(x))  # it was f(x) - (f(x)/df(x))

        t = abs(x1-x)

        if t < tol:
            break
        x = x1

    return x
person Anthony Kong    schedule 11.05.2014

Уравнение, которое вы решаете, является кубическим, поэтому есть два значения x, при которых df(x)=0. Деление на ноль или значение, близкое к нулю, приведет к переполнению, поэтому этого следует избегать.

Одним из практических соображений алгоритма Ньютона является то, как обрабатывать значения x вблизи локальных максимумов или минимумов. Переполнение, вероятно, вызвано делением на что-то близкое к нулю. Вы можете показать это, добавив оператор печати перед строкой x= -- напечатайте x и df(x). Чтобы избежать этой проблемы, вы можете вычислить df(x) перед делением, и если оно ниже некоторого порога, немного увеличить или уменьшить значение x и повторить попытку.

person Chris Johnson    schedule 11.05.2014