scipy.optimize.

NonlinearConstraint#

class 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 的向量作为形状为 (n,) 的 ndarray 传递,fun 返回一个具有 m 个分量的向量。

可以使用相等边界来表示等式约束,或使用无限边界来表示单边约束。

参数:
fun可调用对象

定义约束的函数。签名为 fun(x) -> array_like, 形状 (m,)

lb, ubarray_like

约束的下限和上限。每个数组必须具有形状 (m,) 或为标量,在后一种情况下,边界对于约束的所有分量都相同。使用 np.inf 和适当的符号来指定单边约束。设置 lbub 的分量相等以表示等式约束。请注意,您可以通过根据需要设置 lbub 的不同分量来混合不同类型的约束:区间、单边或等式。

jac{可调用对象, ‘2-point’, ‘3-point’, ‘cs’}, 可选

计算雅可比矩阵(一个 m×n 的矩阵,其中元素 (i, j) 是 f[i] 关于 x[j] 的偏导数)的方法。关键字 {‘2-point’,‘3-point’,‘cs’} 选择用于数值估计的有限差分方案。可调用对象必须具有以下签名

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

默认值为 ‘2-point’。

hess{可调用对象, ‘2-point’, ‘3-point’, ‘cs’, HessianUpdateStrategy, None}, 可选

计算黑塞矩阵的方法。关键字 {‘2-point’,‘3-point’,‘cs’} 选择用于数值估计的有限差分方案。或者,可以使用实现 HessianUpdateStrategy 接口的对象来逼近黑塞矩阵。当前可用的实现有

可调用对象必须返回 dot(fun, v) 的黑塞矩阵,并且必须具有以下签名:hess(x, v) -> {LinearOperator, sparse matrix, array_like}, 形状 (n, n)。此处,v 是形状为 (m,) 的 ndarray,其中包含拉格朗日乘数。

keep_feasiblebool 类型的 array_like,可选

是否在整个迭代过程中保持约束分量的可行性。单个值将为此属性设置所有分量。默认值为 False。对等式约束无效。

finite_diff_rel_step:None 或 array_like,可选

有限差分近似的相对步长。默认值为 None,这将根据有限差分方案自动选择合理的值。

finite_diff_jac_sparsity:{None, array_like, sparse matrix}, 可选

定义用于有限差分估计的雅可比矩阵的稀疏结构,其形状必须为 (m, n)。如果雅可比矩阵在行中只有少量非零元素,则提供稀疏结构将大大加快计算速度。零项表示雅可比矩阵中的相应元素恒等于零。如果提供,则强制使用 ‘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)