Пример #1
0
        // cos(x/2) ^ 2
        // (1/2)*(x+sin(x))

        //
        //
        private void integrate()
        {
            double a = double.Parse(intervalA.Text);
            double b = double.Parse(intervalB.Text);

            double eps = double.Parse(epsilon.Text);

            if (eps >= 1 || eps < 0)
            {
                throw new Exception("Epsilon must me between 0 and 1");
            }

            double exactValue = MyParser.calculate(original.Text, b) - MyParser.calculate(original.Text, a);

            _dummyCollection.Clear();
            foreach (NumericalIntegration method in methods)
            {
                KeyValuePair <double, int> res = method.CalculateIntegral(a, b, eps, function.Text);
                double error = Math.Abs(res.Key - exactValue);
                _dummyCollection.Add(new IntegrateResult {
                    Method = method.ToString(), Value = res.Key, Intervals = res.Value, Error = string.Format("{0:0.########}", error)
                });
            }
            _dummyCollection.Add(new IntegrateResult {
                Method = "Exact value", Value = exactValue
            });
            dataGrid1.ItemsSource = _dummyCollection;
        }
Пример #2
0
        protected override double Calculate(double a, double b, int n, string integral)
        {
            double res = 0;
            double A   = (b - a) / 2;
            double B   = (b + a) / 2;

            double[] x = GaussLegendre.arr[25].x;
            double[] w = GaussLegendre.arr[25].w;
            for (int i = 0; i < GaussLegendre.arr.Length; i++)
            {
                if (GaussLegendre.arr[i].n == n)
                {
                    x = GaussLegendre.arr[i].x;
                    w = GaussLegendre.arr[i].w;
                }
            }

            if (n % 2 == 1)
            {
                res = w[0] * MyParser.calculate(integral, B);
                for (int i = 1; i < x.Length; i++)
                {
                    res += w[i] * (MyParser.calculate(integral, B + A * x[i]) + MyParser.calculate(integral, B - A * x[i]));
                }
            }
            else
            {
                for (int i = 0; i < x.Length; i++)
                {
                    res += w[i] * (MyParser.calculate(integral, B + A * x[i]) + MyParser.calculate(integral, B - A * x[i]));
                }
            }
            return(A * res);
        }
        protected override double Calculate(double a, double b, int n, string integral)
        {
            double res = 0;
            double h   = (b - a) / n;

            for (int i = 1; i <= n; ++i)
            {
                res += MyParser.calculate(integral, (a + i * h));
            }
            res *= h;
            return(res);
        }
Пример #4
0
        protected override double Calculate(double a, double b, int n, string integral)
        {
            double res  = 0;
            double h    = (b - a) / n;
            bool   even = false;

            for (int i = 1; i < n; ++i)
            {
                res += (even ? 2 : 4) * MyParser.calculate(integral, (a + i * h));
                even = !even;
            }
            res += MyParser.calculate(integral, a) + MyParser.calculate(integral, b);
            res *= h / 3;
            return(res);
        }
Пример #5
0
        //public override KeyValuePair<double, int> CalculateIntegral(double a, double b, double eps, string integral)
        //{
        //    int n = 3;
        //    double i1 = Calculate(a, b, n, integral);
        //    double i2 = 0;
        //    int k = 2;
        //    do
        //    {
        //        i2 = 0;
        //        for (int i = 0; i < k; i++)
        //        {
        //            i2 += Calculate(a + i * (b - a) / k, a + (i + 1) * (b - a) / k, n, integral);
        //        }

        //        double tmp = i2;
        //        i2 = i1;
        //        i1 = tmp;
        //        k++;
        //    } while (Math.Abs(i1 - i2) >= eps);

        //    return new KeyValuePair<double, int>(i1, k);
        //}

        protected override double Calculate(double a, double b, int n, string integral)
        {
            if (n == 8 || n > 9)
            {
                n = 9;
            }
            double res = 0;
            double A   = (b - a) / 2;
            double B   = (b + a) / 2;

            double[] x = ChebyshevCoefs.arr[7].x;
            for (int i = 0; i < ChebyshevCoefs.arr.Length; i++)
            {
                if (ChebyshevCoefs.arr[i].n == n)
                {
                    x = ChebyshevCoefs.arr[i].x;
                }
            }
            for (int i = 0; i < x.Length; i++)
            {
                res += MyParser.calculate(integral, A * x[i] + B);
            }
            return(2 * res * A / n);
        }