Численное интегрирование методом Гаусса I = exp^(-(x/2))dx - C#

Узнай цену своей работы

Формулировка задачи:

Help me, please возникли трудности с написанием программы(новичек в программировании) вычисления интегрирования методом Гаусса на с# I = exp^(-(x/2))dx Пределы интегрирования - от 0 до х. Сам метод разобрать более менее получилось, а в коде запуталась

Решение задачи: «Численное интегрирование методом Гаусса I = exp^(-(x/2))dx»

textual
Листинг программы
    class Program
    {
 
        public static double Legendre(double x, int deg)
        {
// полином Лежандра степени n в точке X
            double P0 = 1.0;
            double P1 = x;
            double P2 = (3.0 * x * x - 1) / 2.0;
            int n = 1;
            if (deg < 0)
                throw new Exception("Bad Hermite polynomial: deg < 0");
            if (deg == 0)
                return P0;
            else if (deg == 1)
                return P1;
            else
            {
                while (n < deg)
                {
                    P2 = 2.0 * x * P1 - P0 - (x * P1 - P0) / (deg + 1);
                    P0 = P1;
                    P1 = P2;
                    n++;
                }
                return P2;
            }
        }
        public static double GaussLegendre(Function f, double a, double b, int n)
        {
// Формула Гаусса
            double[] x, w;
            LegendreNodesWeights(n, out x, out w);
 
            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 static void LegendreNodesWeights(int n, out double[] x, out double[] w)
        {
// веса полиномов Лежандра
            double c, d, p1, p2, p3, dp;
 
            x = new double[n];
            w = new double[n];
 
            for (int i = 0; i < (n + 1) / 2; i++)
            {
                c = Math.Cos(Math.PI * (4 * i + 3) / (4 * n + 2));
                do
                {
                    p2 = 0;
                    p3 = 1;
                    for (int j = 0; j < n; j++)
                    {
                        p1 = p2;
                        p2 = p3;
                        p3 = ((2 * j + 1) * c * p2 - j * p1) / (j + 1);
                    }
                    dp = n * (c * p3 - p2) / (c * c - 1);
                    d = c;
                    c -= p3 / dp;
                }
                while (Math.Abs(c - d) > 1e-12);
                x[i] = c;
                x[n - 1 - i] = -c;
                w[i] = 2 * (1 - x[i] * x[i]) / (n + 1) / (n + 1) / Legendre(x[i], n + 1) / Legendre(x[i], n + 1);
                w[n - 1 - i] = w[i];
            }
        }
        public delegate double Function(double x);
 
        static double f2(double x)
        {
            return Math.Exp(-x * x);
        }
 
        static void Main(string[] args)
        {
// формулы взяты из [url]https://en.wikipedia.org/wiki/Gaussian_quadrature[/url]
 
            Console.WriteLine("\nResult from Gauss-Legendre method:\n");
            double a,b,result;
 
            // f2 - интегрируемая функция
            // a,b - пределы интегрирования
            // n - степень полинома Лежандра
 
            a = 0;
            b = 10;
            for (int n = 1; n < 9; n++)
            {
                result = GaussLegendre(f2, a, b, n);
                Console.WriteLine(" n = {0}, result = {1}", n, result);
            }
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы