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

Java   5 Февраль 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
72
73
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].getY() + points[i - 1].getY());
        }

        // Для небольшого ускорения работы алгоритма
        // деление пополам выносят за пределы цикла
        integralValue /= 2.0;

        // Выводим приближенное значение интеграла
        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++