我得到一个'gsl: interp.c:150: ERROR:插值错误‘,代码如下。一些谷歌搜索表明,当您尝试使用interp函数进行外推时,会出现此错误,但我不明白这是如何发生的。我们将非常感谢您的帮助。谢谢。
函数randomground()只返回一个随机数(double)。
#define NSTEPS 100
int main()
{
int j, q, space = 1, refine = 100;
double xi = 0.0, tx[2*NSTEPS] = {0}, theight[2*NSTEPS] = {0};
double terrain[(int) (2*NSTEPS*100)] = {0};
double terrainsl[(int) (2*NSTEPS*100)] = {0};
for (j = 0; j < 2*NSTEPS; j++)
{
tx[j] = (double) j*space;
theight[j] = randomground();
}
gsl_interp_accel *acc = gsl_interp_accel_alloc();
gsl_spline *spline = gsl_spline_alloc(gsl_interp_akima, 2*NSTEPS);
gsl_spline_init(spline, tx, theight, 2*NSTEPS);
for (q = 0; q< 2*NSTEPS*100; q++)
{
terrain[q] = gsl_spline_eval(spline,xi,acc);
terrainsl[q] = gsl_spline_eval_deriv(spline,xi,acc);
xi = xi+(double) space/refine;
}
return 0;
}发布于 2014-12-10 17:22:55
通过向tx和Fixed添加额外的元素修复了此问题。我猜这就是你让我做的,@ViniciusMiranda。代码现在显示为
double tx[2*NSTEPS+1] = {0}, theight[2*NSTEPS+1] = {0};
double terrain[(int) (2*NSTEPS*100)] = {0};
double terrainsl[(int) (2*NSTEPS*100)] = {0};
for (j = 0; j < 2*NSTEPS+1; j++)
{
tx[j] = (double) j*space;
theight[j] = randomground();
}
gsl_interp_accel *acc = gsl_interp_accel_alloc();
gsl_spline *spline = gsl_spline_alloc(gsl_interp_akima, 2*NSTEPS+1);
gsl_spline_init(spline, tx, theight, 2*NSTEPS+1);
for (q = 0; q< 2*NSTEPS*100; q++)
{
terrain[q] = gsl_spline_eval(spline,xi,acc);
terrainsl[q] = gsl_spline_eval_deriv(spline,xi,acc);
xi = xi+(double) space/refine;
}我仍然不明白为什么需要这个修复。
发布于 2015-03-30 01:54:50
Akima样条是一种局部的、子样条插值。对于函数f(x),如果您尝试获取x_i <= x <= x_i+1的x的值,则Akima需要用于j = i-2, i-1, i, i+1, i+2, i+3.的(x_j, f_j)对
发布于 2019-09-07 08:07:24
我在我的代码zigzag.sourceforge.net中发现了同样的错误,并通过对gsl library source中的代码行进行注释、编译和重新安装来解决。
在版本1.14之前的
中,interp.c中有行150
// GSL_ERROR_VAL("interpolation error", GSL_EDOM, GSL_NAN);我用评论来解决这个问题!
https://stackoverflow.com/questions/27384929
复制相似问题