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)[source]#

變數的非線性約束。

此約束具有一般不等式形式

lb <= fun(x) <= ub

此處,獨立變數 x 的向量以形狀為 (n,) 的 ndarray 傳遞,而 fun 傳回具有 m 個分量的向量。

可以使用相等邊界來表示等式約束,或使用無限邊界來表示單邊約束。

參數:
fun可呼叫物件

定義約束的函數。簽名為 fun(x) -> array_like, shape (m,)

lb, ubarray_like

約束的下限和上限。每個陣列都必須具有形狀 (m,) 或為純量,在後一種情況下,邊界對於約束的所有分量都相同。使用帶有適當符號的 np.inf 來指定單邊約束。設定 lbub 的分量相等以表示等式約束。請注意,您可以透過根據需要設定 lbub 的不同分量,來混合不同類型的約束:區間、單邊或等式。

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)