【问题标题】:Function lfit in numerical recipes, providing a test function函数 lfit 在数值配方中,提供测试函数
【发布时间】:2011-03-02 15:54:09
【问题描述】:

我正在尝试将收集的数据拟合到多项式方程中,并从 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 个数组索引的,所以如果有人对我的数组声明有更正,请告诉我!

干杯

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

在复制数字配方代码时,我不小心注释掉了一些真实的代码,以为它只是一个注释。我不再得到奇异值错误

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:

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

    抱歉,如果这没有帮助,但我认为 lfit 函数运行良好,问题出在 fpoly 函数中。

    【讨论】:

      【解决方案2】:

      我后来改用第三版的 NR,它的例程更容易理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多