我正在尝试将收集的数据拟合到多项式方程中,我从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个数组索引的,所以如果有人对我的数组声明进行了更正,请告诉我!
干杯
编辑:好的,刚刚发现了这个问题。
复制数字食谱代码时,我不小心注意到了一些真正的代码,认为它只是一个评论。我不再得到奇异值错误
答案 0 :(得分:0)
我对 lfit 功能了解不多,但是你可以在的开头向 stderr 添加一些 fprintf 吗? > fpoly 函数和函数末尾的另一个函数,以查看它实际崩溃的位置或接收的参数是否正确/有效?
很抱歉,如果这没有用,但我认为 lfit 功能运行良好,问题出在 fpoly 功能中。
答案 1 :(得分:0)
我已经切换到NR的第3版,这是一个更容易理解的例程。