當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.fmin_cobyla用法及代碼示例


本文簡要介紹 python 語言中 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)#

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

參數

func 可調用的

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

x0 ndarray

初步猜測。

cons 序列

約束函數;必須都是>=0(如果隻有 1 個約束,則為單個函數)。每個函數都帶有參數x作為其第一個參數,它可以返回單個數字或數字數組或列表。

args 元組,可選

傳遞給函數的額外參數。

consargs 元組,可選

傳遞給約束函數的額外參數(默認為 None 意味著使用與傳遞給 func 相同的額外參數)。使用() 沒有額外的參數。

rhobeg 浮點數,可選

對變量進行合理的初始更改。

rhoend 浮點數,可選

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

disp {0, 1, 2, 3},可選

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

maxfun 整數,可選

函數評估的最大數量。

catol 浮點數,可選

對違反約束的絕對容忍度。

callback 可調用的,可選的

每次迭代後調用,如 callback(x) ,其中 x 是當前參數向量。

返回

x ndarray

最小化 f 的論證。

注意

該算法基於對目標函數和每個約束的線性逼近。我們簡要介紹一下算法。

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

然而,線性逼近可能隻是當前單純形附近的良好逼近,因此線性規劃有進一步的要求,即將變為 x_(j+1) 的解必須在 x_j 的 RHO_j 內。 RHO_j 隻會減少,不會增加。最初的 RHO_j 是 rhobeg,最終的 RHO_j 是 rhoend。通過這種方式,COBYLA 的迭代就像一個信任域算法。

此外,線性程序可能不一致,或者近似值可能會帶來較差的改進。有關如何解決這些問題以及如何更新點 v_i 的詳細信息,請參閱源代碼或下麵的引用。

參考

鮑威爾 M.J.D. (1994),“通過線性插值對目標函數和約束函數進行建模的直接搜索優化方法。”,優化和數值分析進展,編輯。 S. Gomez 和 J-P Hennart, Kluwer Academic (Dordrecht),第 51-67 頁

鮑威爾 M.J.D. (1998),“優化計算的直接搜索算法”,Acta Numerica 7, 287-336

鮑威爾 M.J.D. (2007),“無導數優化算法的觀點”,劍橋大學技術報告 DAMPP 2007/NA03

例子

在約束 x**2 + y**2 < 1 和 y > 0 的情況下,最小化目標函數 f(x,y) = x*y:

>>> 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)。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.fmin_cobyla。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。