Численное интегрирование методом Гаусса 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);
}
}
}