MN02: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Przykry (dyskusja | edycje)
Linia 10: Linia 10:


[[Image:Fraktal.png|400px|To jest tytuł]]
[[Image:Fraktal.png|400px|To jest tytuł]]
W wielu zadaniach, m.in. matematyki stosowanej, spotykamy się z problemem
rozwiązania skalarnego równania nieliniowego postaci <math>\displaystyle f(x) = 0</math>:
* rozwiązywanie równania Keplera
<center><math>\displaystyle f(x) \equiv x - \epsilon \sin(x) = 0</math></center>
To równanie jest bardzo ważne w astronomii.
* znajdowanie miejsc zerowych wielomianu:
<center><math>\displaystyle f(x) \equiv a_nx^n + \ldots +
a_1x + a_0 = 0</math></center>
Bardzo wiele modeli matematycznych wymaga rozwiązania równania z wielomianową
nieliniowością. Piękne kwadratury (Gaussa) opierają się na węzłach będących
zerami pewnego wielomianu. Wielomiany są bardzo szczególnymi funkcjami i dla
nich istnieje szereg specjalizowanych metod znajdowania ich pierwiastków, m.in.
metoda Laguerre'a, metoda Bairstow'a (o nich tu nie będziemy mówić), a także
zaskakujące metody sprowadzające zadanie poszukiwania miejsc zerowych wielomianu
do zupełnie innego zadania matematycznego  --- o nich jednak
będzie mowa dopiero w wykładzie dotyczącym [[sec:eigenvalue|Uzupełnij: znajdowania wartości własnych
macierzy]].
* znajdowanie miejsc zerowych trójmianu kwadratowego:
<center><math>\displaystyle f(x) \equiv a_2x^2 +
a_1x + a_0 = 0.
</math></center>
Jest to szczególny, ale oczywiście bardzo ważny (takie równania m.in. trzeba
było kiedyś rozwiązywać w artylerii) przypadek poprzedniego zadania. Chociaż
wydawać by  się mogło, że to umiemy już robić (wszyscy znamy wzory "z deltą")
ale --- jak wkrótce się przekonamy --- i tutaj mogą spotkać nas niespodzianki!
* obliczanie pierwiastka kwadratowego z zadanej liczby <math>\displaystyle a</math>: 
<center><math>\displaystyle f(x) \equiv
x^2 - a = 0</math></center>
Jeden ze sposobów na implementację funkcji "<code>sqrt()</code>". Szybkie algorytmy
wyznaczania pierwiastka kwadratowego były znane już starożytnym. W wykładzie
zrozumiemy, dlaczego metoda Herona,
<center><math>\displaystyle
x_{k+1} = \frac{1}{2}\left(x_k + \frac{a}{x_k}\right)
</math></center>
daje bardzo dobre przybliżenie <math>\displaystyle \sqrt{a}</math> już po kilku iteracjach.
* implementacja wyznaczania odwrotności liczby <math>\displaystyle a</math> (''bez'' dzielenia!):
<center><math>\displaystyle f(x) \equiv
\frac{1}{x} - a = 0</math></center>
Wciąż spotykane zadanie, np. tak można w praktyce poprawić precyzję funkcji
wektorowych stosowanych w niektórych procesorach AMD, zob.
\cite{AMD-optimization-guide}. Instrukcja procesora służąca do obliczania
odwrotności sekwencji liczb umieszczonych w 128-bitowym rejestrze wektorowym
daje wynik z małą precyzją (oczywiście po to, by wykonywała się szybciej!).
Jeśli taka dokładność wyniku nie odpowiada nam, możemy ją --- zgodnie z manualem
procesora --- poprawić, rozwiązując właśnie takie równanie jak powyżej metodą
korzystającą wyłącznie z (wektorowych) operacji mnożenia i dodawania.
===Metoda bisekcji===
Najprostsza metoda rozwiązywania równania <math>\displaystyle f(x) = 0</math>.
''Metoda bisekcji'', czyli ''połowienia'', często stosowana w innych
działach informatyki, jest dość
naturalną metodą obliczania zer skalarnych funkcji
ciągłych określonych na danym przedziale <math>\displaystyle [a,b]</math>
i zmieniających znak. Dokładniej, rozpatrzmy klasę
funkcji
<center><math>\displaystyle
  F\,=\,\{\,f\in C([a,b])\,:\;f(a)\cdot f(b) < 0\,\}.
