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); }