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)