Metody numeryczne – całkowanie – Java

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2013-02-17) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

Cześć. Dziś nieco bardziej matematycznie.
Szybka powtórka: Całka to pole powierzchni pod wykresem funkcji.


Całka oznaczona na przedziale <a,b></a,b>

Wartość całki jest t więc pole powierzchni tej zielonej figury.

Słowem wstepu.. Mamy 4 popularne metody numeryczne które pozwalają obliczyć wartość całki:

  • Metoda prostokątów – pole powierzchni przybliżane jest poprzez podzielenie obszaru na prostokąty.
  • Metoda trapezów – pole powierzchni przybliżane jest poprzez podzielenie obszaru na trapezy.
  • Metoda Monte Carlo – zliczamy punkty które wpadają w wykres funkcji.
  • Metoda Simpsona – będziemy obliczali sumy wycinków obszarów pod parabolą.

Dziś zajmiemy się metodą która jest najlepsza biorąc pod uwagę skomplikowanie i dokładność – czyli metodę trapezów. Dokładniejsza od niej jest metoda Simpsona, ale jest nieco bardziej skomplikowana.

Ok, skoro wiemy że będziemy sumować sumy pól powierzchni trapezów to warto przypomnieć wzór na pole trapezu:

.

Dzielimy teraz pole powierzchni na n trapezów. Wysokość każdego z trapezów będzie taka sama i będzie równa

Teraz musimy wyznaczyć punkty, czyli przedział dzieli na n równych partii wzorem:

No i teraz wystarczy zsumować pola, które, wg wzoru pierwszego to:

Więc mamy taką sumę:

No to wyciągamy przed nawias

i dostajemy:

I po przekształceniach dostajemy wzór na całkę:

No i dostaliśmy finalną wersję wzoru iteracyjnego na obliczenie wartości całki w metodzie trapezów.
Teraz przystąpny do implementacji. Funkcję którą bedziemy całkować stworzyłem jako metodę klasy abstrakcyjnej. Klasa która liczy całkę rozszerza klase z funkcją co daje nieco wygody.. Ok, pierw wywołanie:

1
2
3
4
5
6
7
8
9
public class Calka {

  public static void main(String[] args) {

      Integral i = new Integral(100000, 0, 5);
      System.out.println(i.calc());

  }
}

Jak widzimy w kodzie, funkcja którą bedziemy całkować to funkcja kwadratowa. W konstruktorze pierw podziejmy dokładność operacji (im większe tym wolniej i dokładniej) no i odpowiednio – a i b – przedziały całkowania. Tutaj obliczamy całkę taką:

No i klasa Integral:

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
public class Integral {

  double dokladnosc;
  double xp;
  double xk;
  double dx;

  public Integral(double n, double xp, double xk) {

      this.xk = xk;
      this.xp = xp;

      this.dokladnosc = n;

      dx = (xk - xp) / n;
  }

  private double f(double x) {

      return (x * x);

  }

  public double calc() {

      double wynik = 0;
      for (double i = 1; i < dokladnosc - 1; i++) {

          wynik = wynik + f(xp + i * dx);

      }
      wynik = (wynik + ((f(xp) - f(xk) / 2))) * dx;

      return wynik;
  }

}

Na koniec porównanie wyników:

Myślę że dokładność jest wystarczająco dobra przy dokładności podaje w konstruktorze równej 100000. Jeśli jest potrzeba – można zwiększyć.

Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

Ostatnie wpisy

Podsumowanie: styczeń i luty 2025

Nowy rok czas zacząć! Więc lećmy z podsumowaniem. Nowy artykuł Nie uwierzycie, ale pojawił się na blogu nowy artykuł! Piszę… Read More

2 tygodnie ago

Just-in-time compiler (JIT) w Pythonie

Cześć! W Pythonie 3.13 dodano JITa! JIT, czyli just-in-time compiler to optymalizacja na która Python naprawdę długo czekał. Na nasze… Read More

4 tygodnie ago

Podsumowanie roku 2024

Cześć! Zapraszam na podsumowanie roku 2024. Książki W sumie rok 2024 był pod względem ilości książek nieco podobny do roku… Read More

1 miesiąc ago

Podsumowanie: wrzesień, październik, listopad i grudzień 2024

Podtrzymując tradycję, prawie regularnych podsumowań, zapraszam na wpis! Nie mogło obyć się bez Karkonoszy We wrześniu odwiedziłem z kolegą Karkonosze,… Read More

1 miesiąc ago

Podsumowanie: maj, czerwiec, lipiec i sierpień 2024

Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More

6 miesięcy ago

Podsumowanie: kwiecień 2024

Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More

10 miesięcy ago