2014-02-17 46 views
1

gsldocumentation 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, ...); 
} 

最後,第三函數來計算兩個fdf一起

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

這似乎可替代地稱爲,取決於所使用的優化算法。有人可以證實這一點嗎?回到我原來的問題,這是否意味着圖書館用戶必須檢查來源找出使用什麼方法來利用同時計算函數值和它的梯度的可能性?

回答

2

的GSL詢問三種功能,(a)一種其計算,(b)所示,另一種計算梯度,和(c)一個用於計算,對於完全一樣的原因你關心的是:

有幾種情況,其中一次函數值爲 計算,其衍生物可以更容易計算。

換句話說,在一個範圍內計算值和梯度可能比分別計算值和梯度更容易。然而,如果最小化器只需要梯度,或者最小化器只需要該值,那麼對兩者進行評估將是不必要的昂貴。

因此,你應該相信GSL它知道它想要什麼。最小化程序將調用第三個函數,只要它需要知道兩個值和梯度在特定點,並且它將調用第一個或第二個函數,如果它只需要知道或者的值的梯度。

由您來決定是否要第三個函數執行一些利用特定問題的智能計算,或者是否希望它是一個簡單的包裝。