Нахождение интеграла - C#
Формулировка задачи:
Пишу программу в которой находится значение интеграла методом Симпсона, трапеци и левых прямоугольников
Привожу пример кода:
Левые прямоугольники
Трапеции
Симпсона
Вопрос вот в чет: после выдачи результата: например функции e^((-x)^2) в л.п. ответ- 1,75;Трапеци - 1,95; Симпсона - 1,93. Преподаватель сказал что погрешность результатов должна быть 0,01 или 0,001 то есть все ответы должны быть одинаковые.
Но у меня они разные, хотя если проверять в мат.калькуляторе то все правильно. Скажите почему так: у меня не корректно написана программа для нахождения метода или суть в самих методах и это нормально ???
public double lev1(int n, double a, double b)
{
double sum = 0;
double h = (b - a) / n;
for (double i = a; i < b; i = i + h)
sum += F1(i);
return sum * h;
} public double lev3(int n, double a, double b)
{
double h = (b - a) / n;
double result = 0.0;
result += F3(a) / 2.0;
result += F3(b) / 2.0;
for (int i = 1; i < n; ++i)
result += F3(a + i * h);
return h * result;
}public double lev8(int n, double a, double b)
{
double h;
h = (b - a) / n;
double I, I2 = 0.0, I4 = 0.0;
I4 = F8(a + h);
for (int k = 2; k < n; k += 2)
{
I4 += F8(a + (k + 1) * h);
I2 += F8(a + k * h);
}
I = F8(a) + F8(b) + 4 * I4 + 2 * I2;
I *= h / 3;
return I;
}Решение задачи: «Нахождение интеграла»
textual
Листинг программы
class Program
{
static void Main(string[] args)
{
Console.Write("Введите начальное n:");
int n=Convert.ToInt32(Console.ReadLine());
Console.Write("Введите шаг, с которым будем искать:");
int shag = Convert.ToInt32(Console.ReadLine());
Console.Write("Введите a:");
double a = Convert.ToDouble(Console.ReadLine());
Console.Write("Введите b:");
double b = Convert.ToDouble(Console.ReadLine());
double res1, res2, res3;
do
{
res1 = lev1(n, a, b);
res2 = lev3(n, a, b);
res3 = lev8(n, a, b);
n = n + shag;
}
while ((Math.Abs(res1 - res2) > 0.0001)||((Math.Abs(res2 - res3) > 0.0001)));
//Выводим результат
Console.WriteLine(n);
Console.WriteLine(res1);
Console.WriteLine(res2);
Console.WriteLine(res3);
}
public static double F1(double x)
{
return Math.Exp(Math.Pow(-x, 2));
}
public static double lev1(int n, double a, double b)
{
double sum = 0;
double h = (b - a) / n;
for (double i = a; i < b; i = i + h)
sum += F1(i);
return sum * h;
}
public static double lev3(int n, double a, double b)
{
double h = (b - a) / n;
double result = 0.0;
result += F1(a) / 2.0;
result += F1(b) / 2.0;
for (int i = 1; i < n; ++i)
result += F1(a + i * h);
return h * result;
}
public static double lev8(int n, double a, double b)
{
double h;
h = (b - a) / n;
double I, I2 = 0.0, I4 = 0.0;
I4 = F1(a + h);
for (int k = 2; k < n; k += 2)
{
I4 += F1(a + (k + 1) * h);
I2 += F1(a + k * h);
}
I = F1(a) + F1(b) + 4 * I4 + 2 * I2;
I *= h / 3;
return I;
}
}