Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

На С# найти численное (приближенное) значение определенного интеграла с помощью двух методов

MRKVCH Знаток (285), закрыт 3 недели назад
на с#
a) найти численное (приближенное) значение определенного интеграла с помощью двух методов
– левых прямоугольников и трапеций.
b) найти аналитическое (точное) значение заданного интеграла с помощью первообразной.
Пределы интегрирования следует считывать с клавиатуры в качестве входных параметров. Число
разбиения N считать константой и для всех вариантов использовать значение N = 100.
Результаты округлите до 5-ти знаков после запятой.
Лучший ответ
Ксения Райт Гений (86339) 1 месяц назад
У Вас подынтегральная функция какая? Могу что-нибудь простое предложить - например, синус. С пределами интегрирования, вводимыми в одну строку через пробел:
 using System; 
namespace NewProject
{
public static class Program
{
public static double f(double x)
{ return Math.Sin(x); }
public static double F(double x)
{ return -Math.Cos(x); }
public static void Main()
{
const int N = 100;
double a, b, h, x, s, trap, rect, S;
while (true)
{
Console.Write("a b: ");
var line = Console.ReadLine().Split(" ");
a = double.Parse(line[0]);
b = double.Parse(line[1]);
S = F(b) - F(a);
Console.WriteLine("Точное значение: " + S);
h = (b - a) / N;
s = 0;
for (int i = 1; i < N; ++i) s += f(a + i * h);
trap = ((f(a) + f(b)) * 0.5 + s) * h;
Console.WriteLine("Meтод трапеций: {0,0:f5} ({1,0:e3})",
trap, trap - S);
rect = (f(a) + s) * h;
Console.WriteLine("Метод левых прямоугольников: {0,0:f5} ({1,0:e3})",
rect, rect - S);
}
}
}
}
Для обоих методов основная интегральная сумма одна и та же, лишь поправки к ней разные, так что её надо вычислять только один раз! В скобках после вычисленного приближённого значения интеграла в показательном виде печатается его абсолютная ошибка по сравнению с "точным" значением интеграла.
Вместо f=sin(x) с его первообразной F=-cos(x) во внешние функции можно подставить и что-нибудь другое. А обёртку в бесконечный цикл while (true) { } можно убрать.
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (425546) 1 месяц назад
Могу подарить метод, считающий методом трапеций:
 public delegate double SimpleFunction(double x); 
public static double Trapezoid(SimpleFunction _IntegratedFunction, double _LowerBorder, double _UpperBorder, int _StepCount)
{
double Result = 0;
double dx = (_UpperBorder - _LowerBorder) / _StepCount;
for (int i = 0; i < _StepCount; i++)
{
double x = _LowerBorder + dx * i;
Result += (_IntegratedFunction(x) + _IntegratedFunction(x + dx)) / 2 * dx;
}
return Result;
}
Пример использования:
 Console.WriteLine(Trapezoid(x => x, 0, 1, 1)); 

Прямоугольники аналогично.
Похожие вопросы