Вычисление интеграла методом Гаусса-Лежандра

Необходимо найти значение определённого интеграла с использованием квадратур Гаусса-Лежандра.

Это численный метод решения, имеющий высокую точность расчета (в данном примере до 6 знаков) за небольшое количество вычислений.

Теория:

Метод Гаусса (численное интегрирование)

Gauss–Legendre quadrature

https://ru.wikipedia.org/wiki/Численное_интегрирование

Интеграл


Ответы (1 шт):

Автор решения: c0ol

Выкладываю ответ на свой вопрос, т.е. простой пример метода для сообщества.

Веса и значения аргумента нужно брать из этой таблицы. Степень полинома - это число точек в квадратуре.

Его можно использовать для нахождения длины кривой, равноудаленных точек на кривой или движения с постоянной скоростью объекта в играх.

using System;
    
    namespace MyGaussLegandre
    {
        class Program
        {
    
            public static double GaussLegendre(Function f, double a, double b, int n)
            {
                // Число точек в квадратуре - 2
                double[] w = { 1.0, 1.0 }; // весовые коэффициенты
                double[] x = { -0.577350269, +0.577350269 }; // значения аргумента
    
    
                double sum = 0.0;
                for (int i = 0; i < n; i++)
                {
                    sum += 0.5 * (b - a) * w[i] * f(0.5 * (a + b) + 0.5 * (b - a) * x[i]);
                }
                return sum;
            }
    
            // Делегат
            public delegate double Function(double x);
    
            // Интегрируемая функция y = 4*x^3 
            static double f2(double x)
            {
                return 4 * Math.Pow(x, 3);
            }
    
    
            static void Main(string[] args)
            {
    
                Console.WriteLine("\nResult from Gauss-Legendre method:\n");
                
                double a, b, result;
    
                // f2 - интегрируемая функция
                // a,b - пределы интегрирования
                // n - степень полинома Лежандра
    
                a = 0;
                b = Math.PI;
    
                result = GaussLegendre(f2, a, b, 2);
    
                Console.WriteLine("result = {0}", result);
            }
        }
    }

Таблица весов

→ Ссылка