Algorytmy Numeryczne - Podsumowanie i Analiza
Poniższy dokument zawiera zestawienie podstawowych algorytmów numerycznych wraz z kodem źródłowym oraz wyjaśnieniem ich działania. Na końcu znajduje się sekcja z zadaniami analitycznymi.
1. Algorytm Newtona-Raphsona (Obliczanie pierwiastka kwadratowego)
Wyznacza wartość pierwiastka kwadratowego z liczby nieujemnej.
Dane:
P : R, P >= 0 - liczba podpierwiastkowa
E : R, E >= 0 - dokładność obliczeń
L : C, L > 0 - ilość iteracjiWyniki:
a : R - przybliżona wartość pierwiastka kwadratowegoKod algorytmu:
#include <cmath>
double pierwiastek(double p, int L, double E) {
if (p < 0) return -1;
if (p == 0) return 0;
double a = p;
int i = 0;
while (i < L && std::abs(a - p / a) >= E) {
a = (a + p / a) / 2.0;
i++;
}
return a;
}Zasada działania krok po kroku:
- Zaczynamy od pierwszego przybliżenia
a, równego podanej liczbiep. - Sprawdzamy, czy różnica między przybliżeniami jest większa niż wymagana precyzja
Eoraz czy nie przekroczyliśmy limitu krokówL. - Jeśli warunki są spełnione, obliczamy nowe, dokładniejsze przybliżenie ze wzoru średniej arytmetycznej: $$a = \frac{a + \frac{p}{a}}{2}$$
- Powtarzamy proces, aż wynik będzie wystarczająco dokładny.
2. Metoda połowienia (Bisekcji)
Znajduje przybliżoną wartość miejsca zerowego funkcji ciągłej w podanym przedziale.
Dane:
f(t) - funkcja
p, q - początek i koniec przedziału, p < q
E : R - dokładność obliczeń, 0,00001
L : C - ilość iteracjiKryteria zakończenia:
q - p <= E
Maksymalna ilość iteracjiKod algorytmu:
#include <cmath>
double f(double x) {
return x * x - 4.0; // Przykładowa funkcja
}
double bisekcja(double p, double q, double E, int L) {
double sr = p;
int i = 0;
while ((q - p) >= E && i < L) {
sr = (p + q) / 2.0;
if (f(sr) == 0.0) break;
if (f(p) * f(sr) < 0) {
q = sr;
} else {
p = sr;
}
i++;
}
return sr;
}Zasada działania krok po kroku:
- Bierzemy przedział od
pdoq. Funkcja na jego krańcach musi przyjmować wartości o przeciwnych znakach. - Znajdujemy dokładny środek przedziału: $sr = \frac{p + q}{2}$.
- Sprawdzamy, po której stronie od środka
srwartości funkcji zmieniają znak. Tam, gdzie znak się zmienia, na pewno znajduje się miejsce zerowe. - Zawężamy przedział o połowę, zastępując jeden z jego brzegów punktem
sr, i powtarzamy proces, aż przedział będzie mniejszy niż ustalony błądE.
3. Całkowanie numeryczne - Metoda prostokątów (punktu środkowego)
- Metoda prostokątów
Dane: f(x) - funkcja
n : C - ilość prostokątów
p, q - początek i koniec przedziałuPrzybliża pole pod wykresem funkcji poprzez podział obszaru na prostokąty.
Kod algorytmu:
double obliczPoleProstokaty(double p, double q, int n) {
double dl = (q - p) / n;
double s = 0.0;
for (int i = 0; i < n; i++) {
s += f(p + i * dl + dl / 2.0);
}
return s * dl;
}Zasada działania krok po kroku:
- Dzielimy cały przedział (od
pdoq) nanrównych fragmentów. Szerokość każdego z nich todl. - Przechodzimy przez każdy fragment, znajdując jego środek.
- Obliczamy wartość funkcji w tym środkowym punkcie - to staje się wysokością naszego prostokąta. Sumujemy wszystkie te wysokości.
- Mnożymy sumę wysokości przez szerokość podstawy
dl, otrzymując łączne pole.
4. Całkowanie numeryczne - Metoda trapezów
Przybliża pole pod wykresem funkcji za pomocą sumy pól trapezów.
- Metoda prostokątów
Dane: f(x) - funkcja
n : C - ilość trapezów
p, q - początek i koniec przedziałuKod algorytmu:
double obliczPoleTrapezy(double p, double q, int n) {
double dl = (q - p) / n;
double s = 0.0;
for (int i = 1; i < n; i++) {
s += f(p + i * dl);
}
return (dl / 2.0) * (f(p) + f(q) + 2.0 * s);
}Zasada działania krok po kroku:
- Dzielimy przedział na
nrównych części o szerokościdl(pełniącej rolę wysokości trapezu). - Sumujemy wartości funkcji w punktach styku wewnętrznych krawędzi trapezów (od
i = 1don - 1). Te wartości liczą się podwójnie, bo każdy punkt należy do dwóch trapezów. - Wartości na skrajnych punktach przedziału
f(p)if(q)bierzemy tylko raz. - Stosujemy uproszczony wzór sumaryczny, dodając wszystkie elementy.
5. Zadania do analizy (Praca samodzielna)
Zadanie 1: Śledzenie iteracji w algorytmie Newtona-Raphsona Chcemy obliczyć pierwiastek kwadratowy z liczby $p = 16$. Przyjmujemy pierwsze przybliżenie $a = 16$.
- Polecenie: Wykonaj ręcznie obliczenia dla pierwszych dwóch obiegów pętli (dwie iteracje). Jaką wartość przyjmie zmienna $a$ po pierwszej, a jaką po drugiej iteracji? Obliczenia można zapisać w ułamkach lub liczbach dziesiętnych.
Zadanie 2: Ręczna bisekcja przedziału Dana jest funkcja $f(x) = x^2 - 9$. Szukamy jej miejsca zerowego w przedziale od $p = 0$ do $q = 5$.
- Polecenie: Przeprowadź ręcznie dwie pierwsze iteracje pętli
while. Określ po kolei:- Ile wynosi środek
srw pierwszej iteracji? - Czy w kolejnym kroku przesuniemy lewy brzeg (
p = sr), czy prawy brzeg (q = sr)? - Jakie będą granice przedziału ($p$ i $q$) na początku trzeciej iteracji?
- Ile wynosi środek
Zadanie 3: Porównanie metod całkowania Mamy bardzo prostą funkcję liniową $f(x) = 2x$. Chcemy obliczyć pole pod wykresem na przedziale od $p = 0$ do $q = 2$.
- Polecenie:
- Oblicz pole metodą prostokątów (środków przedziałów), dzieląc główny przedział tylko na dwa fragmenty ($n = 2$).
- Oblicz pole metodą trapezów dla takich samych danych ($n = 2$).
- Dokładne pole tego trójkąta z geometrii wynosi 4. Jak wypadły wyniki obu algorytmów? Zastanów się, czy dla funkcji liniowej (której wykresem jest prosta linia) metoda trapezów wykazuje błąd numeryczny.