Całkowanie numeryczne¶
Hasło "całkowanie numeryczne" może brzmieć strasznie, ale samo pojęcie jest dość proste do zrozumienia. To nic innego, niż policzenie pola pod wykresem funkcji w zadanym przedziale. Oczywiście w ogólności to zadanie jest dość skomplikowane obliczeniowo, dlatego tutaj skupimy się na przybliżeniu tej wartości.
Wyróżniamy dwie podstawowe metody: metodę prostokątów i metodę trapezów.
Specyfikacja¶
Dane¶
- \(f(x)\) — funkcja, której wykres nas interesuje
- \(a\) — liczba rzeczywista, początek przedziału
- \(b\) — liczba rzeczywista, koniec przedziału
- \(n\) — liczba podziałów (im większa, tym większa dokładność)
Wynik¶
- \(pole\) — przybliżona wartość pola pod wykresem funkcji \(f(x)\) w przedziale \([a,b]\)
Rozwiązanie — metoda prostokątów¶
Idea tej metody jest prosta: podzielmy pole pod wykresem funkcji na prostokąty i policzmy ich pole.
Wizualizacja¶
Zobaczmy, jak ta metoda działa na przykładzie. Spróbujmy oszacować pole pod wykresem funkcji sinus na przedziale od \(0\) do \(\pi\).
20 prostokątów¶
50 prostokątów¶
100 prostokątów¶
Pseudokod¶
funkcja MetodaProstokatow(f, a, b, n):
1. pole := 0
2. szer := (b - a) / n
3. x := a + szer
4. Dopóki x <= b, wykonuj:
5. wys := f(x)
6. pole := pole + szer * wys
7. x := x + szer
8. Zwróć pole
Schemat blokowy¶
%%{init: {"flowchart": {"curve": "linear"}, "theme": "neutral"} }%%
flowchart TD
START(["MetodaProstokatow(f, a, b, n)"]) --> K1["pole := 0
szer := (b - a) / n
x := a + szer"]
K1 --> K4{x <= b}
K4 -- PRAWDA --> K5["wys := f(x)
pole := pole + szer * wys
x := x + szer"]
K5 --> K4
K4 -- FAŁSZ --> K8[/Zwróć pole/]
K8 --> STOP([STOP])
Rozwiązanie — metoda trapezów¶
W celu uzyskania lepszej dokładności, możemy podzielić pole pod wykresem funkcji na trapezy.
Pseudokod¶
funkcja MetodaTrapezow(f, a, b, n):
1. pole := 0
2. szer := (b - a) / n
3. x := a + szer
4. Dopóki x <= b, wykonuj:
5. pole := pole + ((f(x - szer) + f(x)) * szer) / 2
6. x := x + szer
7. Zwróć pole
Schemat blokowy¶
%%{init: {"flowchart": {"curve": "linear"}, "theme": "neutral"} }%%
flowchart TD
START(["MetodaTrapezow(f, a, b, n)"]) --> K1["pole := 0
szer := (b - a) / n
x := a + szer"]
K1 --> K4{x <= b}
K4 -- PRAWDA --> K5["pole := pole + ((f(x - szer) + f(x)) * szer) / 2
x := x + szer"]
K5 --> K4
K4 -- FAŁSZ --> K8[/Zwróć pole/]
K8 --> STOP([STOP])