Autor
Marcin Wudarczyk, K2, MiNI
Zadanie
Napisać program znajdujący miejsce zerowe wielomianu w dziedzinie zespolonej metodą siecznych.
Metoda
Metoda siecznych, wskazania w zadaniu, jest metodą iteracyjną. Wymaga dwóch punktów początkowych.
Oznaczenia:
w wielomian stopnia n
x* dokładne miejsce zerowe: w(x*) = 0
x(k) k-te przybliżenie miejsca zerowego
x(0), x(1) przybliżenia początkowe
M2 maximum z wartości drugiej pochodnej w dziedzinie
m1 minimum z wartości pierwszej pochodnej w dziedzinie
e żądana dokładność
|| || norma dla liczb zespolonych:
Ogólnie dla metod iteracyjnych:
,
gdzie A i p zależą od metody. W przypadku metody siecznych A = M2/2/m1
a p @ 1,6.
Kolejne przybliżenia znajdujemy wzorem: .
Nie jest gwarantowane, że dla wszystkich danych metoda jest zbieżna, ani, że kolejne przybliżenia nie wyjdą poza dziedzinę.
Zatrzymanie iteracji następuje, gdy.
W praktyce stosuje się prostsze warunki.
Implementacja
Program napisano w języku C++. Użyto kompilatora Borland C++Builder 4.0. Program działa pod systemami operacyjnymi Windows 95 lub Windows NT lub późniejszymi.
Obliczenia są przeprowadzane na typie podwójnej precyzji. Użyto standardowej bilbioteki liczb zespolonych języka C++.
Sednem programu jest funkcja solve, która jest implementacją metody siecznych. Jako argumenty przyjmuje wielomian, przybliżenie i żądaną dokładność. Zwraca prawdę, gdy zostało znalezione miejsce zerowe po mniej niż 100.000 iteracjach.
Jako warunek stopu przyjęto .
Program
Po uruchomieniu programu wypisane zostaną aktualne ustawienia programu, tj. wielomian, punkty początkowe i dokładność obliczeń. Poniżej pojawi się lista dostępnych poleceń. Wybór polecenia następuje poprzez wciśnięcie klawisza odpowiadającego cyfrze wyświetlonej obok polecenia. Są to:
Wprowadzanie wielomianu: po wybraniu tej opcji program zapyta najpierw o stopień wielomianu. Następnie wyświetli kolejne wyrazy wielomianu w formie x^n*[an], wraz ze znakiem zachęty do wpisywania współczynników an. Współczynniki rzeczywiste wprowadzamy po prostu z klawiatury jako liczby, opcjonalne jest zamykanie w nawiasach współczynników ujemnych. Współczynniki zespolone wprowadzamy w postaci pary (re, im), gdzie re i im to odpowiednio rzeczywista i urojona część liczby zespolonej.
Ustawienie punktów początkowych: program poprosi o podanie liczb x0 i x1. Format liczb taki sam jak w poprzednim poleceniu.
Ustawienie dokładności: ustawia dokładność e . Tylko liczby rzeczywiste.
Wykonanie obliczeń: program spróbuje znaleźć przybliżone miejsce zerowe zadanego wielomianu. Gdy je znajdzie, wypisuje je na ekran wraz z wartością wielomianu dla przybliżonej wartości miejsca zerowego. W przypadku nie powodzenia program wypisze stosowny komunikat.
Wyjście z programu: kończy pracę z programem; podobnie działa klawisz ESC.
Zadania przykładowe
Zadanie 1
Wielomian: w(x) = x2 + 2
Punkty początkowe: x0 = 0, x1 = 1
Dokładność: e = 10-9
Wynik: program nie może znaleźć miejsca zerowego, ponieważ punkty początkowe nie zawierają części urojonej.
Zadanie 2
Wielomian: w(x) = (2,-1)*x3 + (16,8)*x2 + (24,4)*x1 + (4,0.5)
Punkty początkowe: x0 = 0, x1 = (1, 1)
Dokładność: e = 10-9
Wynik: (-0.190302,-0.00195116)
Zadanie 3
Wielomian: w(x) = (2,-1)*x3 + (16,8)*x2 + (24,4)*x1 + (4,0.5) - ten sam co poprzednio
Punkty początkowe: x0 = -20, x1 = (-20, -20)
Dokładność: e = 10-9
Wynik: (-3.56434,-6.99942)
Zadanie 4
Wielomian: w(x) = (1,-1)*x10 + (2,-2)*x9 + (3,-3)*x8
+ (4,-4)*x7 + (5,-5)*x6 + (-6,6)*x5 +
(-7,7)*x4 +
+ (-8,8)*x3 + (-9,9)*x2 + (-10,10)*x1 +
(3.14,-3.14)
Punkty początkowe: x0 = 0, x1 = (1,1)
Dokładność: e = 10-12
Wynik: (0.24518,-1.67681e-18) » (0.24518,0)