2010-06-11 140 views
0

我試圖將收集的數據擬合到多項式方程中,並且我從Numerical Recipes中找到lfit函數。我只能訪問第二版,所以我正在使用它。數字配方中的函數lfit,提供測試函數

我已閱讀有關lfit功能和參數,其中之一是一個函數指針,在文檔中給出

void (*funcs)(float, float [], int)) 

的幫助

用戶提供了常規funcs中(x,afunc,ma),返回數組afunc [1..ma]中x = x處評估的ma基函數。

我在努力理解lfit函數的工作原理。我發現的示例功能在下面給出:

void fpoly(float x, float p[], int np) 
/*Fitting routine for a polynomial of degree np-1, with coefficients in the array p[1..np].*/ 
{ 
    int j; 
    p[1]=1.0; 
    for (j=2;j<=np;j++) 
     p[j]=p[j-1]*x; 
} 

當我通過用於lfit功能在gdb我可以看到沒有提到funcs指針的源代碼上運行。當我嘗試使用該函數適合簡單的數據集時,出現以下錯誤消息。

Numerical Recipes run-time error... 
gaussj: Singular Matrix 
...now exiting to system... 

顯然某種方式的矩陣得到具有所有零限定。

我將涉及這個函數擬合在一個大的循環,所以使用另一種語言是不是一個真正的選擇。因此,我計劃使用C/C++。

僅供參考,測試程序在這裏給出:

int main() 
{ 

    float x[5] = {0., 0., 1., 2., 3.}; 
    float y[5] = {0., 0., 1.2, 3.9, 7.5}; 
    float sig[5] = {1., 1., 1., 1., 1.}; 

    int ndat = 4; 
    int ma = 4; /* parameters in equation */ 
    float a[5] = {1, 1, 1, 0.1, 1.5}; 
    int ia[5] = {1, 1, 1, 1, 1}; 
    float **covar = matrix(1, ma, 1, ma); 

    float chisq = 0; 

    lfit(x,y,sig,ndat,a,ia,ma,covar,&chisq,fpoly); 

    printf("%f\n", chisq); 
    free_matrix(covar, 1, ma, 1, ma); 


    return 0; 
} 

而且混亂的問題,所有的數字食譜功能1個數組索引,所以如果任何人有改正我的數組聲明也讓我知道!

乾杯

編輯:好剛發現的問題這一點。

當複製數字食譜代碼時,我不小心評論了一些真正的代碼,認爲它只是一個評論。我不再獲得奇異值誤差

回答

0

我已經切換到NR的第三版,它有一個更容易理解的例程。

0

我不知道很多有關lfit功能,但請你在FPOLY函數的開始,另一個在fprintf中添加一些標準錯誤查看函數的結尾,看看它實際崩潰的位置,或者收到的參數是正確的還是有效的?

很抱歉,如果這不是有益的,但我認爲lfit功能運作良好,問題是在FPOLY功能。