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

Java   8 Февраль 2012  Автор статьи:  

Приведем пример реализации численного интегрирования методом левых и правых прямоугольников. На вход алгоритму подается набор точек, по которым требуется найти приближенное значение интеграла неизвестной функции. На выходе алгоритм выдает найденное приближенное значение. Заметим, что эти два метода практически идентичны, единственное отличие заключается в том, ординату какой точки взять в качестве высоты прямоугольника (см. комментарии). Все вычислительные операции производятся с типом данных 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.io.PrintWriter;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        // Для считывания воспользуемся классом Scanner
        // Для вывода - классом PrintWriter
        Scanner scanner = new Scanner(System.in);
        PrintWriter printWriter = new PrintWriter(System.out);

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

        // Точки будем хранить в массиве структур;
        // его размер, очевидно, равен pointsCount
        Point[] points;
        points = new Point[pointsCount];

        // Считываем абсциссы и ординаты точек
        for (int i = 0; i < pointsCount; i++) {
            points[i] = new Point(scanner.nextDouble(), scanner.nextDouble());
        }

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

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

        // Выводим приближенное значение интеграла
        printWriter.println(integralValue);

        // После выполнения программы необходимо закрыть
        // потоки ввода и вывода
        scanner.close();
        printWriter.close();
    }

    // Для удобства хранения задаваемых точек
    // создадим простой класс, хранящий абсциссу
    // и ординату точки соответственно
    private static final class Point {
        private final double x;
        private final double y;

        private Point(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double getX() {
            return x;
        }

        public double getY() {
            return y;
        }
    }
}

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

  • на Delphi

  • на Java

  • на C++