scipy.optimize.

fmin_cobyla#

scipy.optimize.fmin_cobyla(func, x0, cons, args=(), consargs=None, rhobeg=1.0, rhoend=0.0001, maxfun=1000, disp=None, catol=0.0002, *, callback=None)[source]#

使用線性近似約束最佳化 (COBYLA) 方法最小化函數。此方法包裝了演算法的 FORTRAN 實現。

參數:
funccallable

要最小化的函數。形式為 func(x, *args)。

x0ndarray

初始猜測。

conssequence

約束函數;必須全部 >=0(如果只有 1 個約束,則為單個函數)。每個函數都將參數 x 作為其第一個引數,並且它可以返回單個數字或數字的陣列或列表。

argstuple, optional

要傳遞給函數的額外引數。

consargstuple, optional

要傳遞給約束函數的額外引數(預設值 None 表示使用與傳遞給 func 的引數相同的額外引數)。對於沒有額外引數,請使用 ()

rhobegfloat, optional

變數的合理初始變更。

rhoendfloat, optional

最佳化中的最終準確度(不能精確保證)。這是信任區域大小的下限。

disp{0, 1, 2, 3}, optional

控制輸出的頻率;0 表示沒有輸出。

maxfunint, optional

函數評估的最大次數。

catolfloat, optional

約束違規的絕對容差。

callbackcallable, optional

在每次迭代後呼叫,如 callback(x),其中 x 是目前的參數向量。

返回:
xndarray

最小化 f 的引數。

參見

minimize

多變數函數最小化演算法的介面。特別參見 ‘COBYLA’ method

註記

此演算法基於目標函數和每個約束的線性近似。我們簡要描述該演算法。

假設函數正在 k 個變數上最小化。在第 j 次迭代中,演算法具有 k+1 個點 v_1, …, v_(k+1)、近似解 x_j 和半徑 RHO_j。(即,線性加上常數)對目標函數和約束函數的近似,使得它們的函數值與 v_1,.., v_(k+1) 這 k+1 個點上的線性近似一致。這給出了一個線性規劃來求解(其中約束函數的線性近似被約束為非負數)。

然而,線性近似可能僅在目前單純形附近才是良好的近似,因此線性規劃被給予進一步的要求,即將成為 x_(j+1) 的解必須在距 x_j 的 RHO_j 範圍內。RHO_j 只會減小,永遠不會增加。初始 RHO_j 是 rhobeg,最終 RHO_j 是 rhoend。透過這種方式,COBYLA 的迭代行為類似於信任區域演算法。

此外,線性規劃可能不一致,或者近似可能給出較差的改進。有關如何解決這些問題以及如何更新點 v_i 的詳細資訊,請參閱原始碼或以下參考文獻。

參考文獻

Powell M.J.D. (1994), “A direct search optimization method that models the objective and constraint functions by linear interpolation.”, in Advances in Optimization and Numerical Analysis, eds. S. Gomez and J-P Hennart, Kluwer Academic (Dordrecht), pp. 51-67

Powell M.J.D. (1998), “Direct search algorithms for optimization calculations”, Acta Numerica 7, 287-336

Powell M.J.D. (2007), “A view of algorithms for optimization without derivatives”, Cambridge University Technical Report DAMTP 2007/NA03

範例

最小化目標函數 f(x,y) = x*y,受限於約束 x**2 + y**2 < 1 且 y > 0

>>> def objective(x):
...     return x[0]*x[1]
...
>>> def constr1(x):
...     return 1 - (x[0]**2 + x[1]**2)
...
>>> def constr2(x):
...     return x[1]
...
>>> from scipy.optimize import fmin_cobyla
>>> fmin_cobyla(objective, [0.0, 0.1], [constr1, constr2], rhoend=1e-7)
array([-0.70710685,  0.70710671])

精確解是 (-sqrt(2)/2, sqrt(2)/2)。