多项式拟合力首先为零

时间:2013-11-16 12:28:13

标签: c++ math curve-fitting gsl least-squares

我找到了很好的代码来做一些基于GSL的多项式最小二乘拟合。

我使用3度:y =Cx²+ Bx + A.

在我的应用程序中,我知道A必须为零。是否可以更改算法以使A总是为零?

bool polynomialfit(int obs, int degree, 
           double *dx, double *dy, double *store) /* n, p */
{
  gsl_multifit_linear_workspace *ws;
  gsl_matrix *cov, *X;
  gsl_vector *y, *c;
  double chisq;

  int i, j;

  X = gsl_matrix_alloc(obs, degree);
  y = gsl_vector_alloc(obs);
  c = gsl_vector_alloc(degree);
  cov = gsl_matrix_alloc(degree, degree);

  for(i=0; i < obs; i++) {
    gsl_matrix_set(X, i, 0, 1.0);
    for(j=0; j < degree; j++) {
      gsl_matrix_set(X, i, j, pow(dx[i], j));
    }
    gsl_vector_set(y, i, dy[i]);
  }

  ws = gsl_multifit_linear_alloc(obs, degree);
  gsl_multifit_linear(X, y, c, cov, &chisq, ws);

  /* store result ... */
  for(i=0; i < degree; i++)
  {
    store[i] = gsl_vector_get(c, i);
  }

  gsl_multifit_linear_free(ws);
  gsl_matrix_free(X);
  gsl_matrix_free(cov);
  gsl_vector_free(y);
  gsl_vector_free(c);
  return true; /* we do not "analyse" the result (cov matrix mainly)
  to know if the fit is "good" */
}

2 个答案:

答案 0 :(得分:0)

你可以用y'= y / x代替y然后执行1.次多项式的拟合y'= Cx + B?

(如果您的数据集中存在点x = 0,则必须将其删除,但如果您要应用A = 0约束,此点不会改善拟合,您仍然可以使用它来重新计算优度适合)

答案 1 :(得分:0)

在你发布的代码中有这个循环:

for(j=0; j < degree; j++) {
   gsl_matrix_set(X, i, j, pow(dx[i], j));
}

并且函数pow计算x ^ j项,你必须“忽略”j==0这个词。

我无法访问GSL,所以以下内容仅仅是我的头脑,而且未经测试:

bool polynomialfit(int obs, int polynom_degree, 
           double *dx, double *dy, double *store) /* n, p */
{
  gsl_multifit_linear_workspace *ws;
  gsl_matrix *cov, *X;
  gsl_vector *y, *c;
  double chisq;

  int i, j;
  int degree = polynom_degree - 1;

  X = gsl_matrix_alloc(obs, degree);
  y = gsl_vector_alloc(obs);
  c = gsl_vector_alloc(degree);
  cov = gsl_matrix_alloc(degree, degree);

  for(i=0; i < obs; i++) {
    gsl_matrix_set(X, i, 0, 1.0);
    for(j=0; j < degree; j++) {
      gsl_matrix_set(X, i, j, pow(dx[i], j+1));
    }
    gsl_vector_set(y, i, dy[i]);
  }

  ws = gsl_multifit_linear_alloc(obs, degree);
  gsl_multifit_linear(X, y, c, cov, &chisq, ws);

  /* store result ... */
  for(i=0; i < degree; i++)
  {
    store[i] = gsl_vector_get(c, i);
  }

  gsl_multifit_linear_free(ws);
  gsl_matrix_free(X);
  gsl_matrix_free(cov);
  gsl_vector_free(y);
  gsl_vector_free(c);
  return true; /* we do not "analyse" the result (cov matrix mainly)
  to know if the fit is "good" */
}

为了适应y=c*x*x+b*x,您必须将polynom_degree设置为3来调用它。

你也可以看看这个理论:

Weisstein,Eric W.“最小二乘拟合 - 多项式。”来自 MathWorld - Wolfram Web资源。 http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html