2010-06-11 130 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功能。