Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- using namespace std;
- // Пример функции: f(x) = sin(x)
- double f(double x) {
- return sin(x);
- }
- // Метод трапеций с кешированием значений функции (без vector)
- double trapezoidal_integral(double a, double b, double eps) {
- int n = 1;
- double h = b - a;
- // Массив значений функции
- double* fx = new double[2];
- fx[0] = f(a);
- fx[1] = f(b);
- double prev_integral = h * (fx[0] + fx[1]) / 2.0;
- while (true) {
- int new_n = 2 * n;
- double new_h = h / 2.0;
- // Расширение массива: новые значения функции
- double* new_fx = new double[new_n + 1];
- // Копируем старые значения
- for (int i = 0; i <= n; ++i) {
- new_fx[2 * i] = fx[i];
- }
- // Вычисляем и сохраняем новые точки
- double sum = 0.0;
- for (int i = 0; i < n; ++i) {
- double x = a + (2 * i + 1) * new_h;
- new_fx[2 * i + 1] = f(x);
- sum += new_fx[2 * i + 1];
- }
- double current_integral = prev_integral / 2.0 + new_h * sum;
- delete[] fx;
- fx = new_fx;
- h = new_h;
- n = new_n;
- if (abs(current_integral - prev_integral) < eps) {
- delete[] fx;
- return current_integral;
- }
- prev_integral = current_integral;
- }
- }
- int main() {
- double a, b, eps;
- cout << "Введите нижний предел интегрирования (a): ";
- cin >> a;
- cout << "Введите верхний предел интегрирования (b): ";
- cin >> b;
- cout << "Введите точность вычисления (eps): ";
- cin >> eps;
- double result = trapezoidal_integral(a, b, eps);
- cout.precision(10);
- cout << "Приближенное значение интеграла: " << result << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment