功能配置在数字配方中,提供测试功能

时间:2010-06-11 13:02:02

标签: c++ function-pointers

我正在尝试将收集的数据拟合到多项式方程中,我从Numerical Recipes中找到了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;
}

当我在gdb中运行lfit函数的源代码时,我看不到对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个数组索引的,所以如果有人对我的数组声明进行了更正,请告诉我!

干杯

编辑:好的,刚刚发现了这个问题。

复制数字食谱代码时,我不小心注意到了一些真正的代码,认为它只是一个评论。我不再得到奇异值错误

2 个答案:

答案 0 :(得分:0)

我对 lfit 功能了解不多,但是你可以在的开头向 stderr 添加一些 fprintf 吗? > fpoly 函数和函数末尾的另一个函数,以查看它实际崩溃的位置或接收的参数是否正确/有效?

很抱歉,如果这没有用,但我认为 lfit 功能运行良好,问题出在 fpoly 功能中。

答案 1 :(得分:0)

我已经切换到NR的第3版,这是一个更容易理解的例程。