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


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


本文簡要介紹 python 語言中 scipy.optimize.minimize_scalar 的用法。

用法:

scipy.optimize.minimize_scalar(fun, bracket=None, bounds=None, args=(), method=None, tol=None, options=None)#

一個變量的標量函數的局部最小化。

參數

fun 可調用的

目標函數。標量函數,必須返回一個標量。

bracket 順序,可選

對於方法‘brent’ 和‘golden’, bracket 定義包圍間隔並且是必需的。滿足 xa < xb < xcfunc(xb) < func(xa) and  func(xb) < func(xc) 的三元組 (xa, xb, xc) 或一對 (xa, xb) 用作下坡括號搜索的初始點(請參閱 scipy.optimize.bracket )。最小化器 res.x 不一定滿足 xa <= res.x <= xb

bounds 順序,可選

對於方法‘bounded’,邊界是強製性的,並且必須具有與優化邊界相對應的兩個有限項。

args 元組,可選

傳遞給目標函數的額外參數。

method str 或可調用,可選

求解器的類型。應該是以下之一:

如果提供了邊界,則默認值為“Bounded”,否則為“Brent”。有關每個求解器的詳細信息,請參閱“注釋”部分。

tol 浮點數,可選

容忍終止。如需詳細控製,請使用solver-specific 選項。

options 字典,可選

求解器選項字典。

maxiter int

Maximum number of iterations to perform.

disp bool

Set to True to print convergence messages.

有關solver-specific 選項,請參見 show_options

返回

res OptimizeResult

優化結果表示為 OptimizeResult 對象。重要的屬性是:x 解決方案數組,success 指示優化器是否成功退出的布爾標誌和說明終止原因的 message。有關其他屬性的說明,請參見 OptimizeResult

注意

本節介紹可通過 ‘method’ 參數選擇的可用求解器。默認方法是"Bounded"布倫特法如果界限被傳遞且無界"Brent"否則。

Brent 方法使用 Brent 算法 [1] 來尋找局部最小值。該算法在可能的情況下使用反拋物線插值來加速黃金分割法的收斂。

方法金的使用黃金分割搜索技術[1]。它使用類似二分法來減少括號內的間隔。通常最好使用布倫特方法。

Method Bounded 可以執行有界最小化 [2] [3]。它使用布倫特方法來查找區間 x1 < xopt < x2 中的局部最小值。

請注意,除非提供有效的 bracket 三元組,否則 Brent 和 Golden 方法不能保證成功。如果找不到 three-point 括號,請考慮 scipy.optimize.minimize 。此外,所有方法僅用於局部最小化。當感興趣的函數具有多個局部最小值時,請考慮全局優化。

自定義最小化器

傳遞自定義最小化方法可能很有用,例如在使用某些庫前端到 minimize_scalar 時。您可以簡單地將可調用對象作為method 參數傳遞。

可調用的被稱為method(fun, args, **kwargs, **options)其中kwargs對應於傳遞給的任何其他參數scipy.optimize.minimize(如scipy.optimize.bracket,tol等),除了選項dict,其內容也傳遞為方法成對成對的參數。該方法應返回一個OptimizeResult對象。

提供的方法callable 必須能夠接受(並且可能忽略)任意參數;接受的參數集scipy.optimize.minimize可能會在未來的版本中擴展,然後這些參數將傳遞給該方法。您可以在 scipy.optimize 教程中找到一個示例。

參考

[1] (1,2)

Press, W.、S.A. Teukolsky、W.T. Vetterling 和 B.P.弗蘭納裏。 C. 劍橋大學出版社的數字食譜。

[2]

福賽斯 (G.E.)、M.A. 馬爾科姆 (M.A. Malcolm) 和 C.B.莫勒 (C.B. Moler)。 “數學計算的計算機方法。” Prentice-Hall自動計算係列259(1977)。

[3]

布倫特,理查德·P。無導數的最小化算法。快遞公司,2013 年。

例子

考慮最小化以下函數的問題。

>>> def f(x):
...     return (x - 2) * x * (x + 2)**2

使用布倫特方法,我們發現局部最小值為:

>>> from scipy.optimize import minimize_scalar
>>> res = minimize_scalar(f)
>>> res.fun
-9.9149495908

最小化為:

>>> res.x
1.28077640403

使用有界方法,我們找到具有指定邊界的局部最小值:

>>> res = minimize_scalar(f, bounds=(-3, -1), method='bounded')
>>> res.fun  # minimum
3.28365179850e-13
>>> res.x  # minimizer
-2.0000002026

相關用法


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