public static void Lfit(double[] x, double[] y, double[] sig, double[] a, out double[,] covar, out double chisq,
                                LfitFunc funcs)
        {
            int ndat = x.Length;
            int i, j;
            int l;
            int ma   = a.Length;
            int mfit = a.Length;

            double[,] beta = new double[ma, 1];
            double[] afunc = new double[ma];
            covar = new double[ma, ma];
            for (i = 0; i < ndat; i++)
            {
                funcs(x[i], afunc);
                double ym    = y[i];
                double sig2i = 1.0 / (sig[i] * sig[i]);
                for (l = 0; l < ma; l++)
                {
                    double wt = afunc[l] * sig2i;
                    for (int m = 0; m <= l; m++)
                    {
                        covar[l, m] += wt * afunc[m];
                    }
                    beta[l, 0] += ym * wt;
                }
            }
            for (j = 1; j < mfit; j++)
            {
                int k;
                for (k = 0; k < j; k++)
                {
                    covar[k, j] = covar[j, k];
                }
            }
            Gaussj(covar, mfit, beta, 1);
            for (l = 0; l < ma; l++)
            {
                a[l] = beta[l, 0];
            }
            chisq = 0.0;
            for (i = 0; i < ndat; i++)
            {
                funcs(x[i], afunc);
                double sum = 0.0;
                for (j = 0; j < ma; j++)
                {
                    sum += a[j] * afunc[j];
                }
                chisq += ((y[i] - sum) / sig[i]) * ((y[i] - sum) / sig[i]);
            }
            Covsrt(covar);
        }
 public static void LinFit2(double[] x, double[] y, double[] sig, double[] a,
                            out double chisq, LfitFunc funcs)
 {
     double[,] covar;
     if (sig == null)
     {
         sig = new double[x.Length];
         for (int i = 0; i < sig.Length; i++)
         {
             sig[i] = 1E-2;
         }
     }
     Lfit(x, y, sig, a, out covar, out chisq, funcs);
 }
        public static void LinFit2(double[] x, double[] y, double[] a, LfitFunc funcs)
        {
            double chisq;

            LinFit2(x, y, null, a, out chisq, funcs);
        }