Метод парабол (Симпсона) на С++

      Комментарии к записи Метод парабол (Симпсона) на С++ отключены

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

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

    Недавно мы разобрали алгоритм Симпсона численного интегрирования, теперь реализуем его на С++.

    Напомню, что интервал интегрирования разбивается на кусочки, на каждом из которых вычисляется площадь под параболой по формуле:

    Блок-схема функции, выполняющей разбиение и вычисление суммы площадей на этих кусочках:

    Код программы:

    #include <iostream>
    #include <math.h>
    #include <cmath>
    
    using namespace std;
    
    typedef double(*pointFunc)(double);
    
    double f(double x) {
      return (10 - x);
    }
    
    double simpson_integral(pointFunc f, double a, double b, int n) {
      const double h = (b-a)/n;
      double k1 = 0, k2 = 0;
    
      for(int i = 1; i < n; i += 2) {
        k1 += f(a + i*h);
        k2 += f(a + (i+1)*h);
      }
    
      return h/3*(f(a) + 4*k1 + 2*k2);
    }
    
    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 = simpson_integral(f, a, b, n); //первое приближение для интеграла
      do {
        s = s1;     //второе приближение
        n = 2 * n;  //увеличение числа шагов в два раза,
                    //т.е. уменьшение значения шага в два раза
        s1 = simpson_integral(f, a, b, n);
      }
      while (fabs(s1 - s) > eps);  //сравнение приближений с заданной точностью
    
      cout << "\nИнтеграл = " << s1 << endl;
    }
    

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

    Функция simpson_integral соответствует приведенной выше блок-схеме. Функция принимает указатель на функцию, границы интервала и количество разбиений. В функции main описан цикл, производящий вычисления до тех пор, пока разница результатов интегрирования, полученных для n и 2*n разбиений не окажется меньше заданного значения погрешности (eps).

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