Informatyka dla klas II

Miejsca zerowe funkcji

Definicja miejsca zerowego

Miejscem zerowym funkcji f(x) będziemy nazywali argument xo, dla którego funkcja przyjmuje wartość 0:

 

xo jest miejscem zerowym wtedy i tylko wtedy, gdy f(xo) = 0

 

Uwaga:

Często uczniowie (nawet ci lepsi) mylą to proste pojęcie i twierdzą, iż miejsce zerowe to argument xo = 0. Prawdopodobnie zamęt wprowadza indeks przy literce x. Zastanów się, jeśli by tak było, to po co potrzebna jest nam ta cała procedura znajdowania czegoś, co jest przecież równe 0...?

 

Przykład:

Funkcja f(x) = 2x - 4 posiada miejsce zerowe dla xo = 2, ponieważ:

 f(xo)  = 2xo - 4
 f(2)  = 2 obrazek 2 - 4 = 4 - 4 = 0

Miejsce zerowe często nazywamy pierwiastkiem funkcji.

Funkcja może posiadać więcej niż jeden pierwiastek:

Przykład:

Funkcja f(x) = x2 - 1 posiada dwa pierwiastki: xo = -1 oraz xo = 1, gdyż:

 f(xo)  = (xo)2 - 1
 f(-1)  = (-1)2 - 1 = 1 - 1 = 0
  f(1)  = 12 - 1 = 1 - 1 = 0

Funkcja może posiadać nieskończenie wiele pierwiastków:

Przykład:

Funkcja f(x) = sin(x - 2) posiada pierwiastki dla każdego xo = + 2, gdzie k = 0, ±1, ±2 ...

 


Graficznie miejsce zerowe funkcji możemy interpretować jako punkt przecięcia osi współrzędnych OX przez wykres funkcji:

 

 

Znajdowanie miejsc zerowych ma olbrzymie znaczenie w matematyce, fizyce, astronomii, technice itp. Dlatego już dawno temu matematycy opracowali wiele metod rozwiązywania tego zagadnienia. Zasadniczo istnieją dwa podejścia:

 

Metoda połowienia - bisekcji

Mamy daną funkcję f(x) oraz przedział <a,b>, w którym będziemy poszukiwali miejsca zerowego (czyli pierwiastka funkcji f(x)). Aby można było zastosować algorytm połowienia (zwany również algorytmem bisekcji), w przedziale <a,b> muszą być spełnione poniższe warunki:

 

1. Funkcja f(x) jest określona - uczniowie często nie rozumieją tego pojęcia. Określoność funkcji oznacza, iż dla każdej wartości argumentu x z przedziału <a,b> potrafimy policzyć wartość funkcji. W trakcie pracy algorytm połowienia oblicza wartości funkcji dla argumentów należących do tego przedziału <a,b>. Jeśli przypadkowo trafi na punkt, dla którego wartość funkcji jest nieokreślona, obliczenia się załamią. W praktyce konsekwencje mogą być tragiczne, np. zmiana lotu samolotu z poziomego na pionowy w kierunku ziemi...

Dla przykładu rozważmy prostą funkcję:

 

obrazek

 

Ile wynosi wartość tej funkcji dla x = 1? Musimy dzielić przez 0, a jak wiadomo jest to zadanie niewykonalne. W punkcie x = 1 tak podana funkcja ma nieokreśloną wartość.

 

2. Funkcja f(x) jest ciągła. Ciągłość funkcji oznacza z kolei, iż jej wartości nie "wykonują" nagłych skoków. Funkcja przebiega przez wszystkie wartości pośrednie - nie istnieją zatem przerwy w kolejnych wartościach funkcji. Dla przykładu rozważmy taką oto funkcję:

 

obrazek

 

Funkcja w przedziale <-2,1> posiada następujący wykres:

 

obrazek

 

Nieciągłość występuje w punkcie x = 0, czyli w miejscu zmiany przepisu funkcji. Zwróć uwagę, iż funkcja jest określona w tym punkcie - nieciągłość i nieokreśloność to dwie różne sprawy - nie myl ich!!!

 

3. Funkcja f(x) na krańcach przedziału <a,b> przyjmuje różne znaki. Ponieważ funkcja, zgodnie z poprzednim podpunktem, jest ciągła, to przyjmuje w przedziale <a,b> wszystkie wartości pośrednie pomiędzy f(a) i f(b).  Wartości te mają różne znaki (czyli leżą po różnych stronach osi OX), zatem musi być taki punkt xo w przedziale <a,b>, dla którego funkcja przyjmuje wartość pośrednią:

 

f(a) < f(xo) = 0 < f(b lub   f(a) > f(xo) = 0 > f(b)

 

Gdy funkcja f(x) spełnia powyższe trzy warunki, to w przedziale <a,b> zagwarantowane jest istnienie pierwiastka i możemy go wyszukać algorytmem połowienia (bisekcji). Zasada jest następująca:

 

Wyznaczamy punkt xo jako środek przedziału <a,b> zgodnie ze wzorem:

 

obrazek

 

Obliczamy wartość funkcji w punkcie xo. Sprawdzamy, czy f(xo) znajduje się dostatecznie blisko 0:

 

obrazek

 

Jeśli nierówność jest spełniona, to xo jest poszukiwaną wartością pierwiastka. Zwracamy wynik i kończymy algorytm. W przeciwnym razie za nowy przedział poszukiwań pierwiastka przyjmujemy tą połówkę <a,xo> lub <xo,b>, w której funkcja zmienia znak na krańcach. Algorytm powtarzamy od początku dotąd, aż znajdziemy pierwiastek

 

Algorytm wyznaczania miejsca zerowego metodą bisekcji

Wejście:
f()  –  funkcja, której pierwiastka poszukujemy
xa  –  początek przedziału poszukiwań pierwiastka, xa obrazek R
xb  –  koniec przedziału poszukiwań pierwiastka, xb obrazek R
Wyjście:
xo – pierwiastek funkcji f() lub informacja, że w przedziale <xa,xb> brak pierwiastka.
Dane pomocnicze:
ε  –  dokładność porównania z zerem
yo  –  wartość funkcji w punkcie xo
ya  –  wartość funkcji w punkcie xa
yb  –  wartość funkcji w punkcie xb

 

K01: ya  ← f(xa) ; obliczamy wartość funkcji na krańcu xa przedziału poszukiwań pierwiastka
K02: yb  ← f(xb) ; obliczamy wartość funkcji na krańcu xb przedziału poszukiwań pierwiastka
K03: Jeśli ya obrazek yb  > 0, to
    pisz
"BRAK PIERWIASTKA" i
    zakończ
; sprawdzamy warunek istnienia pierwiastka
K04:
xo  xa  + xb
2
; wyznaczamy środek przedziału
K05: yof(xo) ; obliczamy wartość funkcji w punkcie xo
K06: Jeśli |yo| < ε, to
    pisz
xo i
    zakończ
; sprawdzamy, czy xo jest poszukiwanym pierwiastkiem
K07: Jeśli ya obrazek yb  < 0, to
    xb  ← xo
    yb  ← yo
inaczej
    xa  ← xo
    ya  ← yo
; za nowy przedział przyjmujemy tę połówkę, w której funkcja zmienia znak
K08: Idź do K04 ; kontynuujemy poszukiwanie pierwiastka

 

Na podstawie powyższego algorytmu napisz odpowiedni program w języku C++.

Przykładowa funkcja do testów f(x) = x3(x + sin(x2 - 1) - 1) - 1. Pierwiastków należy poszukiwać w przedziałach <-1,0> i <1,2>.

 

Metoda Fałszywej Prostej - Regula Falsi

Mamy daną funkcję f(x) oraz przedział <a,b> poszukiwań pierwiastka. W przedziale tym funkcja musi spełniać następujące warunki:

f(a) < f(xo) = 0 < f(b) lub f(a) > f(xo) = 0 > f(b)

obrazekGdy funkcja f(x) spełnia podane warunki, to w przedziale <a,b> zagwarantowane jest istnienie pierwiastka i możemy go wyszukać algorytmem regula falsi.

W języku łacińskim regula falsi oznacza fałszywą prostą. Ideą tej metody jest założenie, iż funkcja w coraz mniejszych przedziałach wokół pierwiastka zaczyna przypominać funkcję liniową. Skoro tak, to przybliżenie pierwiastka otrzymujemy prowadząc linię prostą (sieczną) z punktów krańcowych przedziału. Sieczna przecina oś OX w punkcie xo, który przyjmujemy za przybliżenie pierwiastka - gdyby funkcja faktycznie była liniowa, otrzymany punkt xo byłby rzeczywistym pierwiastkiem.

Wzór dla xo można wyprowadzić na kilka sposobów. My wybierzemy znane twierdzenie Talesa, które mówi, iż jeżeli ramiona kąta przetniemy dwiema prostymi równoległymi, to długości odcinków wyznaczonych przez te proste na jednym ramieniu kąta będą proporcjonalne do długości odpowiednich odcinków wyznaczonych przez te proste na ramieniu drugim. Poniższy rysunek obrazuje tę sytuację:

obrazek

obrazek

W naszym przypadku postępujemy następująco:

Kąt utworzą odpowiednie odcinki:

pionowo FA = (a,0)-(a,f(a)) powiększony o odcinek FB = (b,0)-(b,-f(b))

poziomo XAB = (a,0)-(b,0)

Prostymi równoległymi będzie cięciwa z punktów krańcowych przedziału, oraz ta sama cięciwa przesunięta pionowo w górę o długość odcinka FB.

Poniższy rysunek obrazuje otrzymaną sytuację:

obrazek

Zgodnie z twierdzeniem Talesa mamy:

 

obrazek

 

Jeśli podstawimy do tego wzoru długości odcinków:

 

FA = f(a)
FB = -f(b)
XAB = b - a
XX0 = xo - a

 

Otrzymamy:

 

obrazek

 

a dalej:


obrazek

Ostatnie przekształcenie ma na celu otrzymanie wzoru o lepszej "zapamiętywalności". Mnożymy mianownik przez (-1), dzięki czemu staje się on spójny z licznikiem ułamka. Sam ułamek zmienia znak na minus.

Algorytm regula falsi jest bardzo podobny do opisanego w poprzednim rozdziale algorytmu bisekcji. Założenia wstępne dla badanej funkcji w obu algorytmach są identyczne. Różnią się one sposobem wyznaczania punktu xo. W algorytmie bisekcji punkt ten zawsze wyznaczany był w środku przedziału <a,b>. Z tego powodu algorytm bisekcji jest "nieczuły" na przebieg funkcji - zawsze zbliża się do pierwiastka w ten sam sposób.

W algorytmie regula falsi jest inaczej. Punk xo wyznaczany jest w zależności od wartości funkcji na krańcach przedziału poszukiwań. W efekcie w każdej iteracji otrzymujemy lepsze przybliżenie do rzeczywistej wartości pierwiastka. Zatem w większości przypadków algorytm regula falsi szybciej osiągnie założoną dokładność pierwiastka od algorytmu bisekcji (chociaż można oczywiście podać kontrprzykłady).

Po wyznaczeniu przybliżonego pierwiastka postępowanie w obu algorytmach jest w zasadzie takie samo. Sprawdzamy, czy wartość modułu różnicy pomiędzy dwoma ostatnimi przybliżeniami pierwiastka jest mniejsza od zadanego minimum. Jeśli tak, obliczenia kończymy zwracając xo.

Obliczamy wartość funkcji w punkcie xo i sprawdzamy, czy jest ona dostatecznie bliska zeru. Jeśli tak, zwracamy xo i kończymy. Jeśli nie, za nowy przedział przyjmujemy tą część przedziału <a,b> rozdzielonego przez xo, w której funkcja zmienia znak. Całą procedurę powtarzamy, aż do osiągnięcia pożądanego wyniku.

 

Algorytm wyznaczania miejsca zerowego metodą regula falsi

Wejście:
f()  –  funkcja, której pierwiastka poszukujemy
xa  –  początek przedziału poszukiwań pierwiastka, xa obrazek R
xb  –  koniec przedziału poszukiwań pierwiastka, xb obrazek R
Wyjście:
xo – pierwiastek funkcji f() lub informacja, że w przedziale <xa,xb> brak pierwiastka.
Dane pomocnicze:
ε  –  dokładność porównania z zerem
yo  –  wartość funkcji w punkcie xo
ya  –  wartość funkcji w punkcie xa
yb  –  wartość funkcji w punkcie xb

 

K01: ya  ← f(xa) ; obliczamy wartość funkcji na krańcu xa przedziału poszukiwań pierwiastka
K02: yb  ← f(xb) ; obliczamy wartość funkcji na krańcu xb przedziału poszukiwań pierwiastka
K03: Jeśli ya obrazek yb  > 0, to
    pisz
"BRAK PIERWIASTKA" i
    zakończ
; sprawdzamy warunek istnienia pierwiastka
K04:
xo xa  - ya  xb - xa
yb  - ya
; wyznaczamy punkt przecięcia prostej z osią OX
K05: yof(xo) ; obliczamy wartość funkcji w punkcie xo
K06: Jeśli |yo| < ε, to
    pisz
xo i
    zakończ
; sprawdzamy, czy xo jest poszukiwanym pierwiastkiem
K07: Jeśli ya obrazek yb  < 0, to
    xb  ← xo
    yb  ← yo
inaczej
    xa  ← xo
    ya  ← yo
; za nowy przedział przyjmujemy tę połówkę, w której funkcja zmienia znak
K08: Idź do K04 ; kontynuujemy poszukiwanie pierwiastka

 

Na podstawie powyższego algorytmu napisz odpowiedni program w języku C++.

Przykładowa funkcja do testów f(x) = x3(x + sin(x2 - 1) - 1) - 1. Pierwiastków należy poszukiwać w przedziałach <-1,0> i <1,2>.

 

Zastosowania w fizyce

Na wysokości h  umieszczono działo z lufą skierowaną poziomo. Z działa oddajemy strzał. Pocisk opuszcza lufę działa z prędkością V  i uderza we wzgórze, którego zbocze zdefiniowane jest funkcją:

 

obrazek

 

obrazek

 

Dla danych h, V  wyznaczyć punkt xo  zderzenia pocisku ze wzgórzem. Pominąć wszelkie opory ruchu. Przyjąć stałe przyspieszenie grawitacyjne g  = 9,81 [m/s2].

Jest to przypadek rzutu poziomego. Ruch odbywa się w dwóch kierunkach. W kierunku poziomym na pocisk nie działa żadna siła, zatem ruch jest jednostajny ze stałą prędkością V. W kierunku pionowym działa siła przyciągania grawitacyjnego Ziemi, zatem ruch jest jednostajnie przyspieszony. W trakcie ruchu pocisk obniża swoją wysokość hP. Z drugiej strony wzgórze wraz ze wzrostem x powiększa swoją wysokość hW. W pewnej odległości xo  wysokość pocisku hP  zrówna się z wysokością wzgórza hW, nastąpi zderzenie. Naszym zadaniem jest wyznaczenie tego punktu.

Aby rozwiązać to zadanie, musimy wyznaczyć wysokość wzgórza hW  oraz wysokość pocisku hP  w zależności od x.

Ponieważ wzgórze opisane jest funkcją, otrzymujemy bezpośrednio:

 

obrazek

 

W kierunku pionowym pocisk wykonuje spadek swobodny, pokonując drogę:

 

obrazek

 

Zatem jego wysokość obliczymy jako:

 

obrazek

 

Czas ruchu t  nie jest dany, lecz obliczymy go łatwo ze wzorów na drogę w kierunku poziomym:

 

obrazek

 

Wzór na czas wstawiamy do wzoru na wysokość pocisku hP:

 

obrazek

 

Z warunku:

 

obrazek

 

Otrzymujemy funkcję:

 

obrazek

 

Funkcja f(x) przyjmuje wartość 0 dla xo, w którym wysokość pocisku i wzgórza jest taka sama. Wartość xo  znajdziemy metodą regula falsi. W metodzie tej musimy określić przedział poszukiwań pierwiastka. Dla naszego zadania będzie to przedział <a,b> zawierający punkt xo. Punkt a  otrzymujemy bez liczenia:

 

obrazek

 

Natomiast punkt b  niech będzie odległością rzutu poziomego - czyli odległością, w jakiej pocisk przeciąłby oś OX, gdyby nie było wzgórza. Ponieważ wzgórze jest, to punkt xo  pojawi się wcześniej. Punkt b  to droga w kierunku poziomym, jaką pokona pocisk w czasie spadku swobodnego z wysokości h:

 

obrazek

 

Na podstawie powyższych wzorów przekształć program z lekcji, tak aby rozwiązywał to zadanie.

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe