I_R_W14_M28_C++ Miejsca zerowe funkcji
Metoda bisekcji – implementacja algorytmu w języku C++
Napisz program obliczający przybliżenie miejsca zerowego funkcji ciągłej f(x) w danym przedziale <a,b>.
Program przetestuj dla funkcji , przedziału <2,4>, o współczynniku równym 0.01 i współczynniku delta równym 0.01.
Specyfikacja problemu:
Dane:
f(x)– funkcja rzeczywista ciągła, której miejsce zerowe mamy obliczyća– liczba rzeczywista; początek przedziałub– liczba rzeczywista; koniec przedziałuepsilon– liczba rzeczywista; dokładność rozwiązaniadelta– liczba rzeczywista; minimalna długość odcinka, po osiągnięciu której przestajemy go dalej dzielić; przybliżenie.
Wynik:
Program, na standardowe wyjście, wypisuje liczbę rzeczywistą będącą przybliżoną wartością miejsca zerowego funkcji f(x), znajdującym się w zadanym przedziale <a,b>.
Zacznijmy od dołączenia do programu niezbędnych bibliotek i deklaracji przestrzeni nazw. Dołączenie do programu biblioteki cmathcmath pozwoli na użycie funkcji obliczającej wartość bezwzględną liczby zmiennoprzecinkowej fabs(). Następnie zdefiniujmy funkcję o nazwie f(), zwracającą wartość rozważanej funkcji dla danego punktu x.
Kolejnym krokiem jest utworzenie definicji funkcji bisekcja, przyjmującej dwa parametry, będące liczbami zmiennoprzecinkowymi. Stanowią one krańce rozważanego przedziału. W funkcji stworzymy dwie zmienne lokalne, które będą zawierały wartości funkcji w tych punktach.
Konieczna będzie weryfikacja, czy analizowana funkcja spełnia warunki bisekcji. Trzeba w tym celu sprawdzić, czy funkcja przyjmuje w krańcach podanego przedziału wartości o różnych znakach. Można to zrobić np. poprzez sprawdzenie znaku wyniku mnożenia wartości funkcji w tych punktach. Niespełnienie tego założenia uniemożliwi znalezienie miejsca zerowego. W takim przypadku program zakończy działanie z kodem -1.
W przypadku spełnienia założenia bisekcji, obliczamy długość przedziału i zapisujemy go do zmiennej.
Kolejnym krokiem jest stworzenie pętli nieskończonej, w której będzie następować nieskończone połowienie przedziału. Znajdźmy punkt środkowy przedziału <a,b>. Jego wartość zapiszemy w zmiennej x0, a wartość funkcji w tym punkcie w zmiennej fx0.
Następnie, aby pętla nie wykonywała się w nieskończoność, musimy zaimplementować wybrany warunek końcowy. Dodajmy do definicji funkcji dwa parametry. Niech wartość parametru epsilon będzie pożądaną dokładnością wartości funkcji w punkcie. Będziemy szukać nie punktu o wartości funkcji 0, ale punktu, dla którego funkcja przyjmuje wartość z zakresu <-epsilon,epsilon>.
Ponadto nie chcemy dzielić odcinka w nieskończoność. Ustalimy pewne przybliżenie – parametr delta. Gdy wartość bezwzględna parametru przedziału dlugoscPrzedzialu będzie mniejsza niż wartość parametru delta, uznajemy odcinek za punkt – dalszy podział jest niemożliwy. Jeżeli co najmniej jeden z warunków zostanie spełniony, zwracamy punkt środkowy obecnie rozważanego przedziału i uznajemy go za miejsce zerowe funkcji.
Jeżeli wartość nie zostanie zwrócona, żaden z zaimplementowanych warunków końcowych nie jest spełniony.
Oznacza to, że musimy ustawić wartość środkową jako początek lub koniec nowego przedziału. Należy to zrobić tak, by po zmianie jednego z końców przedziału funkcja f dalej miała na jego końcach wartości różnych znaków.
Następnie przechodzimy na początek pętli i instrukcje są ponawiane – przedział jest ponownie dzielony, aż do spełnienia warunku końcowego.
W algorytmie bisekcji należy pamiętać, aby uwzględniać przypadki, w których miejsce zerowe znajduje się dokładnie w połowie przedziału <a,b>. Nieuwzględnienie tego przypadku może powodować, że lewa lub prawa granica przedziału zostanie ustawiona na 0, przez co w kolejnej iteracji nie będzie spełnione założenie bisekcji, dotyczące różnych znaków na krańcach przedziału.
W przypadku programu tworzonego w ramach tego e‑materiału jest to zapewnione przez wykorzystanie warunku końcowego, który zostanie spełniony między innymi w sytuacji, gdy wartość funkcji w punkcie środkowym wynosi dokładnie 0.
Teraz możemy wywołać funkcję bisekcja(), zgodnie z treścią zadania, tzn. dla przedziału <2,4> (a = 2, b = 4), z dokładnością epsilon = 0.01 i przybliżeniem delta = 0.01.
Słownik
algorytmy służące do znajdowania przybliżonych rozwiązań problemów
pojęcie z dziedziny geometrii, oznaczające podział odcinka na dwie równe części lub podział figury na dwie przystające części
biblioteka zawierająca deklaracje funkcji matematycznych, takich jak potęgowanie, pierwiastek czy wartość bezwzględna
każda funkcja ciągła, określona na pewnym przedziale rzeczywistym, przyjmuje wszystkie wartości pośrednie pomiędzy wartościami przyjmowanymi dla krańców przedziału.
inaczej miejsce zerowe; punkt w którym wartość funkcji wynosi 0