Ejemplo n.º 1
0
        private static bool Integration()
        {
            Console.Write("Введите левый конец отрезка интегрирования по составной КФ Гаусса и КФ типа Гаусса: ");

            var left = 0d;

            while (!double.TryParse(Console.ReadLine(), out left) || !left.IsNumber())
            {
                Console.Write("Некорректное значение: введите вещественное число: ");
            }

            Console.Write("Введите правый конец отрезка интегрирования по составной КФ Гаусса и КФ типа Гаусса: ");

            var right = 0d;

            while (!double.TryParse(Console.ReadLine(), out right) || !right.IsNumber() || right <= left)
            {
                Console.Write("Некорректное значение: введите вещественное число, большее левого конца отрезка интегрирования: ");
            }

            Console.Write("Введите число промежутков деления отрезка интегрирования по составной КФ Гаусса: ");

            var segmentNumber = 0;

            while (!int.TryParse(Console.ReadLine(), out segmentNumber) || segmentNumber <= 0)
            {
                Console.Write("Некорректное значение: введите положительное целое число: ");
            }

            Console.Write("Введите число узлов для интегрирования по КФ Мелера: ");

            var nodeNumber = 0;

            while (!int.TryParse(Console.ReadLine(), out nodeNumber) || nodeNumber <= 0)
            {
                Console.Write("Некорректное значение: введите положительное целое число: ");
            }

            FormatExtensions.PrintDivider();

            var segmentLength = (right - left) / segmentNumber;

            var gaussIntegral     = Integrator.GaussIntegrate(x => FunctionForGauss(x) * WeightForGauss(x), left, right, segmentNumber);
            var gaussLikeIntegral = Integrator.GaussLikeIntegrate(FunctionForGauss, WeightForGauss, left, right, new Logger());
            var melerIntegral     = Integrator.MelerIntegrate(FunctionForMeler, nodeNumber);

            var gaussExpectedIntegral = GaussLegendreRule.Integrate(x => FunctionForGauss(x) * WeightForGauss(x), left, right, MathNetIntegrationNodeNumber);

            FormatExtensions.PrintDivider();

            Console.WriteLine($"Функция: f(x) = sin(x) | Вес: 1 / (x + 0.1)");
            Console.WriteLine($"Отрезок интегрирования: [{left.Format(5)}, {right.Format(5)}]");
            Console.WriteLine($"Фактическое значение интеграла: {gaussExpectedIntegral.Format()}");
            Console.WriteLine($"Число отрезков деления для КФ Гаусса: {segmentNumber}");
            Console.WriteLine($"Длина отрезка для КФ Гаусса: {segmentLength.Format()}\n");

            Console.WriteLine(
                $"Формула Гаусса\n" +
                $"Вычисленное приближенное значение: {gaussIntegral.Format()}\n" +
                $"Абсолютная фактическая погрешность: {Math.Abs(gaussExpectedIntegral - gaussIntegral).Format()}\n\n" +
                $"Формула типа Гаусса\n" +
                $"Вычисленное приближенное значение: {gaussLikeIntegral.Format()}\n" +
                $"Абсолютная фактическая погрешность: {Math.Abs(gaussExpectedIntegral - gaussLikeIntegral).Format()}\n\n");

            FormatExtensions.PrintDivider();

            Console.WriteLine($"Функция: f(x) = 1 / (1 + x^2) | Вес: 1 / sqrt(1 - x^2)");
            Console.WriteLine($"Отрезок интегрирования: [-1, 1]");
            Console.WriteLine($"Фактическое значение интеграла: {MelerExpectedIntegral.Format()}");
            Console.WriteLine($"Число узлов для КФ Мелера: {nodeNumber}\n");

            Console.WriteLine(
                $"Формула Мелера\n" +
                $"Вычисленное приближенное значение: {melerIntegral.Format()}\n" +
                $"Абсолютная фактическая погрешность: {Math.Abs(MelerExpectedIntegral - melerIntegral).Format()}\n\n");

            Console.WriteLine($"Чтобы выйти, нажмите \'Esc\'\n");

            if (Console.ReadKey().Key == ConsoleKey.Escape)
            {
                return(false);
            }

            return(true);
        }