Загрузка данных


H. Интеграл ПИ С++ 23
Не решена
Ограничение времени	1 секунда
Ограничение памяти	64 Мб
Ввод	стандартный ввод или input.txt
Вывод	стандартный вывод или output.txt
Вася изучил два метода приближенного интегрирования функций — метод прямоугольников и метод трапеций. Он даже написал программу, которая будет получать на вход метод интегрирования, концы отрезка и число отрезков разбиения, и будет вычислять интеграл от функций 
sin
(
x
)
sin(x) и 
cos
(
x
)
cos(x). Код доступен в общем архиве условий задач справа сверху.#include "quadrature.h"

#include <cmath>
#include <iostream>
#include <memory>
#include <string>

int main() {
    using F = decltype(cos);

    std::string input;
    std::cin >> input;
    std::unique_ptr<IntegrationMethod<F>> method;
    if (input == "rectangle")
        method.reset(new RectangleRule<F>);
    else
        method.reset(new TrapezoidalRule<F>);

    double x, y;
    std::cin >> x >> y;

    int n;
    std::cin >> n;

    std::cout << method->Integrate(cos, x, y, n) << "\n";
    std::cout << method->Integrate(sin, x, y, n) << "\n";
}


Напишите недостающие классы IntegrationMethod, RectangleRule и TrapezoidalRule с реализацией методов интегрирования, чтобы Васина программа заработала. В них должна быть реализована функция Integrate, принимающая на вход функцию для интегрирования, концы отрезка (double) и число частей для разбиения (int).

Обратите внимание, что шаблонные функции не могут быть виртуальными, поэтому тип функции интегрирования не получится сделать шаблонным параметром функции Integrate. Вместо этого нужно сделать шаблонным весь класс, и передавать тип функции еще при создании класса. К счастью, последнюю часть Вася уже сделал за вас (см. строки 9, 13, 15, 17).

Пример
Ввод
Вывод
rectangle 0 3.1415926 100
5.3592e-08
2.00008
Примечания
Вам нужно сдать только код классов. В вашей программе не должно быть функции main: мы будем тестировать ваш код с Васиной функцией main.

Формулы интегрирования такие:

∫
b
a
f
(
x
)
d
x
≈
n
−
1
∑
i
=
0
 
f
(
x
i
+
x
i
+
1
2
)
(
x
i
+
1
−
x
i
)
(формула прямоугольников)
,
∫ 
a
b
​
 f(x)dx≈ 
i=0
∑
n−1
​
 f( 
2
x 
i
​
 +x 
i+1
​
 
​
 )(x 
i+1
​
 −x 
i
​
 )(формула прямоугольников),
∫
b
a
f
(
x
)
d
x
≈
n
−
1
∑
i
=
0
 
f
(
x
i
)
+
f
(
x
i
+
1
)
2
(
x
i
+
1
−
x
i
)
(формула трапеций)
,
∫ 
a
b
​
 f(x)dx≈ 
i=0
∑
n−1
​
  
2
f(x 
i
​
 )+f(x 
i+1
​
 )
​
 (x 
i+1
​
 −x 
i
​
 )(формула трапеций),
где 
x
k
=
a
+
b
−
a
n
k
x 
k
​
 =a+ 
n
b−a
​
 k.

Ответ
Язык
(make) Clang 18.1.8