MPFIT和用户定义衍生产品的问题

时间:2014-03-18 13:08:15

标签: curve-fitting data-fitting levenberg-marquardt

我正在尝试使用优化库MPFIT将高斯函数拟合到我的数据中。实际上,此代码是MPFIT库附带的示例代码的一部分。原始代码在内部自动计算函数的导数,并且它完美地工作。 MPFIT库还允许用户提供函数派生。这是问题开始的地方。这是用于计算残差和函数的一阶偏导数的函数。

int gaussfunc(int m, int n, double *p, double *dy, double **derivs, void *vars)
{
  int i,j;
  struct vars_struct *v = (struct vars_struct *) vars;
  double *x, *y, *ey;
  double a = p[1];
  double b = p[2];
  double c = p[3];
  double d = p[0];
  x = v->x;
  y = v->y;
  ey = v->ey;

  for (i=0; i<m; i++)
  {
    dy[i] = (y[i] - (a*exp(-(x[i]-b)*(x[i]-b)/(2*c*c))+d))/ey[i];
  }

  // the code below this point is the code I added to calculate the derivatives.
  if(derivs)
  {
      for(j = 0; j < n; j++)
      {
          if (derivs[j])
          {
              for (i = 0; i < m; i++)
              {
                  double da =     exp(-(x[i]-b)*(x[i]-b)/(2*c*c));
                  double db = a * exp(-(x[i]-b)*(x[i]-b)/(2*c*c)) * (x[i]-b)/(c*c);
                  double dc = a * exp(-(x[i]-b)*(x[i]-b)/(2*c*c)) * (x[i]-b)*(x[i]-b)/(c*c*c);
                  double dd = 1;
                  double foo;
                  if     (j == 0) foo = dd;
                  else if(j == 1) foo = da;
                  else if(j == 2) foo = db;
                  else if(j == 3) foo = dc;
                  derivs[j][i] = foo;
              }
          }
      }
  }

  return 0;
}

行上方的代码&#39; if(derivs)&#39;是原始的,但重构,下面的代码是我的计算衍生物的代码。我相信我的数学是正确的,并且https://math.stackexchange.com/questions/716545/calculating-the-first-order-partial-derivatives-of-the-gaussian-function/716553

验证了它们

使用MPFIT和用户定义衍生物时是否遇到过同样的问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

因为残差的计算是(DATA-MODEL)/ SIGMA,所以衍生物应该是:

[ - d(MODEL)/ d(PARAM)。/西格玛

所以,这一行:

derivs[j][i] = foo;

变为:

derivs[j][i] = -foo/ey[i];

问题解决了!谢谢!