首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用gsl_interp求多项式插值系数?

如何利用gsl_interp求多项式插值系数?
EN

Stack Overflow用户
提问于 2014-11-18 11:53:53
回答 2查看 1.1K关注 0票数 1

我有下面的代码。它完美地计算了多项式的所有y点(并将它们打印到用gnuplot绘制的图中),但是如何得到得到的多项式(在这种情况下是1-x 2)?

代码语言:javascript
运行
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-18 12:37:07

在对文档进行快速扫描之后,在GSL中似乎没有这样的特性。这可能是由于两个原因造成的:第一,得到多项式系数是这种插值方法的特殊之处,它不适合一般的设计(可以处理任意函数)。第二,引用数字累进:

但是,请确定这些系数是你所需要的。通常,在期望的横坐标下,插值多项式的系数可以比它的值精确得多。因此,只确定系数用于计算插值值并不是一个好主意。这样计算的值不会精确地通过列表中的点,例如,.

其原因是,在原则上,计算系数涉及到求解具有范德蒙德矩阵的线性系统,这是高度病态的。

然而,数值计算给出了一个常规的polcoe,通过它你可以得到插值多项式。你可以在第3.5章找到它。在免费第二版里。

票数 2
EN

Stack Overflow用户

发布于 2016-02-01 14:54:53

我用Akima的插值做了一些类似的事情。首先,将状态定义为GSL:

代码语言:javascript
运行
复制
typedef struct
{
  double *b;
  double *c;
  double *d;
  double *_m;
}akima_state_t;

然后,创建内插

代码语言:javascript
运行
复制
spline = gsl_spline_alloc (gsl_interp_akima, M_size);
gsl_spline_init (spline, x, y, M_size);

在那之后,你可以:

代码语言:javascript
运行
复制
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]<<")))) + ";
  }

我没有尝试过用多项式插值,但是这里的状态结构对于多项式来说,应该是一个很好的起点。

代码语言:javascript
运行
复制
typedef struct
{
  double *d;
  double *coeff;
  double *work;
}
polynomial_state_t;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26993728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档