</math></center>
Oczywiście, każda funkcja <math>\displaystyle f\in F</math> ma co najmniej jedno
zero w <math>\displaystyle [a,b]</math>. Startując z przedziału <math>\displaystyle [a,b]</math>, w
kolejnych krokach metody bisekcji obliczamy informację
o wartości <math>\displaystyle f</math> w środku przedziału, co pozwala nam,
w zależności od znaku obliczonej wartości, zmniejszyć
o połowę przedział, w którym na pewno znajduje się
zero funkcji.
<div class="thumb tright"><div><flash>file=bisekcja.swf</flash><div.thumbcaption>Pierwsze trzy kroki metody bisekcji</div></div></div>
Bisekcję realizuje następujący ciąg
poleceń, po wykonaniu którego <math>\displaystyle x</math> jest przybliżeniem
zera funkcji <math>\displaystyle f</math> z zadaną dokładnością <math>\displaystyle \epsilon</math>.
{{algorytm|{Metoda bisekcji}||
<pre>
xl <nowiki>=</nowiki> a; xr <nowiki>=</nowiki> b;
x <nowiki>=</nowiki> (a+b)/2;  e <nowiki>=</nowiki> (b-a)/2;
while (e > <math>\displaystyle \epsilon</math>)
{
if (f(x)*f(xl) < 0)
xr <nowiki>=</nowiki> x;
else
xl <nowiki>=</nowiki> x;
x <nowiki>=</nowiki> (xl+xr)/2; e <nowiki>=</nowiki> e/2;
}
</pre>}}
Z konstrukcji metody łatwo wynika, że po wykonaniu
<math>\displaystyle k</math> iteracji (czyli po obliczeniu <math>\displaystyle k</math> wartości funkcji)
otrzymujemy <math>\displaystyle x</math>, które odległe jest od pewnego
rozwiązania <math>\displaystyle x^*</math> o co najwyżej
<center><math>\displaystyle
  |x-x^*|\,\le\,\Big(\frac 12\Big)^k
                  \Big(\frac{b-a}{2}\Big).
</math></center>
Metoda bisekcji jest więc zbieżna ''liniowo'' z
ilorazem <math>\displaystyle 1/2</math>. Choć ta zbieżność nie jest
imponująca, bisekcja ma kilka istotnych zalet. Oprócz
jej prostoty, należy podkreślić fakt, że bisekcja jest
w pewnym sensie uniwersalna. Jeśli tylko dysponujemy dwoma punktami <math>\displaystyle a</math> i <math>\displaystyle b</math>
takimi, że <math>\displaystyle f</math> przyjmuje w nich wartości przeciwnych znaków, to metoda bisekcji
z pewnością znajdzie miejsce zerowe funkcji, choćby początkowa długość
przedziału <math>\displaystyle |b-a|</math> była bardzo duża: zbieżność metody bisekcji jest ''globalna''. Co ważniejsze, dla zbieżności metody bisekcji
wystarcza jedynie ''ciągłość'' funkcji. Poza tym
możemy łatwo kontrolować ''błąd bezwzględny aproksymacji miejsca zerowego''. Konsekwencją
([[##blbis|Uzupelnic: blbis ]]) jest bowiem następujący wniosek.
{{wniosek|||
Dla znalezienia zera <math>\displaystyle x^*</math> z dokładnością
<math>\displaystyle \epsilon>0</math>, wystarczy obliczyć w metodzie bisekcji
<center><math>\displaystyle k\,=\,k(\epsilon)\,=\,
    \Big\lceil{\log_2\frac{(b-a)}{\epsilon}}\Big\rceil - 1
</math></center>
wartości funkcji.
}}
[[Image:MN|400px|Zbieżność metody bisekcji dla ....]]
Dodajmy jeszcze, że bisekcja minimalizuje błąd
najgorszy w klasie <math>\displaystyle F</math> zdefiniowanej [[dfkl|Uzupełnij: na początku tej sekcji]],
wśród wszystkich algorytmów korzystających
z określonej liczby obliczeń wartości funkcji,
zob. [[dwopt|Uzupełnij: uwaga na końcu wykładu]].
{{uwaga|||
Metoda bisekcji jest
optymalna w następującym sensie. Niech <math>\displaystyle A:F\to R</math>
będzie dowolną metodą (algorytmem) aproksymującą 
zero <math>\displaystyle x^*(f)</math> funkcji <math>\displaystyle f</math> z klasy <math>\displaystyle F</math> zdefiniowanej
w ([[##dfkl|Uzupelnic: dfkl ]]), korzystającą jedynie z obliczeń
(informacji o) <math>\displaystyle f</math> w <math>\displaystyle k</math> punktach. Wtedy dla dowolnego
<math>\displaystyle \gamma>0</math> istnieje funkcja <math>\displaystyle f_\gamma\in F</math> mająca
tylko jedno zero <math>\displaystyle x^*(f_\gamma)</math> w <math>\displaystyle [a,b]</math> i taka, że
<center><math>\displaystyle |A(f_\gamma)-x^*(f_\gamma)|\,\ge\,
  \Big(\frac 12\Big)^k\Big(\frac{b-a}{2}\Big)+\gamma.
</math></center>
Co więcej, można pokazać, że fakt ten zachodzi
też w węższej klasie <math>\displaystyle F_1</math> funkcji <math>\displaystyle f\in F</math>, które
są dowolnie wiele razy różniczkowalne. Oczywiście,
nie wyklucza to istnienia metod iteracyjnych (takich
jak metoda Newtona), które dla <math>\displaystyle f\in F_1</math> są zbieżne
szybciej niż liniowo.
}}
===Metoda iteracji prostej Banacha===
Zupełnie inne, i jak się okaże --- przy odrobinie sprytu bardzo skuteczne ---
podejście do wyznaczania miejsca zerowego jest oparte na metodzie Banacha.
Najpierw nasze równanie nieliniowe
<center><math>\displaystyle
f(x) = 0
</math></center>
przekształcamy (dobierając odpowiednią funkcję <math>\displaystyle \phi</math>) do równania równoważnego
(tzn. mającego te same rozwiązania)
<center><math>\displaystyle
  x\,=\,\phi( x).
</math></center>
Następnie, startując z pewnego przybliżenia
początkowego <math>\displaystyle  x_0</math>, konstruujemy ciąg kolejnych
przybliżeń <math>\displaystyle  x_k</math> według wzoru
<center><math>\displaystyle x_k\,=\,\phi( x_{k-1}),\qquad k\ge 1.
</math></center>
{{twierdzenie|Banacha, o zbieżności iteracji prostej||
Niech <math>\displaystyle D_0</math> będzie domkniętym
podzbiorem dziedziny <math>\displaystyle D</math>,
<center><math>\displaystyle \overline D_0\,=\,D_0\subset D,
</math></center>
w którym <math>\displaystyle \phi</math> jest odwzorowaniem zwężającym.
To znaczy, <math>\displaystyle \phi(D_0)\subset D_0</math>, oraz istnieje stała
<math>\displaystyle 0\le L<1</math> taka, że
<center><math>\displaystyle \|\phi( x)-\phi( y)\|\,\le\,L\,\| x- y\|,
    \qquad\forall x, y\in D_0. 
</math></center>
Wtedy równanie ([[##rrw|Uzupelnic: rrw ]]) ma dokładnie jedno
rozwiązanie <math>\displaystyle  x^*</math>, oraz
<center><math>\displaystyle x^*\,=\,\lim_{k\to\infty} x_k,
</math></center>
dla dowolnego przybliżenia początkowego
<math>\displaystyle  x_0\in D_0</math>.
}}
{{dowod|||
Wobec
<center><math>\displaystyle \aligned \| x_k- x_{k-1}\| &=
  \|\phi( x_{k-1})-\phi( x_{k-2})\|
  \,\le\,L\,\| x_{k-1}- x_{k-2}\| \\
  &\le &\cdots\;\le\;L^{k-1}\| x_1- x_0\|,
\endaligned</math></center>
dla <math>\displaystyle k\ge s</math> mamy
<center><math>\displaystyle \aligned \| x_k- x_s\|
  &\le & \sum_{j=s+1}^k\| x_j- x_{j-1}\| 
    \,\le\,\sum_{j=s+1}^k L^{j-1}\| x_1- x_0\| \\
  &=  L^s(1+L+\cdots+L^{k-s-1})\| x_1- x_0\|
    \,\le\,\frac{L^s}{1-L}\| x_1- x_0\|.
\endaligned</math></center>
Ciąg <math>\displaystyle \{ x_k\}_k</math> jest więc ciągiem Cauchy'ego.
Stąd istnieje granica
<math>\displaystyle \vec\alpha=\lim_{k\to\infty} x_k</math>, która należy do
<math>\displaystyle D_0</math>, wobec domkniętości tego zbioru. Ponieważ
lipschitzowskość <math>\displaystyle \phi</math> implikuje jej ciągłość,
mamy też 
<center><math>\displaystyle \phi(\vec\alpha)\,=\,\phi\Big(\lim_{k\to\infty} x_k\Big)
  \,=\,\lim_{k\to\infty}\phi( x_k)
  \,=\,\lim_{k\to\infty} x_k\,=\,\vec\alpha,
</math></center>
tzn. <math>\displaystyle \vec\alpha</math> jest punktem stałym odwzorowania <math>\displaystyle \phi</math>.
Dla jednoznaczności zauważmy, że jeśliby istniał
drugi, różny od <math>\displaystyle \vec\alpha</math>, punkt stały <math>\displaystyle \vec\beta</math>,
to mielibyśmy
<center><math>\displaystyle \|\vec\alpha-\vec\beta\|\,=\,
  \|\phi(\vec\alpha)-\phi(\vec\beta)\|
  \,\le\,L\,\|\vec\alpha-\vec\beta\|.
</math></center>
Stąd <math>\displaystyle 1<L</math>, co jest sprzeczne z założeniem, że
<math>\displaystyle \phi</math> jest zwężająca. }}
Z powyższych rozważań otrzymujemy natychmiastowy
wniosek dotyczący zbieżności iteracji prostych.
{{wniosek|||
Przy założeniach [[twit|Uzupełnij: twierdzenia Banacha]],
metoda iteracji prostych jest zbieżna co
najmniej liniowo z ilorazem <math>\displaystyle L</math>, tzn.
<center><math>\displaystyle \| x_k- x^*\|\,\le\,L^k\,\| x_0- x^*\|.
</math></center>
}}
{{przyklad|||
Dla ilustracji, rozpatrzmy natępujące proste
równanie skalarne:
<center><math>\displaystyle
  x\,=\,\cos(x), \qquad \mbox{dla} \qquad x\in D= R.
</math></center>
W tym przypadku <math>\displaystyle \phi(x)=\cos(x)</math>. Zauważamy, że w
przedziale <math>\displaystyle [0,1]</math> funkcja <math>\displaystyle \phi</math> jest zwężająca ze
stałą
<center><math>\displaystyle L\,=\,\max_{0\le x\le 1}|\cos'(x)|\,=\,\sin(1)\,<\,1.
</math></center>
Stąd istnieje dokładnie jedno rozwiązanie naszego równania
w przedziale <math>\displaystyle [0,1]</math>. Rozwiązanie to może
być aproksymowane z dowolnie małym błędem przy pomocy
iteracji prostych, startując z dowolnego przybliżenia
początkowego <math>\displaystyle  x_0\in [0,1]</math>.
}}
Zaletą iteracji prostych jest fakt, że zbieżność
nie zależy od wymiaru <math>\displaystyle n</math> zadania, ale tylko od stałej
Lipschitza <math>\displaystyle L</math> (jednak w praktyce czasem sama stała Lipschitza może zależeć od
wymiaru zadania...). Metoda Banacha ma szczególne zastosowanie w
przypadku, gdy funkcja <math>\displaystyle \phi</math> jest zwężająca na całym
zbiorze <math>\displaystyle D</math>, tzn. <math>\displaystyle D_0=D</math>. Jeśli ponadto <math>\displaystyle D</math> ma
skończoną średnicę <math>\displaystyle  \mbox{diam} (D)</math>, to dla
osiągnięcia <math>\displaystyle \epsilon</math>-aproksymacji zera funkcji <math>\displaystyle f</math>
wystarczy wykonać
<center><math>\displaystyle k\,=\,k(\epsilon)\,=\,\Big\lceil\frac
  {\log(\| x_0- x^*\|/\epsilon)}{\log(1/L)}\Big\rceil
  \,=\,\Big\lceil\frac
  {\log( \mbox{diam} (D)/\epsilon)}{\log(1/L)}\Big\rceil
</math></center>
iteracji, niezależnie od <math>\displaystyle x_0</math>. Metody zbieżne dla
dowolnego przybliżenia początkowego, nazywamy
''zbieżnymi globalnie''. Obie przedstawione dotychczas metody: bisekcji i
Banacha, przy rozsądnych
założeniach, są zbieżne globalnie.
Okazuje się, że metoda iteracji prostej może być --- w bardzo szczególnych
przypadkach --- zbieżna szybciej niż liniowo. Z taką sytuacją będziemy mieli,
gdy korzystać będziemy z metody Newtona.
===Metoda Newtona===
Zarówno metoda Banacha jak i bisekcja są zbieżnie liniowo, co w praktyce może
okazać się zbieżnością dość powolną (np. dla metody zbieżnej liniowo z ilorazem
<math>\displaystyle \frac{1}{2}</math>, dopiero co 5 iteracji, dostajemy kolejną
dokładną cyfrę wyniku). Wykorzystując więcej informacji o funkcji <math>\displaystyle f</math>, której
miejsca zerowego poszukujemy, możemy istotnie przyspieszyć zbieżność metody.
Ceną, jaką przyjdzie nam zapłacić, będzie utrata globalnej zbieżności.
Metoda Newtona i jej podobne należą do
grupy metod ''zbieżnych lokalnie''. Znaczy to, że
zbieżność ciągu <math>\displaystyle \{x_k\}_k</math> do zera danej funkcji <math>\displaystyle f</math>
jest zapewniona jedynie wtedy, gdy przybliżenia początkowe
zostały wybrane dostatecznie blisko <math>\displaystyle x^*</math>.
W dalszych rozważaniach będziemy zakładać dla
uproszczenia, że dziedzina <math>\displaystyle D=R</math>.
Idea metody Newtona opiera się na popularnym wśród inżynierów pomyśle ''linearyzacji'': zamiast szukać miejsca zerowego skomplikowanej <math>\displaystyle f</math>, przybliżmy ją
linią prostą, a dla niej już umiemy znaleźć miejsce zerowe!
Startując z pewnego przybliżenia
początkowego <math>\displaystyle x_0</math>, w kolejnych krokach metody, <math>\displaystyle k</math>-te
przybliżenie <math>\displaystyle x_k</math> jest punktem przecięcia stycznej do
wykresu <math>\displaystyle f</math> w punkcie <math>\displaystyle x_{k-1}</math>. Ponieważ równanie
stycznej wynosi <math>\displaystyle y(x)=f(x_{k-1})+f'(x_{k-1})(x-x_{k-1})</math>,
otrzymujemy wzór
<center><math>\displaystyle x_k\,=\,x_{k-1}\,-\,\frac{f(x_{k-1})}{f'(x_{k-1})}.
</math></center>
Oczywiście, aby metoda Newtona była dobrze zdefiniowana,
musimy założyć, że <math>\displaystyle f'(x_{k-1})</math> istnieje i nie
jest zerem.
Zauważmy, że metodę Newtona można traktować jako
szczególny przypadek iteracji prostych, gdzie
<center><math>\displaystyle \phi(x)\,=\,x-\frac{f(x)}{f'(x)}.
</math></center>
Widać też, że nie jest ona zbieżna globalnie.
 
Nawet jeśli pochodna w <math>\displaystyle x_{k-1}</math> się nie zeruje,
ciąg <math>\displaystyle \{x_k\}_k</math> może nie zbiegać do zera funkcji <math>\displaystyle f</math>.
Okazuje się jednak, że jeśli
wystartujemy dostatecznie blisko rozwiązania <math>\displaystyle x^*</math>, to
metoda Newtona jest zbieżna. Dokładniej, załóżmy
najpierw, że <math>\displaystyle f(x^*)=0</math> oraz
<center><math>\displaystyle f'(x^*)\,\ne\,0.
</math></center>
Ponadto załóżmy, że <math>\displaystyle f</math> jest dwukrotnie
różniczkowalna w sposób ciągły, <math>\displaystyle f\in C^2(D)</math>.
Rozwijając <math>\displaystyle \phi</math> w szereg Taylora w punkcie <math>\displaystyle x^*</math>
otrzymujemy
<center><math>\displaystyle x_k-x^*\,=\,\phi(x_{k-1})-\phi(x^*)\,=\,
  (x_{k-1}-x^*)\phi'(x^*)+(x_{k-1}-x^*)^2\phi''(\xi_k)/2,
</math></center>
gdzie <math>\displaystyle \min(x^*,x_{k-1})\le\xi_k\le\max(x^*,x_{k-1})</math>.
Wobec tego, że <math>\displaystyle \phi'(x^*)=f(x)f''(x)/(f'(x))^2=0</math> i
<math>\displaystyle \phi''(\xi_k)=f''(\xi_k)/f'(\xi_k)</math>, mamy
<center><math>\displaystyle
  x_k-x^*\,=\,(x_{k-1}-x^*)^2\frac{f''(\xi_k)}{2f'(\xi_k)}.
</math></center>
Zdefiniujmy liczbę
<center><math>\displaystyle R_f\,=\,\sup_{r\ge 0}\sup_{\{x:|x-x^*|\le r\}}
  \Big|\frac{2(x-x^*)f''(x)}{f'(x)}\Big|\,<\,1.
</math></center>
Oczywiście <math>\displaystyle R_f>0</math>. Dla <math>\displaystyle x_{k-1}</math> spełniającego 
<math>\displaystyle |x_{k-1}-x^*|\le R<R_f</math>, mamy z poprzedniej równości ([[##nrpdst|Uzupelnic: nrpdst ]])
<center><math>\displaystyle |x_k-x^*|\,\le\,q\,|x_{k-1}-x^*|,
</math></center>
gdzie <math>\displaystyle q<1</math> i <math>\displaystyle q</math> zależy tylko od <math>\displaystyle R</math>.
Niech teraz <math>\displaystyle x^*</math> będzie zerem <math>\displaystyle m</math>-krotnym,
<center><math>\displaystyle f(x^*)=f'(x^*)=\cdots =f^{(m-1)}(x^*)=0\ne f^{(m)}(x^*),
</math></center>
gdzie <math>\displaystyle m\ge 2</math>, oraz niech <math>\displaystyle f</math> będzie <math>\displaystyle m</math>-krotnie
różniczkowalna w sposób ciągły. Wtedy
<center><math>\displaystyle \aligned x_k-x^* &= (x_{k-1}-x^*)\,-\,\frac{(x_{k-1}-x^*)^m
  \frac{f^{(m)}  (\eta_k^{(1)})}{m!}}{(x_{k-1}-x^*)^{m-1}
  \frac{f^{(m-1)}(\eta_k^{(2)})}{(m-1)!}} \nonumber \\
  &= (x_{k-1}-x^*)\left(1-\frac 1m\frac
      {f^{(m)}(\eta_k^{(1)})}{f^{(m)}(\eta_k^{(2)})}
      \right) \nonumber \\
  &\approx & (x_{k-1}-x^*)\Big( 1-\frac 1m\Big),
\endaligned</math></center>
o ile <math>\displaystyle x_{k-1}</math> jest "blisko" <math>\displaystyle x^*</math>.
Metoda Newtona jest więc zbieżna lokalnie.
Z ([[##nrpdst|Uzupelnic: nrpdst ]]) i ([[##nrtp|Uzupelnic: nrtp ]]) można też wywnioskować,
jaki jest charakter zbieżności metody Newtona. Dla zera
jednokrotnego <math>\displaystyle x^*</math> oraz <math>\displaystyle f''(x^*)\ne 0</math> mamy bowiem
<center><math>\displaystyle (x_k-x^*)\,\approx\,(x-x_{k-1})^2\frac{f''(x^*)}{2f'(x^*)}.
</math></center>
Mówimy, że zbieżność jest ''kwadratowa''. Jeśli zaś
<math>\displaystyle f''(x^*)=0</math> to zbieżnośc jest nawet szybsza. Z kolei dla
zera <math>\displaystyle m</math>-krotnego zbieżność jest liniowa z ilorazem
<math>\displaystyle (1-\frac{1}{m})</math>.
Metoda Newtona jest pierwszą poznaną tutaj metodą
iteracyjną, która jest (dla zer jednokrotnych) zbieżna
szybciej niż liniowo. Dla takich metod wprowadza się
pojęcie ''wykładnika zbieżności'', który jest
zdefiniowany następująco.
Powiemy, że metoda iteracyjna <math>\displaystyle \phi</math> jest w klasie funkcji <math>\displaystyle F</math>
rzędu co najmniej <math>\displaystyle p\ge 1</math>, gdy spełniony jest następujący
warunek. Niech <math>\displaystyle f\in F</math> i <math>\displaystyle f(x^*)=0</math>. Wtedy istnieje stała
<math>\displaystyle C<\infty</math> taka, że dla dowolnych przybliżeń początkowych 
<math>\displaystyle x_0,\ldots,x_{s-1}</math> dostatecznie bliskich <math>\displaystyle x^*</math>, kolejne
przybliżenia <math>\displaystyle x_k=\phi(x_{k-1},\ldots,x_{k-s})</math> generowane
tą metodą spełniają
<center><math>\displaystyle |x_k-x^*|\,\le\,C\,|x_{k-1}-x^*|^p.
</math></center>
Ponadto, jeśli <math>\displaystyle p=1</math> to dodatkowo żąda się, aby <math>\displaystyle C<1</math>.
{{definicja|||
Wykładnikiem zbieżności metody
iteracyjnej <math>\displaystyle \phi</math> w klasie <math>\displaystyle F</math> nazywamy liczbę <math>\displaystyle p^*</math>
zdefiniowaną równością
<center><math>\displaystyle p^*\,=\,\sup\,\{\,p\ge 1:\,\phi
    \mbox{ jest rzędu co najmniej  }  p\,\}.
</math></center>
}}
Możemy teraz sformułować następujące twierdzenie,
które natychmiast wynika z poprzednich rozważań.
{{twierdzenie|||
Wykładnik zbieżności metody Newtona
(stycznych) wynosi <math>\displaystyle p^*=2</math> w klasie funkcji o zerach
jednokrotnych, oraz <math>\displaystyle p^*=1</math> w klasie funkcji o zerach
wielokrotnych.
}}
[[Image:MN|400px|Zbieżność metody Newtona na tle metody bisekcji]]
[[Image:MN|400px|Zbieżność metody Newtona dla zer wielokrotnych]]
===Metoda siecznych===
Inną znaną i często używaną metodą iteracyjną, opartą na podobnym pomyśle
linearyzacyjnych co metoda Newtona
jest ''metoda siecznych'', w której zamiast przybliżenia wykresu <math>\displaystyle f</math> przez
styczną,  stosuje się
przybliżenie sieczną.
Metoda ta
wykorzystuje więc do konstrukcji <math>\displaystyle x_k</math> przybliżenia
<math>\displaystyle x_{k-1}</math> i <math>\displaystyle x_{k-2}</math>. Musimy również wybrać dwa różne
punkty startowe <math>\displaystyle x_0</math> i <math>\displaystyle x_1</math>. Ponieważ prosta interpolująca
<math>\displaystyle f</math> w <math>\displaystyle x_{k-1}</math> i <math>\displaystyle x_{k-2}</math> ma wzór
<center><math>\displaystyle y(x)\,=\,\frac{x-x_{k-2}}{x_{k-1}-x_{k-2}}f(x_{k-1})+
          \frac{x-x_{k-1}}{x_{k-2}-x_{k-1}}f(x_{k-2}),
</math></center>
otrzymujemy
<center><math>\displaystyle x_k\,=\,x_{k-1}\,-\,\frac{x_{k-1}-x_{k-2}}
      {f(x_{k-1})-f(x_{k-2})}\,f(x_{k-1}).
</math></center>
Zauważmy, że jeśli <math>\displaystyle x_{k-1}</math> i <math>\displaystyle x_{k-2}</math> są blisko
siebie, to <math>\displaystyle x_k</math> jest podobny do tego z metody Newtona,
bowiem wtedy iloraz różnicowy
<center><math>\displaystyle
\frac{f(x_{k-1})-f(x_{k-2})}{x_{k-1}-x_{k-2}} \approx f'(x_{k-1}).
</math></center>
Nie wystarcza to
jednak, aby osiągnąć zbieżność z wykładnikiem
<math>\displaystyle 2</math>. Dokładniej, można pokazać, że wykładnik
zbieżności metody siecznych dla zer jednokrotnych dostatecznie gładkich funkcji
wynosi <math>\displaystyle p^*=\frac{1+\sqrt{5}}{2}=1.618\ldots</math>. Jako wariant metody Newtona, metoda
siecznych jest również zbieżna lokalnie.
Niewątpliwą zaletą metody siecznych jest jednak to,
że nie wymaga ona obliczania pochodnej funkcji (co
w praktyce jest często bardzo trudne, a niekiedy
nawet niemożliwe), a tylko jej wartości. Jest to również istotne w pakietach
numerycznych, gdzie czasem nie chcemy wymagać od użytkownika czegokolwiek ponad
podanie funkcji i przybliżonej lokalizacji miejsca zerowego.
Ponadto, często zdarza się, że wyznaczenie wartości pochodnej, <math>\displaystyle f'(x_k)</math>, jest
tak samo, albo i bardziej kosztowne od wyznaczenia wartości <math>\displaystyle f(x_k)</math>. W takim
wypadku okazuje się, że metoda stycznych --- choć wolniej zbieżna niż metoda
stycznych --- dzięki temu, że
jej iteracja wymaga jedynie wyznaczenia jednej wartości <math>\displaystyle f</math>, jest ''bardziej
efektywna'' od metody Newtona: koszt osiągnięcia zadanej dokładności jest w
takim przypadku mniejszy od analogicznego kosztu dla metody Newtona.
Jednak, gdy żądane przez użytkownika dokładności są bardzo wielkie, a sama
funkcja "złośliwa", metoda siecznych może cierpieć z powodu redukcji cyfr
przy odejmowaniu.
[[Image:MN|400px|Zbieżność metody siecznych na tle metody Newtona]]
===Metoda Brenta===
Naturalnie, uważny student zaczyna zadawać sobie pytanie, czy nie można w jakiś
sposób połączyć globalnej zbieżności metody bisekcji z szybką zbieżnością
metody siecznych tak, by uzyskać metodę zbieżną globalnie, a jednocześnie
istotnie szybciej niż liniowo. (Wariant odwrotny: opracowanie metody łączącej
wolną zbieżność bisekcji z lokalną zbieżnością siecznych, pozostawiamy
studentom gorszych uczelni).
Okazuje się, że można to zrobić, wprowadzając metodę opartą na ''trzech'' punktach lokalizujących miejsce zerowe: dwóch odcinających zero tak jak
w metodzie bisekcji i trzecim, konstruowanym jak np. w metodzie stycznych. W
kolejnej iteracji konstruujemy wymieniamy jeden z punktów albo wedle metody
siecznych (i wtedy zapewne szybciej zbliżamy się do zera), albo robiąc bisekcję
(aby zagwarantować sobie, że w wiadomym przedziale miejsce zerowe rzeczywiście
sie znajduje).
Ten prosty pomysł metody hybrydowej wymaga jednak subtelnego dopracowania, co
zostało zrobione w 1973 roku przez Richarda Brenta, który twórczo rozwinął wcześniejsze idee
Dekkera, van Wijngaardena i Dijkstry.
Funkcja MATLABa (i Octave'a) <code>fzero</code> implementuje metodę Brenta.
Ciekawostką jest, że autorem implementacji w Octave jest ówczesny student
matematyki na Uniwersytecie Warszawskim, Łukasz Bodzon.
[[Image:MN|400px|Porównanie zbieżności różnych metod dla równań nieliniowych: zero
jednokrotne]]
[[Image:MN|400px|Porównanie zbieżności różnych metod dla równań nieliniowych: zero
wielokrotne]]
===Ciekawostki===
O ile metoda Brenta jest oczywiście jego autorstwa, o tyle przypisywanie metody
stycznych Newtonowi jest pewną przesadą. Metodę Newtona taką jaką znamy (z
pochodną w mianowniku) zaproponował w 1740 roku Simpson (ten od kwadratury), a
więc kilknaście lat po śmierci Newtona. Żeby było jeszcze zabawniej, odkrywcą
metody siecznych zdaje się być... Newton! Więcej na ten temat przeczytasz w
artykule T.Ypma w SIAM Review 37, 1995.

Wersja z 18:13, 28 sie 2006

Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi? poprawki

Rozwiązywanie równań nieliniowych

Możesz zastanawiać się, jak w procesorach implementuje się działania arytmetyczne, na przykład dzielenie. Okazuje się, że dzielenie b/a można zaimplementować korzystając z uprzednio zaimplementowanych operacji dodawania i mnożenia...

To jest tytuł