Численное интегрирование методом Гаусса 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д