コード例 #1
0
ファイル: nlinfit.cpp プロジェクト: onethousand/Computer
void mrqmin( double x[], double y[], double sig[], int ndata, CVector a,   
        int ia[], int ma, CMatrix covar, CMatrix alpha, double *chisq,   
        void (*funcs)(double, double [], double *, double [], int),   
        double *alamda)   
{   
  int j,k,l,m;   
  static int mfit;   
  static double ochisq;   
  CMatrix oneda;   
  CVector atry,beta,da;   
   
  if (*alamda < 0.0) {   
    atry=CVector(1,ma);   
    beta=CVector(1,ma);   
    da=CVector(1,ma);   
    for (mfit=0,j=1;j<=ma;j++)   
      if (ia[j]) mfit++;   
    oneda=CMatrix(1,mfit);   
    *alamda=0.001;   
    mrqcof(x,y,sig,ndata,a,ia,ma,alpha,beta,chisq,funcs);   
    ochisq=(*chisq);   
    for (j=1;j<=ma;j++) atry[j]=a[j];   
  }   
  for (j=0,l=1;l<=ma;l++) {   
    if (ia[l]) {   
      for (j++,k=0,m=1;m<=ma;m++) {   
    if (ia[m]) {   
      k++;   
      covar[j][k]=alpha[j][k];   
    }   
      }   
      covar[j][j]=alpha[j][j]*(1.0+(*alamda));   
      oneda[j][1]=beta[j];   
    }   
  }   
  covar.ColMax();   
  for (j=1;j<=mfit;j++) da[j]=oneda[j][1];   
  if (*alamda == 0.0) {   
    covsrt(covar,ma,ia,mfit);   
    return;   
  }   
  for (j=0,l=1;l<=ma;l++)   
    if (ia[l]) atry[l]=a[l]+da[++j];   
  mrqcof(x,y,sig,ndata,atry,ia,ma,covar,da,chisq,funcs);   
  if (*chisq < ochisq) {   
    *alamda *= 0.1;   
    ochisq=(*chisq);   
    for (j=0,l=1;l<=ma;l++) {   
      if (ia[l]) {   
    for (j++,k=0,m=1;m<=ma;m++) {   
      if (ia[m]) {   
        k++;   
        alpha[j][k]=covar[j][k];   
      }   
    }   
    beta[j]=da[j];   
    a[l]=atry[l];   
      }   
    }   
  } else {   
    *alamda *= 10.0;   
    *chisq=ochisq;   
  }   
}