到目前為止,由於各種原因,我想略去所有其他答案,但我不會。
當導數不可用時,用於最小化(或最大化)平滑函數的優秀且有效的方法是拋物線插值。編寫算法是很常見的,因此當拋物線插值不像黃金分割那樣快時,它會暫時切換到黃金分割搜索(布倫特的最小化)。
我用C ++編寫了這樣一個算法。有什麽優惠?
UPDATE: There is a C version of the Brent
minimizer in GSL. The archives are here: ftp://ftp.club.cc.cmu.edu/gnu/gsl/ Note
that it will be covered by some flavor of GNU "copyleft."
在我寫這篇文章時,最新和最好的似乎是gsl-1.14.tar.gz。最小化器位於文件gsl-1.14/min/brent.c中。它似乎具有與我實施的類似的終止標準。我還沒有研究過它如何決定轉向黃金分割,但對於OP來說,這可能沒什麽問題。
UPDATE 2: I googled up a public domain java
version, translated from FORTRAN. I cannot vouch for its quality.
http://www1.fpl.fs.fed.us/Fmin.java I
notice that the hard-coded machine efficiency ("machine
precision" in the comments) is 1/2 the value for a typical PC
today. Change the value of eps to 2.22045e-16.