Mikhail-Podbolotov

Untitled

May 24th, 2025
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4. #include <stdexcept>
  5.  
  6. using namespace std;
  7.  
  8. double f(double x) {
  9.     return sin(x); // Интегрируемая функция
  10. }
  11.  
  12. double compute_integral(double a, double b, double epsilon, string method) {
  13.     if (method == "left" || method == "right") {
  14.         int n = 1;
  15.         double h = (b - a) / n;
  16.         double sum;
  17.         if (method == "left") {
  18.             sum = f(a);
  19.         } else { // right
  20.             sum = f(a + h); // Правая точка первого интервала
  21.         }
  22.         double integral = sum * h;
  23.         double prev_integral;
  24.         do {
  25.             prev_integral = integral;
  26.             n *= 2;
  27.             h /= 2;
  28.             double new_sum = 0.0;
  29.             for (int i = 0; i < n / 2; ++i) {
  30.                 double x = a + (2 * i + 1) * h; // Середины предыдущих интервалов
  31.                 new_sum += f(x);
  32.             }
  33.             sum += new_sum;
  34.             integral = sum * h;
  35.         } while (abs(integral - prev_integral) > epsilon);
  36.         return integral;
  37.     } else if (method == "trapezoid") {
  38.         int n = 1;
  39.         double h = (b - a) / n;
  40.         double S = 0.0; // Сумма внутренних точек
  41.         double integral = (h / 2) * (f(a) + f(b));
  42.         double prev_integral;
  43.         do {
  44.             prev_integral = integral;
  45.             n *= 2;
  46.             h /= 2;
  47.             double sum_new = 0.0;
  48.             for (int i = 0; i < n / 2; ++i) {
  49.                 double x = a + (2 * i + 1) * h;
  50.                 sum_new += f(x);
  51.             }
  52.             S += sum_new;
  53.             integral = h * (0.5 * (f(a) + f(b)) + S);
  54.         } while (abs(integral - prev_integral) > epsilon);
  55.         return integral;
  56.     } else if (method == "simpson") {
  57.         if (b == a) return 0.0;
  58.         int n = 2;
  59.         double h = (b - a) / n;
  60.         double sum_odd = f(a + h);
  61.         double sum_even = 0.0;
  62.         double integral = (h / 3) * (f(a) + 4 * sum_odd + f(b));
  63.         double prev_integral;
  64.         do {
  65.             prev_integral = integral;
  66.             n *= 2;
  67.             h /= 2;
  68.             double sum_odd_new = 0.0;
  69.             for (int i = 0; i < n / 2; ++i) {
  70.                 double x = a + (2 * i + 1) * h;
  71.                 sum_odd_new += f(x);
  72.             }
  73.             sum_even += sum_odd;
  74.             sum_odd = sum_odd_new;
  75.             integral = (h / 3) * (f(a) + 2 * sum_even + 4 * sum_odd + f(b));
  76.         } while (abs(integral - prev_integral) > epsilon);
  77.         return integral;
  78.     } else {
  79.         throw invalid_argument("Unknown method");
  80.     }
  81. }
  82.  
  83. int main() {
  84.     double a, b, epsilon;
  85.     string method;
  86.     cout << "Enter a: ";
  87.     cin >> a;
  88.     cout << "Enter b: ";
  89.     cin >> b;
  90.     cout << "Enter epsilon: ";
  91.     cin >> epsilon;
  92.     cout << "Enter method (left, right, trapezoid, simpson): ";
  93.     cin >> method;
  94.  
  95.     try {
  96.         double result = compute_integral(a, b, epsilon, method);
  97.         cout << "Integral result: " << result << endl;
  98.     } catch (const invalid_argument& e) {
  99.         cerr << "Error: " << e.what() << endl;
  100.     }
  101.  
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment