Метод левых прямоугольников на С++

      Комментарии к записи Метод левых прямоугольников на С++ отключены

Главная Форумы Программирование Программирование на С++ Метод левых прямоугольников на С++

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 3 нед., 2 дн. назад.

  • Автор
    Сообщения
  • #3535

    Алгоритм метода был разобран ранее: Метод левых прямоугольников численного интегрирования. Реализуем его на С++:

    #include <iostream>
    #include <math.h>
    #include <cmath>
    
    using namespace std;
    
    typedef double(*pointFunc)(double);
    
    double f(double x) {
      return (10 - x);
    }
    
    double rectangle_integral(pointFunc f, double a, double b, int n) {
      double x, h;
      double sum = 0.0;
      double fx;
      h = (b - a) / n;  //шаг
      
      for (int i = 0; i < n; i++) {
        x = a + i*h;
        fx = f(x);
        sum += fx;
      }
      return (sum * h); //приближенное значение интеграла равно 
                        //сумме площадей прямоугольников
    }
    int main(){
      double a, b, eps;
      double s1, s;
      int n = 1; //начальное число шагов
      
      cout << "Введите левую границу интегрирования a = ";
      cin >> a;
      cout << "\nВведите правую границу интегрирования b = ";
      cin >> b;
      cout << "\nВведите требуемую точность eps = ";
      cin >> eps;
    
      s1 = rectangle_integral(f, a, b, n); //первое приближение для интеграла
      do {
        s = s1;     //второе приближение
        n = 2 * n;  //увеличение числа шагов в два раза, 
                    //т.е. уменьшение значения шага в два раза
        s1 = rectangle_integral(f, a, b, n);
      }
      while (fabs(s1 - s) > eps);  //сравнение приближений с заданной точностью
    
      cout << "\nИнтеграл = " << s1 << endl;
    }

    Обратите внимание, что функция интегрирования принимает в качестве аргумента указатель на функцию (pointFunc) — такой подход позволяет использовать интегрирование для любых функций, у которых на входе и выходе значение double (все функции, заданные на плоскости).

    Результат работы программы:

    В этой реализации выполняется:

    1. пользователь с клавиатуры вводит следующие данные: левую границу интегрирования – а, правую границу интегрирования – b и требуемую точность – е.
    2. начальное число шагов n равно 1, первое приближение вычисляется в функции double rectangle_integral(f, a, b, n) и записывается в s1. Функция принимает подынтегральную функцию f из double f(x), заданные границы a и b, а также число шагов n.
      На данном шаге функция double rectangle_integral() вычисляет шаг h по формуле:
      h = (b - a) / n,
      затем задается цикл (вычисления от i = 0 до i = n – 1 с шагом 1), который на данном шаге отработает один раз (n = 1), в котором вычисляется параметр x по формуле:
      x = a + i*h,
      а затем сумма всех f(x) – sum с помощью функции double f(x).
      В итоге функция double rectangle_integral() возвратит сумму всех вычисленных площадей по формуле:
      sum*h.
    3. объявляется цикл while в функции main(), в котором осуществляется вычисление второго приближения – s = s1, увеличение числа шагов n в два раза – n = 2*n, вычисление s1 через функцию double rectangle_integral() (см. шаг 2 с поправкой, что n теперь равно 2*n.
    4. выход из цикла осуществляется, когда условие |s1 – s| > eps перестает выполняться, то есть разность двух приближений по модулю достигла заданной точности.
    5. вывод полученного значения интеграла – s1.

Для ответа в этой теме необходимо авторизоваться.