scipy.optimize.

newton#

scipy.optimize.newton(функция, x0, fprime=None, args=(), tol=1.48e-08, maxiter=50, fprime2=None, x1=None, rtol=0.0, full_output=False, disp=True)[источник]#

Найдите корень вещественной или комплексной функции, используя метод Ньютона-Рафсона (или секущих, или Халли).

Найти корень скалярной функции функция заданная начальная скалярная точка поблизости x0. Метод Ньютона-Рафсона используется, если производная fprime of функция предоставлена, в противном случае используется метод секущих. Если производная второго порядка fprime2 of функция также предоставлен, то используется метод Халли.

Если x0 является последовательностью с более чем одним элементом, newton возвращает массив: корни функции из каждой (скалярной) начальной точки в x0. В этом случае, функция должен быть векторизован для возврата последовательности или массива той же формы, что и его первый аргумент. Если fprime (fprime2) задано, то его возвращаемое значение также должно иметь ту же форму: каждый элемент является первой (второй) производной от функция относительно его единственной переменной, вычисленной в каждом элементе его первого аргумента.

newton предназначен для нахождения корней скалярных функций одной переменной. Для задач с несколькими переменными см. root.

Параметры:
функцияcallable

Функция, корень которой требуется найти. Это должна быть функция одной переменной вида f(x,a,b,c...), где a,b,c... являются дополнительными аргументами, которые могут быть переданы в args параметр.

x0float, sequence или ndarray

Начальное приближение корня, которое должно быть где-то рядом с фактическим корнем. Если не скаляр, то функция должна быть векторизована и возвращать последовательность или массив той же формы, что и её первый аргумент.

fprimeвызываемый объект, необязательный

Производная функции, если она доступна и удобна. Если равно None (по умолчанию), то используется метод секущих.

argsкортеж, необязательный

Дополнительные аргументы для использования в вызове функции.

tolfloat, опционально

Допустимая погрешность значения корня. Если функция имеет комплексные значения, больший tol рекомендуется как для действительной, так и для мнимой частей x внести вклад в |x - x0|.

maxiterint, необязательный

Максимальное количество итераций.

fprime2вызываемый объект, необязательный

Вторая производная функции, когда она доступна и удобна. Если None (по умолчанию), то используется обычный метод Ньютона-Рафсона или метод секущих. Если не None, то используется метод Халли.

x1float, опционально

Другая оценка корня, которая должна быть где-то рядом с фактическим корнем. Используется, если fprime не предоставлен.

rtolfloat, опционально

Допуск (относительный) для завершения.

full_outputbool, необязательно

Если full_output если False (по умолчанию), возвращается корень. Если True и x0 является скаляром, возвращаемое значение (x, r), где x является корнем и r является RootResults объект. Если True и x0 не является скаляром, возвращаемое значение (x, converged, zero_der) (подробности см. в разделе Returns).

dispbool, необязательно

Если True, вызывает RuntimeError, если алгоритм не сошелся, с сообщением об ошибке, содержащим количество итераций и текущее значение функции. В противном случае статус сходимости записывается в RootResults возвращаемый объект. Игнорируется, если x0 не является скаляром. Примечание: это мало связано с отображением, однако ключевое слово `disp` не может быть переименовано из-за обратной совместимости.

Возвращает:
rootfloat, sequence или ndarray

Оценённое местоположение, где функция равна нулю.

rRootResults, опционально

Присутствует, если full_output=True и x0 является скаляром. Объект, содержащий информацию о сходимости. В частности, r.converged равно True, если процедура сошлась.

сошёлсяndarray типа bool, опционально

Присутствует, если full_output=True и x0 не является скаляром. Для векторных функций указывает, какие элементы успешно сошлись.

zero_derndarray типа bool, опционально

Присутствует, если full_output=True и x0 не является скаляром. Для векторных функций указывает, какие элементы имели нулевую производную.

Смотрите также

root_scalar

интерфейс к решателям уравнений для скалярных функций

root

интерфейс к решателям уравнений для функций с несколькими входами и выходами

Примечания

Скорость сходимости метода Ньютона-Рафсона квадратичная, метода Халлея кубическая, а метода секущих субквадратичная. Это означает, что если функция хорошо себя ведет, фактическая ошибка в оцененном корне после n-й итерации приблизительно равна квадрату (кубу для Халлея) ошибки после (n-1)-го шага. Однако используемый здесь критерий остановки - это размер шага, и нет гарантии, что корень найден. Следовательно, результат следует проверить. Более безопасные алгоритмы - brentq, brenth, ridder и bisect, но все они требуют, чтобы корень сначала был заключен в интервал, где функция меняет знак. Алгоритм brentq рекомендуется для общего использования в одномерных задачах, когда такой интервал найден.

Когда newton используется с массивами, он лучше всего подходит для следующих типов задач:

  • Начальные приближения, x0, все находятся на относительно одинаковом расстоянии от корней.

  • Некоторые или все дополнительные аргументы, args, также являются массивами, чтобы класс похожих задач мог решаться вместе.

  • Размер начальных приближений, x0, больше, чем O(100) элементов. В противном случае, простой цикл может работать так же хорошо или лучше, чем векторный.

Примеры

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy import optimize
>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1

fprime не предоставлен, использовать метод секущих:

>>> root = optimize.newton(f, 1.5)
>>> root
1.0000000000000016
>>> root = optimize.newton(f, 1.5, fprime2=lambda x: 6 * x)
>>> root
1.0000000000000016

Только fprime предоставлен, используйте метод Ньютона-Рафсона:

>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2)
>>> root
1.0

Оба fprime2 и fprime предоставлены, используйте метод Халли:

>>> root = optimize.newton(f, 1.5, fprime=lambda x: 3 * x**2,
...                        fprime2=lambda x: 6 * x)
>>> root
1.0

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

>>> f = lambda x, a: x**3 - a
>>> fder = lambda x, a: 3 * x**2
>>> rng = np.random.default_rng()
>>> x = rng.standard_normal(100)
>>> a = np.arange(-50, 50)
>>> vec_res = optimize.newton(f, x, fprime=fder, args=(a, ), maxiter=200)

Вышеуказанное эквивалентно решению для каждого значения в (x, a) отдельно в цикле for, просто быстрее:

>>> loop_res = [optimize.newton(f, x0, fprime=fder, args=(a0,),
...                             maxiter=200)
...             for x0, a0 in zip(x, a)]
>>> np.allclose(vec_res, loop_res)
True

Построить график результатов, найденных для всех значений a:

>>> analytical_result = np.sign(a) * np.abs(a)**(1/3)
>>> fig, ax = plt.subplots()
>>> ax.plot(a, analytical_result, 'o')
>>> ax.plot(a, vec_res, '.')
>>> ax.set_xlabel('$a$')
>>> ax.set_ylabel('$x$ where $f(x, a)=0$')
>>> plt.show()
../../_images/scipy-optimize-newton-1.png