예제 #1
0
        public static void FitNonlin(double[] x, double[] y, double[] sig, double[] a,
                                     out double chisq, MrqminFunc func)
        {
            int ndata = x.Length;

            if (sig == null)
            {
                sig = new double[ndata];
                for (int i = 0; i < sig.Length; i++)
                {
                    sig[i] = 1;
                }
            }
            int ma = a.Length;

            double[,] covar = new double[ma, ma];
            double[,] alpha = new double[ma, ma];
            int[] ia = new int[ma];
            for (int i = 0; i < ma; i++)
            {
                ia[i] = 1;
            }
            double alamda = -1;
            double ochisq = 0;

            double[,] oneda = null;
            int mfit = 0;

            double[] atry = null;
            double[] beta = null;
            double[] da   = null;
            NumericalRecipes.Mrqmin(x, y, sig, ndata, a, ia, ma, covar, alpha, out chisq, func, ref alamda, ref ochisq,
                                    ref oneda, ref mfit, ref atry, ref beta, ref da);
            int count1 = 0;

            while (alamda > 1e-20 && alamda < 1e20 && count1 < 100)
            {
                NumericalRecipes.Mrqmin(x, y, sig, ndata, a, ia, ma, covar, alpha, out chisq, func, ref alamda, ref ochisq,
                                        ref oneda, ref mfit, ref atry, ref beta, ref da);
                count1++;
            }
            alamda = 0;
            NumericalRecipes.Mrqmin(x, y, sig, ndata, a, ia, ma, covar, alpha, out chisq, func, ref alamda, ref ochisq,
                                    ref oneda, ref mfit, ref atry, ref beta, ref da);
        }