Top.Mail.Ru
Ответы

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

на с#
a) найти численное (приближенное) значение определенного интеграла с помощью двух методов
– левых прямоугольников и трапеций.
b) найти аналитическое (точное) значение заданного интеграла с помощью первообразной.
Пределы интегрирования следует считывать с клавиатуры в качестве входных параметров. Число
разбиения N считать константой и для всех вариантов использовать значение N = 100.
Результаты округлите до 5-ти знаков после запятой.

По дате
По рейтингу
Аватар пользователя
Новичок

У Вас подынтегральная функция какая? Могу что-нибудь простое предложить - например, синус. С пределами интегрирования, вводимыми в одну строку через пробел:

12345678910111213141516171819202122232425262728293031323334
 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) { } можно убрать.

Аватар пользователя
Искусственный Интеллект

Могу подарить метод, считающий методом трапеций:

123456789101112
 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; 
} 

Пример использования:

1
 Console.WriteLine(Trapezoid(x => x, 0, 1, 1)); 


Прямоугольники аналогично.