W wielu obliczeniach w matematyce bądź fizyce wykonanie niektórych kroków zależy od spełnienia warunku. Nie wolno dzielić przez zero i należy sprawdzić, czy dzielna nie jest równa zeru. W dziedzinie liczb rzeczywistych nie jest możliwe wyznaczenie pierwiastka z liczby ujemnej. Zabezpieczenia polegające na sprawdzaniu warunków mają szczególnie istotne znaczenie w obliczeniach komputerowych. Komputery nie widzą i nie odróżniają dobrych od złych danych. W algorytmach, których jedną z cech ma być niezawodność musimy umieć zabezpieczać się przed niedozwolonymi działaniami. Przykładem algorytmu obliczeń, które zależą od spełnienia pewnych warunków jest rozwiązanie równania kwadratowego. Skorzystamy z najczęściej stosowanych wzorów na pierwiastki tego równania (nazywana jest ona czasami algorytmem delty ). Wykorzystamy również wzory Viete a. Dla tego przypadku utworzymy algorytm, który jest poprawny dla obliczeń komputerowych. 1
Równanie kwadratowe zapisuje się najczęściej w postaci: ax 2 + bx + c = 0 Danymi są trzy liczby: a, b i c -współczynniki trójmianu. Zakładamy, że a jest różne od zera. W przeciwnym wypadku mamy do czynienia z równaniem pierwszego stopnia. Pierwiastki równania kwadratowego wyznacza się w algorytmie delty z następujących wzorów: x 1 = (-b- )/2a x 2 = (-b- )/2a gdzie =b 2-4ac Potrafimy obliczyć z tych wzorów pierwiastki równania wtedy, gdy można wykonać wszystkie działania występujące w tych wzorach. Dwa z nich są obwarowane warunkami: dzielić można tylko przez liczbę różną od zera, rzeczywisty pierwiastek kwadratowy istnieje jedynie wtedy, gdy liczba podpierwiastkowa jest nieujemna. Jeśli <0 to równanie nie ma pierwiastków. Jeśli =0 to oba pierwiastki są sobie równe. 2
Algorytm rozwiązywania równania kwadratowego Dane: Współczynniki a, b, c Wyniki: Pierwiastki równania, jeśli dane współczynniki rzeczywiście określają równanie kwadratowe i równanie to ma pierwiastki. Krok 1. Jeśli a=0 wypisz komunikat, że nie jest to równanie kwadratowe i zakończ pracę. Krok 2. Oblicz wartość wyróżnika =b 2-4ac Krok 3. Jeśli <0 to wypisz komunikat, że równanie kwadratowe nie ma pierwiastków i zakończ działalność. Krok 4. Jeśli =0 to oblicz oba pierwiastki z tego samego wzoru x 1 =x 2 =-b/2a, wypisz ich wartość i zakończ algorytm. Krok 5. {w tym przypadku >0 }. Oblicz pierwiastki x 1 i x 2, wypisz ich wartości i zakończ działanie programu. 3
Rozwiążmy równanie kwadratowe o następujących współczynnikach podanych z czterema cyframi znaczącymi: a=1 b=-6.4333 c=0.009474 Ponieważ współczynniki dane są z czterema cyframi znaczącymi będziemy prowadzić obliczenia w ten sposób, że każdy wynik pośredni będzie zaokrąglany do czterech cyfr. Zaokrąglenie do czterech cyfr oznacza obcięcie cyfr począwszy od piątej i dodanie do czwartej 1 gdy pierwsza odrzucona cyfra jest większa lub równa 5. Wyniki obliczeń są następujące: =41.31 x 1 =0.0015 x 2 =6.43 Dokładna wartość pierwszego pierwiastka wynosi 0.001473. Otrzymany wynik ma tylko jedną taką samą cyfrę. Popełniliśmy błąd 1.83%. 4
Obliczenia komputerowe nie zawsze gwarantują otrzymanie dokładnych wyników. Znalezienie dokładnego rozwiązania może stanowić dla programu poważny problem. Niektóre obliczenia komputerowe wykonywane według matematycznych wzorów wymagają analizy, zanim je oprogramujemy. Skąd wzięła się niedokładność w naszych obliczeniach? Wartość iloczynu 4ac = 0.03790 jest mała w stosunku do wielkości b 2 = 41.38 Oznacza to, że wartość wyróżnika = 41.34 jest w przybliżeniu równa b 2, a więc wartość pierwiastka kwadratowego z delty 6.430 jest bliska bezwzględnej wartości b równej 6,433. Jeśli współczynnik b jest ujemny to przy obliczaniu wartości pierwiastka x 1 odejmowane są od siebie dwie bliskie sobie liczby. (Jeśli współczynnik b jest ujemny to przy obliczaniu wartości pierwiastka x 1 odejmowane są od siebie dwie bliskie sobie liczby.) Algorytm, który wykazuje opisaną wyżej własność dla niektórych danych nazywa się algorytmem niestabilnym. 5
Opisana powyżej niedogodność pomagają usunąć wzory Viete a: x 1 + x 2 = -b/a x 1 x 2 = c/a Zmodyfikowane postępowanie będzie polegało na: obliczeniu wartości jednego z pierwiastków za pomocą algorytmu delty, wyznaczeniu drugiego z pierwiastków ze wzorów Viete a na iloczyn pierwiastków. W algorytmie delty wybieramy obliczanie tego z pierwiastków, w którym występuje w liczniku dodawanie dwóch liczb o tych samych znakach. Wybór ten zależy od współczynnika b: jeśli b<0 to wybieramy x 2, w przeciwnym przypadku wybieramy x 1. 6
procedure RownanieKwadratowe (a, b: Real; var Del: Boolean; var x1, x2: Real); var Delta, p, q : Real; begin p:=b/a; q:=c/a; Delta:=p*p-4*q; Del:=(Delta>=0); if Del then begin Delta:=Sqrt(Delta); if p<0 then begin x2:=(-p-delta)/2; x1:=q/x2 end {p<0} else begin x1:=(-p-delta)/2; x2:=q/x1 end {p>=0} end {Del} end; {RownanieKwadratowe} 7
Rozwiązywanie równania liniowego Jednym z najprostszych zadań geometrycznych jest wyznaczanie punktów, w których prosta przecina osie układu współrzędnych. Ogólne równanie takiej prostej zwane równaniem liniowym ma postać: ax + by = c Jeśli wszystkie współczynniki są różne od zera, to punktami przecięcia są: przecięcie z Ox: y=0 - ax=c skąd mamy (c/a, 0), przecięcie z Oy: x=0 - (0, c/b). Jeżeli dokładnie jeden ze współczynników jest równy zeru: Jeżeli a=0 to y=c/b dla wszystkich wartości y (prosta przechodzi przez punkt (0,c/b) i jest równoległa do Ox. Jeżeli b=0 to prosta jest równoległa do osi rzędnych i przechodzi przez punkt (c/a,0) na osi Ox. Jeżeli c=0 to równanie przyjmuje postać ax=-by i prosta przecina osie współrzędnych w początku układu, czyli w punkcie (0,0). Pozostałe przypadki pomijamy 8
Rozwiązywanie układu dwóch równań liniowych Rozważmy rozwiązanie układu dwóch równań liniowych: ax + by =c dx + ey = f Rozwiązanie jest poszukiwaniem takiego punktu (x,y), dla którego każde z równań jest spełnione. Jest to punkt przecięcia prostych. Układ nie będzie miał rozwiązań, gdy proste będą do siebie równoległe. Rozwiązanie układu uzyskane metodą podstawienia ma postać: x=(ce-bf)/w y=(af-cd)/w gdzie w=ae-db (jest to wyznacznik układu równań). Wzory na rozwiązanie układu dwóch równań są szczególnymi przypadkami: metody znajdywania rozwiązań układów liniowych o dowolnej liczbie niewiadomych zwanej metodą eliminacji Gaussa, wzorów Cramera wyrażających rozwiązanie układu równań liniowych poprzez wartości odpowiednich wyznaczników układu. 9
Przykład liczbowy: a=3.000, b=4.127, c=15.41, d=1.000, e=1.374, f=5.147. Rozwiązaniem tego układu są: x=13.66, y=-6.2 Wartość wyznacznika układu wynosi w=-0.005. Jest to wielkość bardzo mała w porównaniu do wartości współczynników układu. Przy rozwiązywaniu układu równań dochodzi do utraty dokładności obliczeń na skutek dzielenia dużej liczby przez liczbę stosunkowo małą. Dla rozwiązywania układów równań liniowych nie można podać algorytmu odpornego na błędy zaokrągleń. Jest to bowiem problem źle uwarunkowany, niestabilny. 10
W algorytmach należy zabezpieczać się przed wykonywaniem zabronionych działań przez sprawdzanie odpowiednich warunków. Źródłem niedokładności w obliczeniach komputerowych jest najczęściej wykonywanie obliczeń na liczbach. Których różnica wartości bezwzględnych jest bardzo duża bądź bardzo mała. Przykładami obliczeń, w których to zjawisko występuje są takie elementarne zadania, jak rozwiązanie równania kwadratowego lub układu dwóch równań liniowych. W przypadku algorytmu rozpadającego się na wiele ścieżek musimy zachować dużą precyzję, by nie pominąć żadnego przypadku. 11
12