Example #1
0
        public static void FitOrigin(double[] x, double[] y, double[] sig,
                                     out double b, out double sigb, out double chi2, out double q)
        {
            int ndata = x.Length;

            if (x.Length != y.Length)
            {
                throw new Exception("x.Length != y.Length: " + x.Length + " " + y.Length);
            }
            if (sig != null && x.Length != sig.Length)
            {
                throw new Exception("x.Length != sig.Length: " + x.Length + " " + sig.Length);
            }
            double t;
            double st2 = 0.0;

            b = 0.0;
            if (sig != null)
            {
                for (int i = 0; i < ndata; i++)
                {
                    t    = (x[i]) / sig[i];
                    st2 += t * t;
                    b   += t * y[i] / sig[i];
                }
            }
            else
            {
                for (int i = 0; i < ndata; i++)
                {
                    t    = x[i];
                    st2 += t * t;
                    b   += t * y[i];
                }
            }
            b   /= st2;
            sigb = Math.Sqrt(1.0 / st2);
            chi2 = 0.0;
            if (sig == null)
            {
                for (int i = 0; i < ndata; i++)
                {
                    double tmp = y[i] - b * x[i];
                    chi2 += tmp * tmp;
                }
                q = 1.0;
                double sigdat = Math.Sqrt((chi2) / (ndata - 2));
                sigb *= sigdat;
            }
            else
            {
                for (int i = 0; i < ndata; i++)
                {
                    double tmp = (y[i] - b * x[i]) / sig[i];
                    chi2 += tmp * tmp;
                }
                q = NumericalRecipes.Gammq(0.5 * (ndata - 1), 0.5 * (chi2));
            }
        }