Численное интегрирование методом прямоугольников (реализация на C++)

C++   6 Февраль 2012  Автор статьи:  

Приведем пример реализации численного интегрирования методом левых и правых прямоугольников. На вход алгоритму подается набор точек, по которым требуется найти приближенное значение интеграла неизвестной функции. На выходе алгоритм выдает найденное приближенное значение с 8-ю знаками точности. Заметим, что эти два метода практически идентичны, единственное отличие заключается в том, ординату какой точки взять в качестве высоты прямоугольника (см. комментарии). Все вычислительные операции производятся с типом данных long double в целях повышения точности вычислений.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
using namespace std;

// Для удобства хранения заданных точек
// создадим соответствующую структуру
struct point
{
    long double x, y;  
};

int main()
{
    // Объявляем и считываем число точек,
    // по которым будем вычислять приближенное
    // значение интеграла функции
    int pointsCount;
    cin >> pointsCount;

    // Точки будем хранить в векторе структур;
    // его размер, очевидно, равен pointsCount
    vector <point> points;
    points.resize (pointsCount);

    // Считываем абсциссы и ординаты точек
    for (int i = 0; i < pointsCount; i++)
    {
        cin >> points[i].x >> points[i].y;
    }  

    // Изначально приравниваем приближенное
    // значение интеграла к нулю
    long double integralValue = 0.0;

    // Для каждой пары соседних точек считаем
    // площадь левого или правого прямоугольника,
    // который они образуют вместе с осью абсцисс,
    // по соответствующим теоретическим формулам
    for (int i = 1; i < pointsCount; i++)
    {
        // Воспользуемся формулой левых прямоугольников
        integralValue += (points[i].x - points[i - 1].x) * points[i - 1].y;
        // Формула же для правых прямоугольников имеет вид
        // integralValue += (points[i].x - points[i - 1].x) * points[i].y;
    }
   
    // Выводим приближенное значение интеграла
    // c восемью знаками точности
    printf ("%.8llf", integralValue);

    return 0;
}

Научиться программировать

  • на Delphi

  • на Java

  • на C++