Mikhail-Podbolotov

Untitled

May 24th, 2025
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. // Пример функции: f(x) = sin(x)
  7. double f(double x) {
  8.     return sin(x);
  9. }
  10.  
  11. // Метод трапеций с кешированием значений функции (без vector)
  12. double trapezoidal_integral(double a, double b, double eps) {
  13.     int n = 1;
  14.     double h = b - a;
  15.  
  16.     // Массив значений функции
  17.     double* fx = new double[2];
  18.     fx[0] = f(a);
  19.     fx[1] = f(b);
  20.  
  21.     double prev_integral = h * (fx[0] + fx[1]) / 2.0;
  22.  
  23.     while (true) {
  24.         int new_n = 2 * n;
  25.         double new_h = h / 2.0;
  26.  
  27.         // Расширение массива: новые значения функции
  28.         double* new_fx = new double[new_n + 1];
  29.  
  30.         // Копируем старые значения
  31.         for (int i = 0; i <= n; ++i) {
  32.             new_fx[2 * i] = fx[i];
  33.         }
  34.  
  35.         // Вычисляем и сохраняем новые точки
  36.         double sum = 0.0;
  37.         for (int i = 0; i < n; ++i) {
  38.             double x = a + (2 * i + 1) * new_h;
  39.             new_fx[2 * i + 1] = f(x);
  40.             sum += new_fx[2 * i + 1];
  41.         }
  42.  
  43.         double current_integral = prev_integral / 2.0 + new_h * sum;
  44.  
  45.         delete[] fx;
  46.         fx = new_fx;
  47.         h = new_h;
  48.         n = new_n;
  49.  
  50.         if (abs(current_integral - prev_integral) < eps) {
  51.             delete[] fx;
  52.             return current_integral;
  53.         }
  54.  
  55.         prev_integral = current_integral;
  56.     }
  57. }
  58.  
  59. int main() {
  60.     double a, b, eps;
  61.     cout << "Введите нижний предел интегрирования (a): ";
  62.     cin >> a;
  63.     cout << "Введите верхний предел интегрирования (b): ";
  64.     cin >> b;
  65.     cout << "Введите точность вычисления (eps): ";
  66.     cin >> eps;
  67.  
  68.     double result = trapezoidal_integral(a, b, eps);
  69.     cout.precision(10);
  70.     cout << "Приближенное значение интеграла: " << result << endl;
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment