非线性约束#
- class scipy.optimize.NonlinearConstraint(fun, lb, ub, jac='2-point', hess=<scipy.optimize._hessian_update_strategy.BFGS object>, keep_feasible=False, finite_diff_rel_step=None, finite_diff_jac_sparsity=None)[源代码][源代码]#
变量的非线性约束。
约束具有一般的不等式形式:
lb <= fun(x) <= ub
这里,自变量 x 的向量作为形状为 (n,) 的 ndarray 传递,而
fun
返回一个包含 m 个分量的向量。可以使用相等的边界来表示等式约束,或使用无限边界来表示单边约束。
- 参数:
- 有趣可调用
定义约束的函数。签名是
fun(x) -> array_like, shape (m,)
。- lb, ubarray_like
约束的上下界。每个数组必须具有形状 (m,) 或为标量,在后一种情况下,边界将对约束的所有分量相同。使用带有适当符号的
np.inf
来指定单边约束。将 lb 和 ub 的元素设置为相等以表示等式约束。请注意,您可以通过根据需要设置 lb 和 ub 的不同分量来混合不同类型的约束:区间、单边或等式。- jac{callable, ‘2-point’, ‘3-point’, ‘cs’}, 可选
计算雅可比矩阵(一个 m-by-n 矩阵,其中元素 (i, j) 是 f[i] 对 x[j] 的偏导数)的方法。关键字 {‘2-point’, ‘3-point’, ‘cs’} 选择用于数值估计的有限差分方案。一个可调用对象必须具有以下签名:
jac(x) -> {ndarray, sparse matrix}, shape (m, n)
。默认是 ‘2-point’。- hess{callable, ‘2-点’, ‘3-点’, ‘cs’, Hessian更新策略, None}, 可选
计算Hessian矩阵的方法。关键字{‘2-point’, ‘3-point’, ‘cs’}选择用于数值估计的有限差分方案。或者,可以使用实现`HessianUpdateStrategy`接口的对象来近似Hessian。目前可用的实现有:
一个可调用对象必须返回
dot(fun, v)
的 Hessian 矩阵,并且必须具有以下签名:hess(x, v) -> {LinearOperator, 稀疏矩阵, array_like}, 形状 (n, n)
。这里的v
是一个形状为 (m,) 的 ndarray,包含拉格朗日乘数。- 保持可行性类数组的布尔值,可选
是否在整个迭代过程中保持约束组件的可行性。单个值设置此属性用于所有组件。默认为 False。对等式约束无效。
- finite_diff_rel_step: None 或 array_like, 可选
有限差分近似的相对步长。默认值为 None,这将根据有限差分方案自动选择一个合理的值。
- finite_diff_jac_sparsity: {None, array_like, sparse matrix}, 可选
定义有限差分估计的雅可比矩阵的稀疏结构,其形状必须为 (m, n)。如果雅可比矩阵在 每一行 中只有少数非零元素,提供稀疏结构将大大加快计算速度。零条目意味着雅可比矩阵中相应元素为零。如果提供,将强制使用 ‘lsmr’ 信赖域求解器。如果为 None(默认),则将使用密集差分。
注释
有限差分方案 {‘2-点’, ‘3-点’, ‘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)