的gsl
庫documentation about the multidimensional minimization算法相同的範圍內讀取:計算f和DF/DX使用GSL multimin
必須爲 極小,操作上提供了n個變量的參數化功能。您可能還需要提供一個程序,它可以計算函數的梯度,第三個程序可以同時計算函數值和梯度。
提供的示例定義這樣的功能如下(I省略問題的具體細節,通過...
替換):
f
本身
double
my_f (const gsl_vector *v, void *params)
{
...
return rv;
}
梯度的f
功能,df
=(DF/dx,df/dy)。
void
my_df (const gsl_vector *v, void *params, gsl_vector *df)
{
...
gsl_vector_set(df, ...);
gsl_vector_set(df, ...);
}
最後,第三函數來計算兩個f
和df
一起
void
my_fdf (const gsl_vector *x, void *params, double *f, gsl_vector *df)
{
*f = my_f(x, params);
my_df(x, params, df);
}
這三者是gsl_multimin_function_fdf
一個struct
類型,其最終被傳遞到極小的成員。
有幾種情況,其中一次函數值計算,其衍生物可以更容易計算,例如:讓f(x,y) = exp(x * g(y))
,其中g(y)
可能是計算昂貴的,那麼它的方便簡單df/dx = g(y) f(x,y)
使用g(y) = log(f)/x
做。
現在,就我可以從示例中學習到的內容而言,最小化器需要函數及其派生詞被獨立定義,而第三個定義看起來像一個虛擬包裝器。
是否可以通過某種方式來定義這些函數,使得函數及其派生物可以在相同範圍內實際計算?
編輯:
在本文檔中,關於fdf
,更說明
此功能提供的單獨功能的優化
f(x)
和g(x)
- 它總是更快地計算功能及其衍生物在同一時間。
但是,我不確定如何。掃描通過頭,我發現有定義三個宏,每個這三個函數
#define GSL_MULTIMIN_FN_EVAL_F(F,x) (*((F)->f))(x,(F)->params)
#define GSL_MULTIMIN_FN_EVAL_DF(F,x,g) (*((F)->df))(x,(F)->params,(g))
#define GSL_MULTIMIN_FN_EVAL_F_DF(F,x,y,g) (*((F)->fdf))(x,(F)->params,(y),(g))
這似乎可替代地稱爲,取決於所使用的優化算法。有人可以證實這一點嗎?回到我原來的問題,這是否意味着圖書館用戶必須檢查來源找出使用什麼方法來利用同時計算函數值和它的梯度的可能性?