аргумент scipy.optimize.newton — допуск tol относится не к результатам функции, а к допуску входных данных?

#python #scipy #scipy-optimize

Вопрос:

Я хотел решить функцию, близкую к 0.

Я попытался использовать функцию Ньютона в пакете Scipy, но допуск, похоже, применяется к входу, а не к функции ввода:

 from scipy.optimise import newton
fn = lambda x: x*x-60
res = newton(fn, 0, tol=0.1, maxiter=10000)
print(res)
print(fn(res))
 

res близка к 0 и fn(res) составляет около -60.
Похоже newton() , что он остановился, потому что он нашел два значения x, которые ограничивают решение и находятся в пределах допуска.

Правильно ли, что допуск включен x , а не fn(x) включен ?

Мне это кажется очень нелогичным.

Ответ №1:

Да, допуск относится к аргументу функции x функции f(x). Смотрите здесь: zeros.py Код проверяет, достаточно ли мал шаг от p0 до p (в своем коде они называют аргумент функции p, а не x), и если да, алгоритм останавливается.

На самом деле вы используете секущий метод, а не метод Ньютона, потому что вы не предоставили производную своей функции. Используйте newton(func=lambda x: x*x-60, fprime=lambda x:2*x, x0=0, tol=0.1, maxiter=10000) вместо этого.

Когда вы запускаете приведенный выше код, вы получаете сообщение об ошибке. Это связано с тем, что вы начинаете с локального минимума вашей функции, где касательная линия параллельна оси x. На каждой итерации метод Ньютона переходит в положение, в котором пересекаются касательная линия и ось x. Это, конечно, невозможно, если ось x и касательная параллельны. Попробуйте начать, например, с x0=0.1, чтобы получить правильный вывод. На графике ниже показана ваша квадратичная функция и касательные линии при x=0 и x=2. Легко видеть, что, начиная с x0=2, работает, потому что ось x и касательная в какой-то момент пересекутся.

введите описание изображения здесь