newton_krylov#
- scipy.optimize.newton_krylov(F, xin, iter=None, rdiff=None, метод='lgmres', inner_maxiter=20, inner_M=None, outer_k=10, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, линейный поиск='armijo', callback=None, **kw)#
Найти корень функции, используя приближение Крылова для обратной матрицы Якоби.
Этот метод подходит для решения крупномасштабных задач.
- Параметры:
- Ffunction(x) -> f
Функция, корень которой нужно найти; должна принимать и возвращать объект, подобный массиву.
- xinarray_like
Начальное приближение для решения
- rdifffloat, опционально
Относительный размер шага для использования в численном дифференцировании.
- методstr или callable, опционально
Метод Крылова для аппроксимации якобиана. Может быть строкой или функцией, реализующей тот же интерфейс, что и итеративные решатели в
scipy.sparse.linalg. Если строка, должна быть одной из:'lgmres','gmres','bicgstab','cgs','minres','tfqmr'.Значение по умолчанию
scipy.sparse.linalg.lgmres.- inner_maxiterint, необязательный
Параметр для передачи во "внутренний" решатель Крылова: максимальное количество итераций. Итерации остановятся после maxiter шагов, даже если заданная точность не достигнута.
- inner_MLinearOperator или InverseJacobian
Предобусловливатель для внутренней итерации Крылова. Обратите внимание, что вы также можете использовать обратные матрицы Якоби как (адаптивные) предобусловливатели. Например,
>>> from scipy.optimize import BroydenFirst, KrylovJacobian >>> from scipy.optimize import InverseJacobian >>> jac = BroydenFirst() >>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac))
Если предобуславливатель имеет метод с именем 'update', он будет вызван как
update(x, f)после каждого нелинейного шага, сxдавая текущую точку, иfтекущее значение функции.- outer_kint, необязательный
Размер подпространства, сохраняемого в течение нелинейных итераций LGMRES. См.
scipy.sparse.linalg.lgmresподробности.- inner_kwargskwargs
Ключевые параметры для 'внутреннего' решателя Крылова (определенного с метод). Имена параметров должны начинаться с inner_ префикс, который будет удалён перед передачей внутреннему методу. См., например,
scipy.sparse.linalg.gmresподробности.- iterint, необязательный
Количество итераций для выполнения. Если опущено (по умолчанию), выполняется столько, сколько требуется для достижения допусков.
- verbosebool, необязательно
Выводить статус в stdout на каждой итерации.
- maxiterint, необязательный
Максимальное количество итераций для выполнения. Если требуется больше для достижения сходимости,
NoConvergenceвызывается исключение.- f_tolfloat, опционально
Абсолютная погрешность (в max-норме) для невязки. Если опущена, по умолчанию равна 6e-6.
- f_rtolfloat, опционально
Относительная погрешность для невязки. Если опущено, не используется.
- x_tolfloat, опционально
Абсолютный минимальный размер шага, определяемый из приближения Якобиана. Если размер шага меньше этого, оптимизация завершается как успешная. Если опущено, не используется.
- x_rtolfloat, опционально
Относительный минимальный размер шага. Если опущено, не используется.
- tol_normfunction(vector) -> scalar, опционально
Норма для проверки сходимости. По умолчанию используется максимальная норма.
- линейный поиск{None, ‘armijo’ (по умолчанию), ‘wolfe’}, опционально
Какой тип линейного поиска использовать для определения размера шага в направлении, заданном приближением Якоби. По умолчанию ‘armijo’.
- callbackфункция, необязательный
Необязательная функция обратного вызова. Она вызывается на каждой итерации как
callback(x, f)где x является текущим решением и f соответствующий остаток.
- Возвращает:
- solndarray
Массив (аналогичного типа массива как x0) содержащий итоговое решение.
- Вызывает:
- NoConvergence
Когда решение не было найдено.
Смотрите также
rootИнтерфейс к алгоритмам нахождения корней для многомерных функций. См.
method='krylov'в частности.scipy.sparse.linalg.gmresscipy.sparse.linalg.lgmres
Примечания
Эта функция реализует решатель Ньютона-Крылова. Основная идея заключается в вычислении обратной матрицы Якоби с помощью итерационного метода Крылова. Эти методы требуют только вычисления произведений Якоби-вектор, которые удобно аппроксимируются конечной разностью:
\[J v \approx (f(x + \omega*v/|v|) - f(x)) / \omega\]Благодаря использованию итеративных матричных обращений, эти методы могут работать с большими нелинейными задачами.
SciPy
scipy.sparse.linalgмодуль предлагает выбор решателей Крылова. По умолчанию здесь используется lgmres, который является вариантом итерации GMRES с перезапуском, повторно использующим часть информации, полученной на предыдущих шагах Ньютона, для обращения матриц Якоби на последующих шагах.Для обзора методов Ньютона-Крылова см., например [1], и для разреженного обратного метода LGMRES, см. [2].
Ссылки
[1]C. T. Kelley, Solving Nonlinear Equations with Newton’s Method, SIAM, pp.57-83, 2003. DOI:10.1137/1.9780898718898.ch3
[2]D.A. Knoll и D.E. Keyes, J. Comp. Phys. 193, 357 (2004). DOI:10.1016/j.jcp.2003.08.010
[3]А.Х. Бейкер и Э.Р. Джессап и Т. Мантойфель, SIAM J. Matrix Anal. Appl. 26, 962 (2005). DOI:10.1137/S0895479803422014
Примеры
Следующие функции определяют систему нелинейных уравнений
>>> def fun(x): ... return [x[0] + 0.5 * x[1] - 1.0, ... 0.5 * (x[1] - x[0]) ** 2]
Решение может быть получено следующим образом.
>>> from scipy import optimize >>> sol = optimize.newton_krylov(fun, [0, 0]) >>> sol array([0.66731771, 0.66536458])