6.1. Rješavanje nelinearnih jednadžbi#
Osim (sustava) linearnih jednadžbi, rijetko koju drugu jednadžbu znamo riješiti eksplicitno, tj. egzaktno. Poznate su formule za nalaženje nultočki polinoma stupnja manjeg od 5, dok je za polinome većeg stupnja Galoisova teorija pokazala da je općenito nemoguće dobiti nultočke pomoću konačno mnogo operacija zbrajanja, množenja, dijeljenja i vađenja cjelobrojnih korijena. U srednjoj školi ste rješavali eksponencijalne, logaritamske i trigonometrijske jednadžbe – no te jednadžbe su bile namještene tako da ih je bilo moguće egzaktno riješiti pomoću malog broja poznatih trikova. Na primjer, znamo kako riješiti jednadžbu \(\sin(x) + \cos(x) = 1\), no kako riješiti \(\sin(x) + x\cos(x) = 1\) ili \(\cos(x) + e^x = 1\)?
Općenito, rješavanje bilo koje jednadžbe s jednom nepoznanicom možemo svesti na traženje nultočki neke funkcije.
Neka je zadana (općenito, nelinearna) funkcija \(f : I \to \R\), gdje je \(I\) neki interval. Tražimo sve one točke \(x \in I\) za koje je
Takve točke \(x\) zovu se rješenja ili korijeni pripadne jednadžbe, odnosno, nultočke funkcije \(f\).
Ovdje pretpostavljamo:
Funkcija \(f\) je neprekidna na \(I\).
Nultočke funkcije \(f\) su izolirane.
Kažemo da je nultočka \(\alpha \in I\) funkcije \(f\) izolirana ako postoji okolina od \(\alpha\) u kojoj ne postoji neka druga nultočka od \(f\).
Na slici lijevo, funkcija ima 4 izolirane nultočke. Na slici desno, funkcija ima cijeli interval nultočki; niti jedna od njih nije izolirana.
Neprekidnost funkcije \(f\) obično se koristi pri određivanju intervala u kojem se nalazi nultočka. Naime, ako za neki segment \([a, b]\) vrijedi
a funkcija \(f\) je neprekidna, onda \(f\) nužno ima nultočku unutar \(\langle a, b \rangle\). Naime, tada je ili \(f(a) < 0 < f(b)\) ili je \(f(b) < 0 < f(a)\), a po poznatom rezultatu iz analize, neprekidna funkcija poprima sve međuvrijednosti, pa tako i vrijednost \(f(\alpha) = 0\) za neki \(\alpha \in \langle a, b \rangle\).
Uočimo da se unutar \(\langle a, b \rangle\) može nalaziti i više nultočki funkcije \(f\), kako je vidljivo na donjim slikama. Na obje slike vrijedi \(f(a) \cdot f(b) < 0\), no na slici lijevo je samo jedna nultočka unutar \([a, b]\), dok je na slici desno više nultočki unutar \([a, b]\).
S druge strane, i u segmentu \([a, b]\) za kojeg vrijedi \(f(a) \cdot f(b) > 0\) se mogu (ali ne moraju nužno) nalaziti nultočke od \(f\)! Da bismo ih odredili, morat ćemo dodatno analizirati tok funkcije \(f\) i uzeti manji početni interval. Uočite da na donjoj slici lijevo postoje manji segmenti \([\hat{a}, \hat{b}]\) oko svake od nultočki takvi da vrijedi \(f(\hat{a}) \cdot f(\hat{b}) < 0\). No na slici desno ne možemo pronaći takav interval – takva situacija nastupa kada je nultočka parnog reda. Problem određivanja takvih nultočki je numerički nestabilan: za funkciju \(f\) na slici desno i za po volji mali \(\eps > 0\), funkcija \(f(x) + \eps\) uopće nema nultočku. To nije slučaj niti za sliku lijevo niti za gornje dvije slike.
Napomena
Ako su sve nultočke neprekidne funkcije \(f\) na segmentu \([a, b]\) izolirane, onda tih nultočaka može biti samo konačno mnogo.
U protivnom, postojao bi niz \(\alpha_1, \alpha_2, \ldots\) nultočki unutar \([a, b]\), pa:
Kako je taj niz ograničen, on ima gomilište \(\alpha \in [a, b]\).
To gomilište je također nultočka od \(f\) jer je \(f\) neprekidna.
No u svakoj okolini gomilišta \(\alpha\) tada postoji neki član niza \((\alpha_n)_n\).
Stoga \(\alpha\) nije izolirana nultočka, što je kontradikcija s pretpostavkom.
Naš cilj je, za zadanu točnost \(\eps > 0\), pronaći aproksimacije \(\hat{\alpha}_1, \hat{\alpha}_2, \ldots, \hat{\alpha}_k\) svih nultočki \(\alpha_1, \alpha_2, \ldots, \alpha_k\) funkcije \(f\) tako da za apsolutnu grešku aproksimacije vrijedi \(|\hat{\alpha}_j - \alpha_j| \leq \eps\). Postupak će se sastojati od dvije faze.
Izolacije jedne ili više nultočki: potrebno je pronaći segment \([a, b]\) unutar kojeg se nalazi barem jedna nultočka. Ovo je teži dio posla i obavlja se analizom toka funkcije.
Primjena nekog iterativnog algoritma kojim ćemo odrediti nultočku na traženu točnost \(\eps\).
Uočite da će, ponovno zbog Galoisove teorije, svi algoritmi za traženje nultočki nužno morati biti iterativni, a ne konačni! Ti algoritmi će generirati niz sve boljih aproksimacija neke nultočke, a mi ćemo zaustaviti iteracije kada aproksimacija bude zadovoljavajuće točna.
Postoji mnogo metoda za nalaženje nultočaka nelinearnih funkcija na zadanu točnost. Pojedine metode postavljaju i razne dodatne zahtjeve na funkciju \(f\) ili segment \([a, b]\) kako bi dokazivo konvergirale prema nekoj od nultočaka unutar \([a, b]\). Metode razlikujemo i po brzini, tj. redu konvergencije.
Neka je dan niz iteracija \((x_n)_{n \in \N_0}\) koji konvergira prema \(\alpha \in \R\). Pretpostavimo da je \(p \geq 1\) najveći realni broj za koji postoji konstanta \(c > 0\) takva da vrijedi
Tada kažemo da niz \((x_n)_n\) konvergira prema \(\alpha\) s redom konvergencije \(p\).
Ako je \(p=1\), kažemo da niz konvergira linearno prema \(\alpha\). U tom slučaju, za faktor linearne konvergencije \(c\) mora vrijediti \(c < 1\).
Ako za \(c < 1\) vrijedi
kažemo da niz \((x_n)_n\) konvergira geometrijski s faktorom \(c\).
Indukcijom je vrlo lako pokazati da, ako niz \((x_n)_n\) konvergira linearno s faktorom \(c\), onda konvergira i geometrijski s istim faktorom. Obrat ne vrijedi, pa zato uvodimo odvojene pojmove.
Metoda bisekcije#
Najjednostavnija metoda za nalaženje nultočki je metoda bisekcije. Pretpostavimo da smo, za neprekidnu funkciju \(f\), pronašli interval \([a, b]\) takav da je
Kako smo već ranije argumentirali, \(f\) tada ima barem jednu nultočku unutar \([a, b]\). Označimo taj početni segment sa \([a_0, b_0] = [a, b]\).
Osnovna ideja metode bisekcije
U segmentu \([a_0, b_0]\) se nalazi neka nultočka funkcije \(f\). Promotrimo njegovo polovište \(x_0 = \frac{a_0+b_0}{2}\). Kako su brojevi \(f(a_0)\) i \(f(b_0)\) različitog predznaka, postoje tri mogućnosti:
\(f(x_0) = 0\). Tada je \(x_0\) nultočka od \(f\) i algoritam odmah staje.
\(f(x_0)\) i \(f(a_0)\) su različitih predznaka, tj. vrijedi \(f(a_0) \cdot f(x_0) < 0\).
Tada \(f\) ima nultočku u \([a_0, x_0]\).
\(f(x_0)\) i \(f(b_0)\) su različitih predznaka, tj. vrijedi \(f(x_0) \cdot f(b_0) < 0\).
Tada \(f\) ima nultočku u \([x_0, b_0]\).
Ako nismo odmah pronašli nultočku, označimo:
\([a_1, b_1] := [a_0, x_0]\) ako se dogodio slučaj 2, odnosno,
\([a_1, b_1] := [x_0, b_0]\) ako se dogodio slučaj 3.
U oba slučaja, širina segmenta se prepolovila, a kako vrijedi \(f(a_1) \cdot f(b_1) < 0\), u \([a_1, b_1]\) se nalazi nultočka funkcije \(f\)!
Ponavljanjem ovog postupka tako dobivamo niz sve manjih segmenata \([a_n, b_n]\), \(n \in \N\) i njihovih polovišta \(x_n = \frac{a_n + b_n}{2}\). Znamo da se u svakom segmentu nalazi neka nultočka funkcije \(f\) jer uvijek osiguravamo da vrijedi \(f(a_n) \cdot f(b_n) < 0\).
Proceduru zaustavljamo kada širina segmenta postane manja od \(\eps\). Polovište tog zadnjeg segmenta će biti naša aproksimacija nultočke; ta aproksimacija je očito udaljena za manje od \(\eps\) od nultočke!
Opisani postupak nazivamo metoda bisekcije ili metoda raspolavljanja. Napišimo pripadni algoritam u Pythonu.
def bisekcija( f, a, b, eps ):
# Ulaz:
# f - funkcija čiju nultočku tražimo.
# a, b - brojevi takvi da je f(a)*f(b) < 0.
# eps - željena točnost aproksimacije.
# Izlaz:
# x - jedna od nultočki funkcije f unutar [a, b], izračunata s aps. greškom < eps
fa = f(a); fb = f(b);
# Ponavljamo sve dok je širina segmenta [a, b] veća od eps.
while( b - a > eps ):
# Odredimo polovište trenutnog segmenta.
x = (a + b) / 2;
fx = f(x);
if( fx == 0 ):
# Možda smo pogodili direktno u nultočku. Vrlo malo vjerojatno.
return x;
elif( fa*fx < 0 ):
# Unutar [a, x] je nultočka -> to postaje novi [a, b].
b = x; fb = fx;
else:
# Vrijedi fx*fb < 0.
# Unutar [x, b] je nultočka -> to postaje novi [a, b].
a = x; fa = fx;
return x;
Neka je \((x_n)_n\) niz polovišta generiran metodom bisekcije za funkciju \(f\) i početni segment \([a, b]\). Tada postoji neka nultočka \(\alpha\) od \(f\) takva da je
Za tu nultočku, te svaki \(n \in \N\) vrijedi sljedeća ocjena greške:
Iako smo već u konstrukciji praktički napravili i dokaz ove propozicije, istaknimo neke detalje: obratit ćemo pažnju na to kojoj nultočki ovaj niz konvergira.
Kako smo ranije spomenuli, funkcija \(f\) unutar segmenta \([a, b]\) može imati samo konačno mnogo nultočki: neka su to \(\alpha_1 < \alpha_2 < \ldots < \alpha_k\). Označimo s \(\delta = \min_{i=2, \ldots, k} |\alpha_i - \alpha_{i-1}|\) najmanji razmak između susjednih nultočaka. Očito, u svakom od intervala \(\langle \alpha_i - \delta, \alpha_i + \delta \rangle\) se nalazi samo jedna nultočka, \(\alpha_i\).
Neka je \(N \in \N\) takav da je \(\frac{1}{2^N}(b-a) < \delta\). U svakom segmentu \([a_n, b_n]\) kojeg generira metoda bisekcije se nalazi bar jedna nultočka; označimo sa \(\alpha_\ast\) bilo koju od nultočki koja je unutar \([a_N, b_N]\). Širina segmenta \([a_N, b_N]\) je jednaka upravo \(\frac{1}{2^N}(b-a) < \delta\), pa vrijedi \([a_N, b_N] \subseteq \langle \alpha_\ast - \delta, \alpha_\ast + \delta \rangle\). Stoga se unutar \([a_N, b_N]\) nalazi samo jedna nultočka, \(\alpha_\ast\).
Kako je \([a_{k+1}, b_{k+1}] \subseteq [a_k, b_k]\), za svaki \(n \geq N\) je upravo \(\alpha_\ast\) jedina nultočka od \(f\) koja je unutar \([a_n, b_n]\). Dodatno, vrijedi
Stoga po teoremu o sendviču vrijedi \(\lim_n a_n \leq \alpha_\ast \leq \lim_n b_n\). Kako je \(b_n - a_n = \frac{1}{2^n}(b-a)\), imamo \(\lim_n a_n = \lim_n b_n = \alpha_\ast\), pa onda i \(\lim_n x_n = \lim_n \frac{a_n + b_n}{2} = \alpha_\ast\).
Kako je \(\alpha_\ast \in [a_n, b_n]\) za sve \(n \in \N\), a \(x_n\) je polovište od \([a_n, b_n]\), imamo
Ocjena greške iz gornje propozicije podsjeća na geometrijsku konvergenciju s faktorom \(c = 1/2\), no zdesna se ne pojavljuje član \(|\alpha - x_0|\). Iz te ocjene možemo unaprijed odrediti koliko je koraka potrebno da pronađemo nultočku sa zadanom točnosti \(\eps > 0\): kako bismo osigurali da vrijedi \(|\alpha - x_n| \leq \eps\), dovoljno je zahtijevati
Sada logaritmiranjem (u bilo kojoj bazi) lako dobivamo da je potreban broj koraka
Ako je funkcija \(f\) klase \(C^1\), postoji još jedan, tzv. dinamički kriterij zaustavljanja. Ovaj kriterij je neovisan o metodi, tj. funkcionira za bilo koju metodu, a ne samo za bisekciju.
Neka je \(f \in C^1([a, b])\), \(\alpha \in [a, b]\) bilo koja nultočka funkcije \(f\) te
Ako je \(m_1 > 0\), onda za svaki \(x \in [a, b]\) vrijedi
Po Teoremu srednje vrijednosti za funkciju \(f\) oko točke \(\alpha\), postoji neki \(\xi\) između \(x\) i \(\alpha\) takav da vrijedi:
Kako je \(f(\alpha) = 0\), imamo
Uočimo da je \(|f'(\xi)| \geq m_1 > 0\), pa smo smjeli podijeliti sa \(f'(\xi) \neq 0\).
Dinamički kriterij zaustavljanja
Metodu bisekcije (ili bilo koju drugu metodu) možemo zaustaviti kada za aproksimaciju \(x_n\) vrijedi
Naime, tada iz gornje propozicije direktno slijedi
Uočimo da je za dinamički kriterij zaustavljanja potrebno odrediti broj \(m_1 = \min_{x \in [a, b]}|f'(x)|\), što nije uvijek moguće ili jednostavno.
Napomena
Zahtjev \(m_1 > 0\) je iznenađujuće jaki zahtjev na segment \([a, b]\).
Naime, zbog neprekidnosti funkcije \(f'\) iz \(m_1 = \min_{x \in [a, b]}|f'(x)| > 0\) slijedi da \(f'\) ima konstantni predznak na \([a, b]\). Dakle, ili je \(f'(x) > 0\) za sve \(x \in [a, b]\) ili je \(f'(x) < 0\) za sve \(x \in [a, b]\).
To pak povlači da je funkcija \(f\) monotona na \([a, b]\)! Dodatno, zbog monotonosti \(f\) može imati samo jednu nultočku unutar \([a, b]\)!
Newtonova metoda#
Newtonova metoda je vjerojatno najvažnija i najčešće korištena metoda za rješavanje nelinearnih jednadžbi. Kao i u ranijim poglavljima, aproksimaciju rješenja za neku „kompliciranu” funkciju \(f\) možemo dobiti tako da \(f\) zamijenimo s nekom jednostavnijom funkcijom. U ovom slučaju, to će biti najjednostavnija moguća funkcija - pravac.
Ideja Newtonove metode
Neka je \(f\) funkcija klase \(C^1([a, b])\).
Pretpostavimo da imamo aproksimaciju \(x_n\) nultočke funkcije \(f\). Povucimo tangentu na graf funkcije \(f\) u točki \((x_n, f(x_n))\). U točki gdje ta tangenta siječe os \(x\) je nova aproksimacija \(x_{n+1}\).
Drugim riječima, funkciju \(f\) aproksimiramo pravcem.
Tangenta u točki \((x_n, f(x_n))\) je najbolja linearna aproksimacija funkcije \(f\) u okolini točke \(x_n\).
Nepoznatu nultočku funkcije \(f\) aproksimiramo nultočkom \(x_{n+1}\) tog pravca.
Ovaj postupak ponavljamo.

Formulu za iduću iteraciju je lako izvesti: jednadžba tangente funkcije \(f\) u točki \((x_n, f(x_n))\) je
Presjek ovog pravca s pravcem \(y=0\) daje točku \(x_{n+1} := x\),
pri čemu je \(x_0\) neka pogodno odabrana početna iteracija. Očito, nužan uvjet da bismo izračunali \(x_{n+1}\) jest da vrijedi \(f'(x_n) \neq 0\).
def newton( f, df, x0, eps, max_n ):
# Ulaz:
# f - funkcija čiju nultočku tražimo.
# df - derivacija funkcije čiju nultočku tražimo.
# x0 - početna iteracija
# max_n - maksimalni broj koraka Newtonove metode.
# Izlaz:
# x - aproksimacija neke od nultočki funkcije f.
# Izračunamo max_n koraka Newtonove metode.
x = x0;
for n in range( 0, max_n ):
x = x - f(x) / df(x);
return x;
Uočite da, za razliku od naše implementacije metode bisekcije, gornja implementacija Newtonove metode nema ugrađeni kriterij zaustavljanja koji bi jamčio točnost nego uvijek izračuna max_n
iteracija.
Analiza konvergencije Newtonove metode nije sasvim jednostavna. Ako imamo segment \(I=[a, b]\) unutar kojeg je nultočka \(\alpha\) i početna aproksimacija \(x_0\), onda bez dodatnih pretpostavki
nije jasno da aproksimacije \(x_n\) ostaju unutar \(I\);
nije jasno da metoda konvergira prema \(\alpha\) ili čak prema bilo kojoj drugoj nultočki.
Pitanja oko konvergencije niza iteracija prema nultočki
Općenito nas zanimaju tri pitanja vezana uz konvergenciju niza \((x_n)_n\):
Brzina konvergencije.
Ako niz konvergira prema nultočki, koji je red konvergencije?
Lokalna konvergencija.
Konvergira li (i pod kojim točno uvjetima) metoda ako je početna točka \(x_0\) dovoljno blizu nultočke \(\alpha\)?
Globalna konvergencija.
Konvergira li (i pod kojim točno uvjetima) metoda za svaki izbor početne točke \(x_0\) unutar nekog segmenta \(I\)?
Pretpostavimo za početak da niz iteracija konvergira prema nultočki, a kasnije ćemo raspravljati o uvjetima u kojima to vrijedi. Sljedeći teorem pokazuje da će tada konvergencija biti kvadratna, odnosno, bitno brža no kod metode bisekcije.
Neka je \(f \in C^2(I)\) na nekom segmentu \(I\) koji sadrži jednostruku nultočku \(\alpha\) funkcije \(f\).
Pretpostavimo da niz aproksimacija \((x_n)_n\) generiran Newtonovom metodom konvergira prema \(\alpha\). Tada je brzina konvergencije (barem) kvadratna, te u limesu vrijedi
Bez smanjenja općenitosti, možemo pretpostaviti da svi članovi niza \((x_n)_n\) leže unutar segmenta \(I\) (zbog konvergencije prema \(\alpha\), to će se dogoditi počevši od neke iteracije nadalje). Promotrimo Taylorov polinom funkcije \(f\) oko točke \(x_n\):
pri čemu je \(\xi_n \in I\) između \(x\) i \(x_n\). Uvrstimo nultočku \(x = \alpha\), pa dobivamo
Uz pretpostavku \(f'(x_n) \neq 0\), slijedi
odnosno,
Po pretpostavci je \(\alpha\) jednostruka nultočka, pa je \(f'(\alpha) \neq 0\).
Zbog neprekidnosti od \(f'\) slijedi da postoji segment \(I_1 \ni \alpha\) širine veće od nula takav da je \(f'(x) \neq 0\) za svaki \(x \in I_1\).
Kako \(x_n \to \alpha\), postoji \(N \in \N\) takav da je \(x_n \in I_1\) za sve \(n \geq N\).
Vrijedi \(\hat{m}_1 := \min_{x \in I_1} |f'(x)| > 0\).
Stavimo
Iz (6.2) sada slijedi
za sve \(n \in N\), pa je konvergencija kvadratna (reda 2). Dodatno, zapišimo (6.2) malo drugačije:
Uočimo da zbog \(\lim_n x_n = \alpha\) i činjenice da je \(\xi_n\) između \(\alpha\) i \(x_n\) slijedi i \(\lim_n \xi_n = \alpha\). Stoga puštanjem limesa u gornjem izrazu dobivamo
Ovdje smo iskoristili \(f \in C^2(I)\).
Napomena
Primijetimo da iz \( \lim_n \frac{\alpha - x_{n+1}}{(\alpha - x_n)^2} = \frac{-f''(\alpha)}{2 f'(\alpha)} =: C \) slijedi da postoji \(n_1 \in \N\) takav da za sve \(n \geq n_1\) vrijedi
tj. \( \frac{|\alpha - x_{n+1}|}{(\alpha - x_n)^2} \leq 1 + |C|, \) što povlači kvadratnu konvergenciju:
Općenito, ako pokažemo da postoji \(\lim_n \frac{\alpha - x_{n+1}}{(\alpha - x_n)^p}\) onda niz iteracija ima red konvergencije (barem) \(p\).
Napomena
Taylorov razvoj oko \(x_n\) iz dokaza teorema nam daje i posve analitičku motivaciju za izvod Newtonove metode. Naime, ako je \(x_n \approx \alpha\) dobra aproksimacija, tj. ako je \(|\alpha - x_n| = \eps \ll 1\), onda je \((\alpha - x_n)^2 = \eps^2\) još puno manji, pa u Taylorovom razvoju
možemo zanemariti kvadratni član. Time dobivamo
što motivira definiciju iduće, bolje aproksimacije upravo formulom \(x_{n+1} := x_n - \frac{f(x_n)}{f'(x_n)}\).
Pokažimo sada da Newtonove iteracije konvergiraju prema jednostrukoj nultočki funkcije \(f \in C^2\) ako je početna iteracija dovoljno blizu te nultočke. Uočite da je ovdje jedini zahtjev na funkciju \(f\) da je ona klase \(C^2\) na bilo kojem segmentu unutar kojeg je nultočka, što je vrlo slabi zahtjev.
Neka je \(\alpha\) jednostruka nultočka funkcije \(f \in C^2([a, b])\). Tada postoji \(\eps > 0\) sa svojstvom: ako je
onda niz Newtonovih iteracija \((x_n)_n\) konvergira prema \(\alpha\).
Kako smo već komentirali kod metode bisekcije, ako je \(\alpha\) jednostruka nultočka, onda zbog \(f'(\alpha) \neq 0\) i neprekidnosti od \(f'\) postoji \(\hat{\eps} > 0\) takav da je \(f'(x) \neq 0\) za sve \(x \in I := [\alpha - \hat{\eps}, \alpha + \hat{\eps}]\). Stavimo
Pokažimo da tvrdnja teorema vrijedi za \(\eps := \min\left\{ \frac{m_1}{M_2}, \hat{\eps} \right\}\); ako je \(M_2 = 0\), stavimo \(\eps = \hat{\eps}\).
Označimo još \(q = \frac{M_2}{2m_1}\eps\); očito je \(q \leq \frac{1}{2}\).
Pretpostavimo da je \(|\alpha - x_n| < \eps\) i pokažimo da tada slijedi \(|\alpha - x_{n+1}| \leq q |\alpha - x_n|\). Prisjetimo se izraza (6.2):
za neki \(\xi_n\) između \(x_n\) i \(\alpha\), tj. za neki \(\xi_n \in I\). Uzimanjem apsolutne vrijednosti imamo
Ako je \(M_2 = 0\), onda je i \(f''(\xi_n) = 0\), pa vrijedi ista ocjena \(|\alpha - x_{n+1}| = 0 \leq q |\alpha - x_n|\).
Specijalno je i \(|\alpha - x_{n+1}| < \eps\). Stoga indukcijom odmah slijedi
jer je \(q < 1\).
U praksi je obično teško iskoristiti tehniku iz dokaza gornjeg teorema kako bismo osigurali konvergenciju Newtonove metode, te nalaženje dobre početne iteracije \(x_0\) može biti netrivijalni problem. S druge strane, ako zahtjevu o tome da \(f'\) ima konstantni predznak na \([a, b]\) dodamo i identični zahtjev na \(f''\), dobivamo globalnu konvergenciju.
Neka je \(f \in C^2([a, b])\), te neka je \(f(a) \cdot f(b) < 0\).
Dodatno, pretpostavimo da niti \(f'\) niti \(f''\) nemaju nultočku u \([a, b]\).
Tada niz iteracija \((x_n)_n\) generiran Newtonovom metodom konvergira prema jedinstvenoj jednostrukoj nultočki \(\alpha \in [a, b]\) za svaku početnu iteraciju \(x_0 \in [a, b]\) za koju vrijedi
Kako \(f'\) i \(f''\) nemaju nultočku u \([a, b]\), a neprekidne su, obje te funkcije su konstantnog predznaka na \([a, b]\). Promotrimo samo jedan od četiri moguća slučaja za te predznake; u ostalim slučajevima dokaz ide posve analogno.
Pretpostavimo da je \(f'(x) > 0\) i \(f''(x) > 0\) za sve \(x \in [a, b]\).
Dakle, funkcija \(f\) je monotono rastuća i konveksna na \([a, b]\).
Stoga je \(f(a) < 0\) i \(f(b) > 0\).
Zbog \(f''(x_0) > 0\) i pretpostavke teorema, vrijedi \(f(x_0) > 0\).
Kako je \(f\) rastuća, slijedi \(x_0 > \alpha\).
Pokažimo indukcijom da vrijedi \(\alpha < x_n \leq x_0\), za sve \(n \in \N_0\); bazu smo već pokazali.
Za korak indukcije, pretpostavimo \(\alpha < x_n \leq x_0\).
Tada \(0 = f(\alpha) < f(x_n)\) jer je \(f\) rastuća.
Stoga
\[ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} < x_n.\]pa niz \((x_n)_n\) monotono pada.
Iz Taylorove formule oko \(x_n\) je
\[ 0 = f(\alpha) = f(x_n) + f'(x_n)(\alpha - x_n) + \frac{f''(\xi_n)}{2} (\alpha - x_n)^2,\]za \(\xi_n \in \langle \alpha, x_n \rangle \subseteq [a, b]\). Stoga \(f''(\xi_n) > 0\), pa je
\[ f(x_n) + f'(x_n) (\alpha - x_n) < 0,\]odakle slijedi
\[ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} > \alpha.\]
Dakle, niz \((x_n)_n\) je odozdo ograničen s \(\alpha\) i monotono pada, pa postoji limes
za koji vrijedi \(\alpha \leq \hat{\alpha} \leq x_0\), tj. \(\hat{\alpha} \in [a, b]\). Puštanjem limesa \(n \to \infty\) u formuli \(x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\) slijedi
Uočimo da je \(f'(\hat{\alpha}) \neq 0\) jer \(\hat{\alpha} \in [a, b]\). Stoga slijedi \(f(\hat{\alpha}) = 0\). Kako \(f\) ima jedinstvenu nultočku \(\alpha \in [a, b]\), mora biti \(\hat{\alpha} = \alpha\).
Rub intervala je dobra početna točka
Iz pretpostavke da \(f''\) ima konstantni predznak na \([a, b]\) te zbog \(f(a)f(b) < 0\) slijedi da u prethodnom teoremu uvijek možemo uzeti ili \(x_0 = a\) ili \(x_0 = b\).
Izvedimo još za kraj ove cjeline jedan kriterij zaustavljanja Newtonove metode pomoću kojeg ćemo detektirati kada je aproksimacija zadovoljavajuće točna.
Pretpostavimo da funkcija \(f \in C^2([a, b])\) ima nultočku \(\alpha \in [a, b]\) te da sve iteracije \(x_n\) generirane Newtonovom metodom leže unutar intervala \([a, b]\). Tada vrijedi
Promotrimo Taylorov polinom za \(f\), ovog puta oko točke \(x_{n-1}\), te uvrstimo \(x = x_n\):
pri čemu je \(\xi_{n-1}\) između \(x_{n-1}\) i \(x_n\), dakle, ponovno unutar \([a, b]\). Po definiciji iteracija u Newtonovoj metodi, vrijedi \(f(x_{n-1}) + f'(x_{n-1})(x_n - x_{n-1}) = 0\), pa je
odnosno,
Sada iskoristimo dinamičku ocjenu greške (Propozicija 6.4):
Pomoću gornje propozicije možemo izvesti kriterij za zaustavljanje Newtonove metode: ako želimo dobiti aproksimaciju nultočke tako da apsolutna greška bude manja od \(\eps\), iteracije ćemo zaustaviti kada je
Naravno, i dalje možemo koristiti i raniji dinamički kriterij zaustavljanja
Metoda jednostavnih iteracija#
Još jednu tehniku za rješavanje nelinearnih jednadžbi, ali i za analizu drugih metoda možemo dobiti tako da transformiramo originalnu jednadžbu u oblik \(\varphi(x) = x\). Tada točke \(\alpha\) za koje vrijedi \(\varphi(\alpha) = \alpha\) zovemo fiksne točke funkcije \(\varphi\).
Ideja metode jednostavnih iteracija
Neka je \(\alpha\) fiksna točka funkcije \(\varphi\), a \(x_0\) neka početna aproksimacija za \(\alpha\).
Metoda jednostavnih iteracija ili metoda fiksne točke generira niz
Promotrimo sada nekoliko primjera kako rješavanje jednadžbe \(f(x) = 0\) možemo transformirati u problem nalaženja fiksne točke \(\varphi(x) = x\) za neku funkciju \(\varphi\).
Reformulirajmo problem računanja \(\sqrt{a}\), tj. rješavanja nelinearne jednadžbe
u problem nalaženja fiksne točke.
1. pristup. \(x = x^2 + x - a\), tj. tražimo fiksnu točku funkcije \(\varphi(x) = x^2 + x - a\).
2. pristup. \(x = a/x\), tj. tražimo fiksnu točku funkcije \(\varphi(x) = a/x\).
3. pristup. \(x = \frac{1}{2}(x + a/x)\), tj. tražimo fiksnu točku funkcije \(\varphi(x) = \frac{1}{2}(x + a/x)\).
Konvergenciju pripadnih nizova za svaki od ovih pristupa ćemo analizirati kasnije.
Sada ćemo vidjeti pod kojim uvjetima niz generiran metodom jednostavnih iteracija konvergira ka fiksnoj točki. Izvedimo prvo dovoljan uvjet da bi funkcija \(\varphi\) uopće imala fiksnu točku.
Neka je funkcija \(\varphi\) neprekidna na \([a, b]\) i neka vrijedi
Tada funkcija \(\varphi\) ima barem jednu fiksnu točku \(\alpha \in [a, b]\).
Promotrimo funkciju \(g(x) := \varphi(x) - x\). Ta funkcija je neprekidna na \([a, b]\) i vrijedi
Dakle, neprekidna funkcija \(g\) mijenja predznak na \([a, b]\), pa ima nultočku \(\alpha \in [a, b]\). Iz \(g(\alpha) = 0\) slijedi \(f(\alpha) = \alpha\).
Primijetimo da zahtjev
možemo kompaktnije zapisati kao
Neka je funkcija \(\varphi\) neprekidna na \([a, b]\) i neka je
Pretpostavimo da je funkcija \(\varphi\) kontrakcija, odnosno, da postoji konstanta \(q \in \langle 0, 1 \rangle\) takva da vrijedi
Tada funkcija \(\varphi\) ima jedinstvenu fiksnu točku \(\alpha \in [a, b]\). Nadalje, za proizvoljnu početnu iteraciju \(x_0 \in [a, b]\), niz iteracija
konvergira prema \(\alpha\).
Iz prethodne leme slijedi da \(\varphi\) ima bar jednu fiksnu točku \(\alpha \in [a, b]\). Pokažimo da je ona jedinstvena.
Pretpostavimo da je \(\beta\) neka druga fiksna točka. Kako vrijedi \(\varphi(\alpha) = \alpha\) i \(\varphi(\beta) = \beta\), slijedi
odnosno \((1-q)|\alpha - \beta| \leq 0\). Zbog \(1 - q > 0\), mora biti \(|\alpha - \beta| \leq 0\), što je moguće jedino ako \(\alpha = \beta\), čime smo pokazali jedinstvenost.
Uzmimo sada proizvoljnu početnu točku \(x_0 \in [a, b]\) za metodu jednostavnih iteracija.
Iz \(x_{n} \in [a, b]\) slijedi \(x_{n+1} = \varphi(x_n) \in [a, b]\), pa cijeli niz \((x_n)_n\) ostaje unutar \([a, b]\).
Kako je \(\varphi\) kontrakcija, imamo
\[ |\alpha - x_{n+1}| = |\varphi(\alpha) - \varphi(x_n)| \leq q |\alpha - x_n|,\]pa indukcijom slijedi
\[ |\alpha - x_n| \leq q^n |\alpha - x_0|, \quad \text{za sve } n \geq 1.\]Puštanjem \(n \to \infty\), zbog \(0 < q < 1\) slijedi \(x_n \to \alpha\).
Uočimo da iz relacije \(|\alpha - x_{n+1}| \leq q |\alpha - x_n|\) koju smo imali u dokazu teorema slijedi da metoda jednostavne iteracije konvergira (barem) linearno s faktorom \(q\).
Uz iste pretpostavke koje smo imali u teoremu možemo izvesti ocjenu greške.
Neka je funkcija \(\varphi \in C([a, b])\) kontrakcija s faktorom \(q < 1\), te neka je
Tada je
Za dvije susjedne iteracije \(x_n = \varphi(x_{n-1})\) i \(x_{n+1} = \varphi(x_{n})\) vrijedi
Induktivnom primjenom ovog argumenta, imamo:
Posve analogno dobili bismo ocjenu \(|x_{n+\ell} - x_{n+\ell-1}| \leq q^\ell |x_{n} - x_{n-1}|\) za bilo koji \(\ell \geq 1\). Pomoću nejednakosti trokuta i ove ocjene dobivamo
Sada pustimo \(p \to \infty\). Zbog prethodnog teorema, vrijedi \(x_{n+p} \to \alpha\), gdje je \(\alpha\) jedinstvena fiksna točka od \(\varphi\). Ostali članovi nejednakosti ne ovise o \(p\), pa u limesu vrijedi
Pri kraju dokaza gornjeg teorema imali smo ocjenu
Ako želimo pronaći aproksimaciju \(x_n\) čija je apsolutna greška manja od \(\eps\), dovoljno je osigurati da vrijedi
Dakle, dinamički kriterij za zaustavljanje procesa jednostavnih iteracija je
Kod jednostavnih iteracija je moguće i unaprijed predvidjeti koliko nam koraka maksimalno treba da bi apsolutna greška bila \(\leq \eps\). Dovoljno je samo izračunati \(x_1\) i znati faktor kontrakcije \(q\), jer je prema gornjem teoremu dovoljno osigurati \(\frac{q^n}{1-q}|x_1 - x_0| \leq \eps\), odnosno
Vratimo se sada na diskusiju o konvergenciji metode jednostavnih iteracija i promotrimo što se događa kada je funkcija \(\varphi \in C^1[(a, b)]\). Označimo, kako i do sada, \(M_1 := \max_{x \in [a, b]}|f'(x)|\). Lako se vidi da je u slučaju \(M_1 < 1\) funkcija \(\varphi\) kontrakcija s faktorom \(M_1\), pa imamo sljedeći korolar.
Neka je \(\varphi \in C^1([a, b])\) takva da je \(\varphi([a, b]) \subseteq [a, b]\). Ako je
onda jednadžba \(\varphi(x) = x\) ima jedinstveno rješenje \(\alpha \in [a, b]\).
Dodatno, za proizvoljnu početnu točku \(x_0 \in [a, b]\) i niz \((x_n)_n\) generiran metodom jednostavnih iteracija vrijedi:
Po teoremu srednje vrijednosti, za bilo koje \(x, y \in [a, b]\) vrijedi
za neki \(\xi\) između \(x, y\), tj. za neki \(\xi \in [a, b]\). Uzimanjem apsolutne vrijednosti odmah slijedi da je
Stoga je \(\varphi\) kontrakcija s faktorom \(q = M_1\) i sve tvrdnje korolara osim zadnje slijede direktno iz Teorema 6.11 i ranijih razmatranja.
Zadnju tvrdnju dobijemo tako da ponovno promotrimo teorem srednje vrijednosti:
gdje je \(\xi_n\) između \(\alpha\) i \(x_n\). Budući da \(x_n \to \alpha\), vrijedi i \(\xi_n \to \alpha\). Zbog neprekidnosti od \(\varphi'\) tada vrijedi
Možemo pokazati čak i više: dovoljno je da samo za fiksnu točku \(\alpha\) vrijedi \(|\varphi'(\alpha)| < 1\) da bi metoda jednostavnih iteracija bila lokalno konvergentna.
Neka je \(\varphi\) funkcija klase \(C^1\) na nekoj okolini svoje fiksne točke \(\alpha\). Ako je
i ako je početna točka \(x_0\) dovoljno blizu \(\alpha\), onda vrijede sve tvrdnje o konvergenciji niza \((x_n)_n\) iz Korolara 6.13.
Kako je \(|\varphi'(\alpha)| < 1\), onda zbog neprekidnosti od \(\varphi'\) postoji \(\eps > 0\) takav da za segment \(I = [\alpha - \eps, \alpha + \eps]\) vrijedi
Stavimo \(q := \max_{x \in I} |\varphi'(x)|\). Neka je \(x \in I\) proizvoljan. Vrijedi \(|\alpha - x| \leq \eps\), pa po teoremu srednje vrijednosti imamo
Stoga je \(\varphi(x) \in I\), odnosno, \(\varphi(I) \subseteq I\) pa možemo primijeniti Korolar 6.13 za segment \([a, b] = I\).
Primijetimo da, ako vrijedi \(|\varphi'(\alpha)| > 1\), onda metoda jednostavnih iteracija neće konvergirati prema \(\alpha\). Naime, tada je i u nekoj okolini od \(\alpha\) derivacija po modulu veća od \(1\), pa čim je \(x_n\) dovoljno blizu \(\alpha\), vrijedi
tj. iduća iteracija je gora aproksimacija od \(\alpha\) no što je bila \(x_n\)!
Primijenimo sada napokon teoriju koju smo razvili za primjer s računanjem \(\sqrt{a}\).
Ispitajmo konvergenciju sva tri pristupa za računanje \(\sqrt{a}\) metodom jednostavnih iteracija.
1. pristup. Za \(\varphi(x) = x^2 + x - a\) imamo \(\varphi'(x) = 2x+1\). Uvrštavanjem fiksne točke \(x = \alpha = \sqrt{a}\) dobivamo
pa metoda jednostavnih iteracija za tu funkciju \(\varphi\) neće konvergirati. Štoviše, za bilo koju početnu točku \(x_0\) ove iteracije divergiraju!
2. pristup. Za \(\varphi(x) = a/x\) imamo \(\varphi'(x) = -a/x^2\). Uvrštavanjem fiksne točke \(x = \alpha = \sqrt{a}\) dobivamo
pa metoda jednostavnih iteracija za tu funkciju \(\varphi\) neće konvergirati. Niz iteracija je periodički: \(x_0, a/x_0, x_0, a/x_0, \ldots\)
3. pristup. Za \(\varphi(x) = \frac{1}{2}(x + a/x)\) imamo \(\varphi'(x) = \frac{1}{2}(1 - a/x^2)\). Uvrštavanjem fiksne točke \(x = \alpha = \sqrt{a}\) dobivamo
pa metoda jednostavnih iteracija za tu funkciju \(\varphi\) konvergira u okolini od \(\alpha = \sqrt{a}\). Zanimljivo, ova metoda se podudara upravo s Newtonovom metodom za jednadžbu \(x^2 - a = 0\) i ponekad se još naziva babilonska metoda (iako nema dokaza da su ju poznavali Babilonci).
Red konvergencije metode jednostavnih iteracija može biti i veći od jedan, kako pokazuje sljedeći teorem.
Neka je funkcija \(\varphi\) klase \(C^p\) na nekoj okolini svoje fiksne točke \(\alpha\), za neki \(p \geq 2\), te neka vrijedi
Ako je početna točka \(x_0\) dovoljno blizu \(\alpha\), onda niz \((x_n)_n\) generiran metodom jednostavnih iteracija konvergira prema \(\alpha\) s redom konvergencije (barem) \(p\) i vrijedi
Promotrimo Taylorov polinom stupnja \(p-1\) za funkciju \(\varphi\) oko \(\alpha\) i uvrstimo \(x = x_n\):
za neki \(\xi_n\) između \(x_n\) i \(\alpha\). Sada uvrstimo \(\varphi(\alpha) = \alpha\), \(\varphi(x_n) = x_{n+1}\), te \(\varphi^{(k)}(\alpha) = 0\) za \(k=1, \ldots, p-1\). Slijedi
Zbog \(|\varphi'(\alpha)| = 0 < 1\), niz iteracija \((x_n)_n\) konvergira prema \(\alpha\) za svaki \(x_0\) koji je dovoljno blizu \(\alpha\). Ponovno, zbog \(x_n \to \alpha\) slijedi i \(\xi_n \to \alpha\). Stoga imamo
Kako smo i ranije komentirali, iz činjenice da ovaj limes postoji direktno slijedi da je red konvergencije niza \((x_n)_n\) barem \(p\).
Teorem koji smo upravo pokazali je izuzetno koristan i za analizu drugih metoda za rješavanje nelinearnih jednadžbi.
Neka je \(\alpha\) jednostruka nultočka funkcije \(f\). Analizirajmo red konvergencije Newtonove metode u okolini od \(\alpha\). Newtonovu metodu možemo zapisati kao metodu jednostavnih iteracija:
Promotrimo sada derivaciju funkcije \(\varphi\):
Kada uvrstimo \(f(\alpha) = 0\), slijedi
pa iz Teorema 6.16 direktno slijedi da je red konvergencije Newtonove metode oko nultočke \(\alpha\) barem 2, tj. metoda konvergira barem kvadratno.
Izračunajmo i drugu derivaciju:
Zbog \(f(\alpha) = 0\) i \(f'(\alpha) \neq 0\), slijedi
Zaključak:
Ako je \(f''(\alpha) \neq 0\), red konvergencije Newtonove metode je \(2\).
Ako je \(f''(\alpha) = 0\), red konvergencije Newtonove metode je barem \(3\).
Newtonova metoda za višestruku nultočku
Uočimo da pomoću Teorema 6.16 možemo analizirati konvergenciju Newtonove metode i u slučaju kada funkcija \(f\) ima višestruku nultočku \(\alpha\).
Konkretno, pretpostavimo da je \(\alpha\) nultočka kratnosti \(m > 1\) funkcije \(f\) koja je klase \(C^{m+1}\) u nekoj okolini od \(\alpha\). Tada je
za neku funkciju \(g\) klase \(C^1\) na okolini od \(\alpha\) za koju vrijedi \(g(\alpha) \neq 0\). Tada imamo:
te \(f'(x) = m (x-\alpha)^{m-1} g(x) + (x-\alpha)^m g'(x) = (x - \alpha)^{m-1} g_1(x)\) za \(g_1(x) = m g(x) + (x - \alpha) g'(x)\). Iteracijska funkcija kod Newtonove metode je
pa je njezina derivacija jednaka
U nultočki \(\alpha\) vrijedi
Za nultočku \(\alpha\) kratnosti \(m \geq 2\), vrijedi \(\varphi'(\alpha) \neq 0\). Po Teoremu 6.16, slijedi da Newtonova metoda tada konvergira samo linearno!
Kad bismo unaprijed znali red nultočke, mogli bismo promatrati modificiranu Newtonovu metodu:
Pokažite da za pripadnu iteracijsku funkciju \(\hat{\varphi}\) tada vrijedi
pa modificirana Newtonova metoda ponovno konvergira barem kvadratično. U praksi je vrlo teško unaprijed znati je li nultočka višestruka, a kamoli kolika joj je kratnost.
Alternativno, umjesto rješavanja jednadžbe \(f(x) = 0\), možemo rješavati jednadžbu \(u(x) = 0\), gdje je \(u(x) = \frac{f(x)}{f'(x)}\). Funkcija \(u\) ima iste nultočke kao i \(f\), no sve imaju kratnost \(1\). Zbog toga, Newtonova metoda za funkciju \(u\) koja definira niz
konvergira barem kvadratično. Nedostatak ovog pristupa je što, da bismo izračunali \(u'(\tilde{x}_n)\) treba izračunati \(f''(\tilde{x}_n)\), odnosno, sada se pojavila i druga derivacija od \(f\).
Primjeri#
Na dva primjera usporedit ćemo brzinu konvergencije metode bisekcije i Newtonove metode. Samo radi ilustracije ovih metoda, napravit ćemo sljedeće modifikacije ranije napravljenih implementacija:
Metode će vraćati sve izračunate iteracije, a ne samo zadnju. Metoda bisekcije će vraćati i polja svih \(a_n\), \(b_n\).
Metodama ćemo poslati i „egzaktno” izračunato rješenje \(\alpha\) izračunato metodom bisekcije s toleracijom \(10^{-15}\). Takvo rješenje u praksi naravno ne možemo/želimo izračunati - upravo tome i služe metode poput Newtonove.
Iteracije ćemo zaustaviti nakon
n_max
iteracija ili kada bude \(|\alpha - x_n| \leq \eps\). Ponovno, u praksi moramo koristiti neki od kriterija zaustavljanja koje smo gore izveli.
Show code cell source
import numpy as np;
def bisekcija_v2( f, a, b, eps, n_max, alpha ):
fa = f(a); fb = f(b);
x = np.array( [] );
aovi = np.array( [] );
bovi = np.array( [] );
# Ponavljamo sve dok je širina segmenta [a, b] veća od eps.
for n in range( 0, n_max ):
# Odredimo polovište trenutnog segmenta.
xn = (a + b) / 2;
# Dodamo ga u polje svih izračunatih iteracija.
x = np.append( x, xn );
aovi = np.append( aovi, a );
bovi = np.append( bovi, b );
# Zaustavljamo iteracije ako je |alpha - x_n| < eps.
if( abs( alpha - xn ) < eps ):
break;
fx = f(xn);
if( fx == 0 ):
# Možda smo pogodili direktno u nultočku. Vrlo malo vjerojatno.
break;
elif( fa*fx < 0 ):
# Unutar [a, x] je nultočka -> to postaje novi [a, b].
b = xn; fb = fx;
else:
# Vrijedi fx*fb < 0.
# Unutar [x, b] je nultočka -> to postaje novi [a, b].
a = xn; fa = fx;
return (x, aovi, bovi);
def crtaj_tablicu_bisekcija( f, x, alpha ):
n = x.shape[0];
print( ' n a_n b_n x_n f(x_n) |alpha-x_n|' );
print( '-------------------------------------------------------------------------' );
for k in range( 0, n ):
print( f'{k:2d} {a[k]:.10f} {b[k]:.10f} {x[k]:.10f} {f(x[k]):>13.10f} {abs(alpha-x[k]):.10f}' );
Show code cell source
def newton_v2( f, df, x0, eps, n_max, alpha ):
# U polje svih iteracija stavimo samo x0.
x = np.array( [x0] );
xn = x0;
for n in range( 1, n_max ):
# Iduća aproksimacija.
xn = xn - f(xn) / df(xn);
# Dodamo ga u polje svih izračunatih iteracija.
x = np.append( x, xn );
# Zaustavljamo iteracije ako je |alpha - x_n| < eps.
if( abs( alpha - xn ) < eps ):
break;
return x;
def crtaj_tablicu_newton( f, x, alpha, exp=False ):
n = x.shape[0];
print( ' n x_n f(x_n) |alpha-x_n|' );
print( '-----------------------------------------------------------' );
for k in range( 0, n ):
if( exp ):
print( f'{k:2d} {x[k]:>17.10e} {f(x[k]):>18.10e} {abs(alpha-x[k]):.12e}' );
else:
print( f'{k:2d} {x[k]:>17.14f} {f(x[k]):>18.14f} {abs(alpha-x[k]):.14f}' );
Primjer 1. Izračunajmo \(\sqrt[3]{1.5}\), odnosno, nađimo realnu, pozitivnu nultočku \(\alpha\) funkcije
Jednostavno je detektirati da vrijedi \(\alpha \in [1, 2]\). Kako je
zbog neprekidnosti od \(f\) postoji nultočka unutar \([1, 2]\). No kako \(f\) strogo raste na \(\langle 0, \infty \rangle\), ta nultočka je ujedno i jedina pozitivna nultočka od \(f\).
Metodom bisekcije s točnosti \(\eps = 10^{-15}\) možemo prvo odrediti „egzaktnu” vrijednost nultočke: \(\alpha \approx 1.1447142425533317\).
# Funkcija čiju nultočku želimo odrediti.
def f( x ):
return x*x*x - 1.5;
# "Egzaktno" rješenje s apsolutnom greškom 10^(-15).
# Početni interval [a, b] = [1, 2].
alpha = bisekcija( f, 1, 2, 1e-15 );
print( f'alpha = {alpha:.16f}' );
alpha = 1.1447142425533317
Sada ponovno pokrenimo metodu bisekcije, te promotrimo koliko joj iteracija treba da odredi tu nultočku s apsolutnom greškom \(\eps = 10^{-8}\).
# Metoda bisekcije, za eps = 10^(-8).
# Početni interval je [a, b] = [1, 2].
# Ova verzija funkcije vraća sve iteracije.
(x_bisekcija, a, b) = bisekcija_v2( f, 1, 2, 1e-8, 50, alpha );
crtaj_tablicu_bisekcija( f, x_bisekcija, alpha );
n a_n b_n x_n f(x_n) |alpha-x_n|
-------------------------------------------------------------------------
0 1.0000000000 2.0000000000 1.5000000000 1.8750000000 0.3552857574
1 1.0000000000 1.5000000000 1.2500000000 0.4531250000 0.1052857574
2 1.0000000000 1.2500000000 1.1250000000 -0.0761718750 0.0197142426
3 1.1250000000 1.2500000000 1.1875000000 0.1745605469 0.0427857574
4 1.1250000000 1.1875000000 1.1562500000 0.0458068848 0.0115357574
5 1.1250000000 1.1562500000 1.1406250000 -0.0160179138 0.0040892426
6 1.1406250000 1.1562500000 1.1484375000 0.0146842003 0.0037232574
7 1.1406250000 1.1484375000 1.1445312500 -0.0007192492 0.0001829926
8 1.1445312500 1.1484375000 1.1464843750 0.0069693550 0.0017701324
9 1.1445312500 1.1464843750 1.1455078125 0.0031217756 0.0007935699
10 1.1445312500 1.1455078125 1.1450195312 0.0012004442 0.0003052887
11 1.1445312500 1.1450195312 1.1447753906 0.0002403928 0.0000611481
12 1.1445312500 1.1447753906 1.1446533203 -0.0002394794 0.0000609222
13 1.1446533203 1.1447753906 1.1447143555 0.0000004439 0.0000001129
14 1.1446533203 1.1447143555 1.1446838379 -0.0001195210 0.0000304047
15 1.1446838379 1.1447143555 1.1446990967 -0.0000595393 0.0000151459
16 1.1446990967 1.1447143555 1.1447067261 -0.0000295479 0.0000075165
17 1.1447067261 1.1447143555 1.1447105408 -0.0000145521 0.0000037018
18 1.1447105408 1.1447143555 1.1447124481 -0.0000070541 0.0000017944
19 1.1447124481 1.1447143555 1.1447134018 -0.0000033051 0.0000008408
20 1.1447134018 1.1447143555 1.1447138786 -0.0000014306 0.0000003639
21 1.1447138786 1.1447143555 1.1447141171 -0.0000004934 0.0000001255
22 1.1447141171 1.1447143555 1.1447142363 -0.0000000247 0.0000000063
Vidimo da metodi bisekcije:
Treba čak \(22\) iteracije da bi došla do aproksimacije \(x_{22} = 1.1447142363\) čija je apsolutna greška manja od \(10^{-8}\).
Promotrimo specijalno stupac \(f(x_n)\) i stupac \(|\alpha - x_n|\).
Vidimo da se broj vodećih nula u tim stupcima povećava za \(1\) otprilike svake \(3\) iteracije.
To odgovara linearnoj konvergenciji metode bisekcije.
Promotrimo sada što se dogodi kada pokrenemo Newtonovu metodu. Kako je funkcija \(f'(x) = 3x^2\) konstantnog predznaka na \([1, 2]\), kao i funkcija \(f''(x) = 6x\), metoda će konvergirati za bilo koju početnu točku \(x_0\) takvu da je \(f(x_0) f''(x_0) > 0\). Stoga možemo uzeti desni rub segmenta, \(x_0 = 2\).
# Newtonova metoda treba i derivaciju funkcije f.
def df( x ):
return 3*x*x;
x_newton = newton_v2( f, df, 2, 1e-12, 50, alpha );
crtaj_tablicu_newton( f, x_newton, alpha );
n x_n f(x_n) |alpha-x_n|
-----------------------------------------------------------
0 2.00000000000000 6.50000000000000 0.85528575744667
1 1.45833333333333 1.60149016203704 0.31361909078000
2 1.20732426303855 0.25983433061998 0.06261002048522
3 1.14790497826656 0.01257813452771 0.00319073571323
4 1.14472310335774 0.00003483308497 0.00000886080441
5 1.14471424262192 0.00000000026962 0.00000000006859
6 1.14471424255333 0.00000000000000 0.00000000000000
Vidimo da Newtonovoj metodi:
Treba samo \(6\) iteracija da bi došla do aproksimacije \(x_{5} = 1.14471424255333\) čija je apsolutna greška manja od \(10^{-12}\).
Promotrimo specijalno stupac \(f(x_n)\) i stupac \(|\alpha - x_n|\).
Vidimo da se broj vodećih nula u tim stupcima podupla u svakoj iteraciji.
To odgovara kvadratnoj konvergenciji Newtonove metode.
Nacrtajmo i graf apsolutnih grešaka za Newtonovu i metodu bisekcije.
Show code cell source
import matplotlib.pyplot as plt;
plt.semilogy( abs( alpha - x_bisekcija ), label='bisekcija' );
plt.semilogy( abs( alpha - x_newton ), label='Newton' );
plt.xlabel( 'iteracija $n$' );
plt.ylabel( '$|\\alpha - x_n|$' );
plt.title( 'Apsolutne greške u Newtonovoj i metodi bisekcije' );
plt.legend();

Graf apsolutnih grešaka za bisekciju je gotovo pravac, što ponovno odgovara linearnom redu konvergencije; povremeni skok se može dogoditi kada je polovište segmenta u nekoj iteraciji „slučajno” blizu nultočke, iako je širina segmenta i dalje prevelika da bismo zaustavili iteracije. Iz ovog grafa je teško detektirati red konvergencije Newtonove metode, no on je očito veći od \(1\).
Red konvergencije \(p\) možemo empirijski odrediti nakon izračunatog niza iteracija: treba vrijediti
za neku konstantu \(c\). Dakle, za dovoljno velike \(k\) očekujemo
Promotrimo ovu relaciju za \(k=n-1\) i \(k=n-2\). Kako \(x_n \to \alpha\), očekujemo da će \(x_{n}\) biti dovoljno bolja aproksimacija za \(\alpha\) od \(x_{n-1}\) i \(x_{n-2}\) da te relacije možemo zamijeniti sa
Kada podijelimo ove dvije približne jednakosti, eliminiramo \(c\) i dobivamo
iz čega možemo procijeniti red konvergencije
Napravimo to za Newtonovu metodu i \(n=3, 4, 5, 6\).
Show code cell source
def tablica_red_konvergencije( x ):
n_size = x.shape[0];
print( ' n p ' );
print( '-------------' );
for n in range( 3, n_size ):
brojnik = np.log( abs( x[n] - x[n-1] ) / abs( x[n] - x[n-2] ) );
nazivnik = np.log( abs( x[n] - x[n-2] ) / abs( x[n] - x[n-3] ) );
p = brojnik / nazivnik;
print( f'{n:2d} {p:.7f}' );
tablica_red_konvergencije( x_newton );
n p
-------------
3 1.6373782
4 1.8489351
5 1.9775015
6 1.9993717
Zaista, čini se da vrijednost od \(p\) teži prema \(2\), što je red konvergencije Newtonove metode.
Primjer 2. U ovom primjeru ćemo vidjeti kako ponašanje Newtonove metode ovisi o izboru početne točke \(x_0\).
Promotrimo funkciju
Njezina jedina nultočka je \(\alpha = 0\). Međutim, vidjet ćemo da postoji točka \(\beta\) takva da vrijedi:
Ako \(|x_0| < |\beta|\), onda Newtonova metoda s početnom točkom \(x_0\) konvergira.
Ako \(|x_0| > |\beta|\), onda Newtonova metoda s početnom točkom \(x_0\) divergira.
Ako \(|x_0| = |\beta|\), onda Newtonova metoda s početnom točkom \(x_0\) ima periodičko ponašanje.
Odredimo prvo \(x_0\) tako da vrijedi \(x_{1} = -x_0\). Zbog neparnosti funkcije \(f\) tada će vrijediti
pa slijedi \(x_0 = x_2 = x_4 = \ldots\) i \(x_1 = x_3 = x_5 = \ldots\) i ponašanje Newtonove metode je periodičko. Iz \(x_1 = -x_0\) imamo jednadžbu
Rješenje ove nelinearne jednadžbe možemo odrediti npr. metodom bisekcije. Rješenje \(x_0\) će biti upravo ta granična vrijednost \(\beta\).
Show code cell source
def g(x):
return np.arctan(x) - 2*x / (1 + x*x);
beta = bisekcija( g, 1, 2, 1e-15 );
print( f'beta = {beta:.16f}' );
beta = 1.3917452002707345
Na slici vidimo geometrijsku reprezentaciju predviđenog periodičkog ponašanja za \(x_0 = \beta\): tangenta na graf funkcije \(f\) u točki \((\beta, f(\beta))\) siječe x-os točno u točki \((-\beta, 0)\), a tangenta u točki \((-\beta, f(-\beta))\) siječe x-os u \((\beta, 0)\).

Ispišimo \(10\) Newtonovih iteracija s početnom točkom \(x_0 = \beta\):
Show code cell source
def f(x):
return np.arctan(x);
def df(x):
return 1 / (1 + x*x);
x0 = beta;
x_newton = newton_v2( f, df, x0, 1e-12, 10, 0 );
crtaj_tablicu_newton( f, x_newton, 0 );
n x_n f(x_n) |alpha-x_n|
-----------------------------------------------------------
0 1.39174520027073 0.94774713351699 1.39174520027073
1 -1.39174520027073 -0.94774713351699 1.39174520027073
2 1.39174520027073 0.94774713351699 1.39174520027073
3 -1.39174520027073 -0.94774713351699 1.39174520027073
4 1.39174520027071 0.94774713351698 1.39174520027071
5 -1.39174520027067 -0.94774713351697 1.39174520027067
6 1.39174520027056 0.94774713351693 1.39174520027056
7 -1.39174520027029 -0.94774713351684 1.39174520027029
8 1.39174520026955 0.94774713351659 1.39174520026955
9 -1.39174520026761 -0.94774713351593 1.39174520026761
Zaista, iteracije su (skoro) periodičke, do minimalnog odstupanja dolazi zbog grešaka zaokruživanja.
Promotrimo što se dogodi za neki \(|x_0| > \beta\), na primjer, uzmimo \(x_0 = 1.5\). Metoda očito divergira. Interpretirajte to geometrijski na gornjoj slici.
Show code cell source
x0 = 1.5;
x_newton = newton_v2( f, df, x0, 1e-12, 10, 0 );
crtaj_tablicu_newton( f, x_newton, 0, exp=True );
n x_n f(x_n) |alpha-x_n|
-----------------------------------------------------------
0 1.5000000000e+00 9.8279372325e-01 1.500000000000e+00
1 -1.6940796006e+00 -1.0375463591e+00 1.694079600554e+00
2 2.3211269614e+00 1.1640020424e+00 2.321126961438e+00
3 -5.1140878368e+00 -1.3776945287e+00 5.114087836778e+00
4 3.2295683914e+01 1.5398423269e+00 3.229568391421e+01
5 -1.5753169508e+03 -1.5701615340e+00 1.575316950821e+03
6 3.8949760078e+06 1.5707960701e+00 3.894976007761e+06
7 -2.3830288974e+13 -1.5707963268e+00 2.383028897355e+13
8 8.9202801611e+26 1.5707963268e+00 8.920280161124e+26
9 -1.2499045994e+54 -1.5707963268e+00 1.249904599366e+54
Konačno, uzmimo neki \(|x_0| < \beta\), na primjer, \(x_0 = 1\).
Show code cell source
x0 = 1.0;
x_newton = newton_v2( f, df, x0, 1e-12, 10, 0 );
crtaj_tablicu_newton( f, x_newton, 0 );
n x_n f(x_n) |alpha-x_n|
-----------------------------------------------------------
0 1.00000000000000 0.78539816339745 1.00000000000000
1 -0.57079632679490 -0.51866936925502 0.57079632679490
2 0.11685990399891 0.11633226511390 0.11685990399891
3 -0.00106102211704 -0.00106102171889 0.00106102211704
4 0.00000000079631 0.00000000079631 0.00000000079631
5 0.00000000000000 0.00000000000000 0.00000000000000
Metoda sada konvergira prema nultočki \(\alpha = 0\) i to u svega \(5\) koraka; interpretirajte to geometrijski na gornjoj slici. Procijenimo i njezin red konvergencije.
Show code cell source
tablica_red_konvergencije( x_newton );
n p
-------------
3 2.7945973
4 2.9644227
5 2.9994217
Numerički red konvergencije je ispao \(3\). To se podudara s teorijom jer za \(f(x) = \arctg(x)\) vrijedi \(f''(0) = 0\).