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
Оценённое местоположение, где функция равна нулю.
- r
RootResults, опционально Присутствует, если
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()