scipy.optimize.

NonlinearConstraint#

класс scipy.optimize.NonlinearConstraint(fun, lb, ub, jac='2-point', hess=None, keep_feasible=False, finite_diff_rel_step=None, finite_diff_jac_sparsity=None)[источник]#

Нелинейное ограничение на переменные.

Ограничение имеет общую форму неравенства:

lb <= fun(x) <= ub

Здесь вектор независимых переменных x передаётся как ndarray формы (n,) и fun возвращает вектор с m компонентами.

Можно использовать равные границы для представления ограничения равенства или бесконечные границы для представления одностороннего ограничения.

Параметры:
funcallable

Функция, определяющая ограничение. Сигнатура: fun(x) -> array_like, shape (m,).

lb, ubarray_like

Нижние и верхние границы ограничения. Каждый массив должен иметь форму (m,) или быть скаляром, в последнем случае граница будет одинаковой для всех компонентов ограничения. Используйте np.inf с соответствующим знаком для указания одностороннего ограничения. Установите компоненты lb и ub равно для представления ограничения равенства. Обратите внимание, что можно смешивать ограничения разных типов: интервальные, односторонние или равенства, устанавливая разные компоненты lb и ub при необходимости.

jac{callable, ‘2-point’, ‘3-point’, ‘cs’}, optional

Метод вычисления матрицы Якоби (матрица m×n, где элемент (i, j) — частная производная f[i] по x[j]). Ключевые слова {‘2-point’, ‘3-point’, ‘cs’} выбирают схему конечных разностей для численной оценки. Вызываемый объект должен иметь следующую сигнатуру:

jac(x) -> {ndarray, sparse array}, shape (m, n)

По умолчанию '2-point'.

hess{callable, ‘2-point’, ‘3-point’, ‘cs’, HessianUpdateStrategy, None}, optional

Метод вычисления матрицы Гессе. Ключевые слова {‘2-point’, ‘3-point’, ‘cs’} выбирают схему конечных разностей для численной оценки. Альтернативно, объекты, реализующие HessianUpdateStrategy интерфейс может использоваться для аппроксимации гессиана. В настоящее время доступны реализации:

  • BFGS (опция по умолчанию)

  • SR1

Вызываемый объект должен возвращать матрицу Гессе dot(fun, v) и должен иметь следующую сигнатуру: hess(x, v) -> {LinearOperator, sparse array, array_like}, shape (n, n). Здесь v является ndarray с формой (m,), содержащим множители Лагранжа.

keep_feasiblearray_like из bool, необязательный

Сохранять ли компоненты ограничений выполнимыми на протяжении всех итераций. Единое значение устанавливает это свойство для всех компонентов. По умолчанию False. Не влияет на ограничения-равенства.

finite_diff_rel_step: None или array_like, опционально

Относительный размер шага для аппроксимации конечными разностями. По умолчанию None, что автоматически выберет разумное значение в зависимости от схемы конечных разностей.

finite_diff_jac_sparsity: {None, array_like, sparse array}, необязательный

Определяет структуру разреженности матрицы Якоби для оценки конечными разностями, её форма должна быть (m, n). Если матрица Якоби имеет только несколько ненулевых элементов в каждый row, предоставление структуры разреженности значительно ускорит вычисления. Нулевой элемент означает, что соответствующий элемент в матрице Якоби тождественно равен нулю. Если предоставлено, принудительно используется решатель trust-region 'lsmr'. Если None (по умолчанию), будет использоваться плотное дифференцирование.

Примечания

Схемы конечных разностей {'2-point', '3-point', 'cs'} могут использоваться для аппроксимации либо якобиана, либо гессиана. Однако мы не разрешаем их использование для аппроксимации обоих одновременно. Поэтому всякий раз, когда якобиан оценивается через конечные разности, мы требуем, чтобы гессиан оценивался с использованием одной из стратегий квази-Ньютона.

Схема 'cs' потенциально наиболее точна, но требует, чтобы функция корректно обрабатывала комплексные входные данные и была аналитически продолжаема на комплексную плоскость. Схема '3-point' точнее, чем '2-point', но требует вдвое больше операций.

Примеры

Ограничить x[0] < sin(x[1]) + 1.9

>>> from scipy.optimize import NonlinearConstraint
>>> import numpy as np
>>> con = lambda x: x[0] - np.sin(x[1])
>>> nlc = NonlinearConstraint(con, -np.inf, 1.9)