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)[source]#
變數的非線性約束。
此約束具有一般不等式形式
lb <= fun(x) <= ub
此處,獨立變數 x 的向量以形狀為 (n,) 的 ndarray 傳遞,而
fun
傳回具有 m 個分量的向量。可以使用相等邊界來表示等式約束,或使用無限邊界來表示單邊約束。
- 參數:
- fun可呼叫物件
定義約束的函數。簽名為
fun(x) -> array_like, shape (m,)
。- lb, ubarray_like
約束的下限和上限。每個陣列都必須具有形狀 (m,) 或為純量,在後一種情況下,邊界對於約束的所有分量都相同。使用帶有適當符號的
np.inf
來指定單邊約束。設定 lb 和 ub 的分量相等以表示等式約束。請注意,您可以透過根據需要設定 lb 和 ub 的不同分量,來混合不同類型的約束:區間、單邊或等式。- jac{可呼叫物件, ‘2-point’, ‘3-point’, ‘cs’}, 選用
計算 Jacobian 矩陣的方法(一個 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}, 選用
計算 Hessian 矩陣的方法。關鍵字 {‘2-point’, ‘3-point’, ‘cs’} 選擇用於數值估計的有限差分方案。或者,實作
HessianUpdateStrategy
介面的物件可用於近似 Hessian。目前可用的實作是可呼叫物件必須傳回
dot(fun, v)
的 Hessian 矩陣,並且必須具有以下簽名:hess(x, v) -> {LinearOperator, sparse matrix, array_like}, shape (n, n)
。此處,v
是形狀為 (m,) 的 ndarray,其中包含 Lagrange 乘數。- keep_feasiblebool 的 array_like, 選用
是否在整個迭代過程中保持約束分量可行。單一值為所有分量設定此屬性。預設值為 False。對等式約束無效。
- finite_diff_rel_step: None 或 array_like, 選用
有限差分近似的相對步長。預設值為 None,它將根據有限差分方案自動選擇一個合理的值。
- finite_diff_jac_sparsity: {None, array_like, sparse matrix}, 選用
定義用於有限差分估計的 Jacobian 矩陣的稀疏結構,其形狀必須為 (m, n)。如果 Jacobian 在每列中只有少數非零元素,則提供稀疏結構將大大加快計算速度。零條目表示 Jacobian 中的對應元素完全為零。如果提供,則強制使用 ‘lsmr’ 信任域求解器。如果為 None(預設),則將使用密集差分。
註解
有限差分方案 {‘2-point’, ‘3-point’, ‘cs’} 可用於近似 Jacobian 或 Hessian。但是,我們不允許同時使用它來近似兩者。因此,每當透過有限差分估計 Jacobian 時,我們都要求使用準牛頓策略之一來估計 Hessian。
方案 ‘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)