#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)
включен ?
Мне это кажется очень нелогичным.
- Ссылка на SciPy
scipy.optimize.newton
: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html
Ответ №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 и касательная в какой-то момент пересекутся.