Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <string>
- #include <stdexcept>
- using namespace std;
- double f(double x) {
- return sin(x); // Интегрируемая функция
- }
- double compute_integral(double a, double b, double epsilon, string method) {
- if (method == "left" || method == "right") {
- int n = 1;
- double h = (b - a) / n;
- double sum;
- if (method == "left") {
- sum = f(a);
- } else { // right
- sum = f(a + h); // Правая точка первого интервала
- }
- double integral = sum * h;
- double prev_integral;
- do {
- prev_integral = integral;
- n *= 2;
- h /= 2;
- double new_sum = 0.0;
- for (int i = 0; i < n / 2; ++i) {
- double x = a + (2 * i + 1) * h; // Середины предыдущих интервалов
- new_sum += f(x);
- }
- sum += new_sum;
- integral = sum * h;
- } while (abs(integral - prev_integral) > epsilon);
- return integral;
- } else if (method == "trapezoid") {
- int n = 1;
- double h = (b - a) / n;
- double S = 0.0; // Сумма внутренних точек
- double integral = (h / 2) * (f(a) + f(b));
- double prev_integral;
- do {
- prev_integral = integral;
- n *= 2;
- h /= 2;
- double sum_new = 0.0;
- for (int i = 0; i < n / 2; ++i) {
- double x = a + (2 * i + 1) * h;
- sum_new += f(x);
- }
- S += sum_new;
- integral = h * (0.5 * (f(a) + f(b)) + S);
- } while (abs(integral - prev_integral) > epsilon);
- return integral;
- } else if (method == "simpson") {
- if (b == a) return 0.0;
- int n = 2;
- double h = (b - a) / n;
- double sum_odd = f(a + h);
- double sum_even = 0.0;
- double integral = (h / 3) * (f(a) + 4 * sum_odd + f(b));
- double prev_integral;
- do {
- prev_integral = integral;
- n *= 2;
- h /= 2;
- double sum_odd_new = 0.0;
- for (int i = 0; i < n / 2; ++i) {
- double x = a + (2 * i + 1) * h;
- sum_odd_new += f(x);
- }
- sum_even += sum_odd;
- sum_odd = sum_odd_new;
- integral = (h / 3) * (f(a) + 2 * sum_even + 4 * sum_odd + f(b));
- } while (abs(integral - prev_integral) > epsilon);
- return integral;
- } else {
- throw invalid_argument("Unknown method");
- }
- }
- int main() {
- double a, b, epsilon;
- string method;
- cout << "Enter a: ";
- cin >> a;
- cout << "Enter b: ";
- cin >> b;
- cout << "Enter epsilon: ";
- cin >> epsilon;
- cout << "Enter method (left, right, trapezoid, simpson): ";
- cin >> method;
- try {
- double result = compute_integral(a, b, epsilon, method);
- cout << "Integral result: " << result << endl;
- } catch (const invalid_argument& e) {
- cerr << "Error: " << e.what() << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment