我有下面的代码。它完美地计算了多项式的所有y点(并将它们打印到用gnuplot绘制的图中),但是如何得到得到的多项式(在这种情况下是1-x 2)?
void twoDegreePoly() {
int n = 3;
double x[n],y[n];
printf ("#m=0,S=16\n");
for (int i=0; i<n ;i++) {
x[i] = ((double)2*i)/2 -1;
y[i] = f(x[i]);
printf ("%g %g\n", x[i], y[i]);
}
printf ("#m=1,S=0\n");
gsl_interp_accel *acc = gsl_interp_accel_alloc ();
const gsl_interp_type *t = gsl_interp_polynomial;
gsl_interp* poly = gsl_interp_alloc(t,n);
gsl_interp_init (poly, x, y,n);
for (double xi=x[0]; xi<x[n-1]; xi+= 0.01) {
double yi = gsl_interp_eval (poly, x, y, xi, acc);
printf ("%g %g\n", xi, yi);
}
}
发布于 2014-11-18 12:37:07
发布于 2016-02-01 14:54:53
我用Akima的插值做了一些类似的事情。首先,将状态定义为GSL:
typedef struct
{
double *b;
double *c;
double *d;
double *_m;
}akima_state_t;
然后,创建内插
spline = gsl_spline_alloc (gsl_interp_akima, M_size);
gsl_spline_init (spline, x, y, M_size);
在那之后,你可以:
const akima_state_t *state = (const akima_state_t *) ( spline -> interp -> state);
double _b,_c,_d;
for (int i = 0; i < M_size; i++)
{
_b = state->b[i];
_c = state->c[i];
_d = state->d[i];
std::cout << "(x>"<<x[i]<<")*(x<"<<x[i+1]<<")*("<<y[i]<< "+ (x-"<< x[i]<<")*("<<_b<<"+(x-"<< x[i]<<")*("<<_c<<"+"<<_d<<"*(x-"<<x[i]<<")))) + ";
}
我没有尝试过用多项式插值,但是这里的状态结构对于多项式来说,应该是一个很好的起点。
typedef struct
{
double *d;
double *coeff;
double *work;
}
polynomial_state_t;
https://stackoverflow.com/questions/26993728
复制相似问题