6.2. Sustavi nelinearnih jednadžbi#
Neke od ideja razvijenih za rješavanje nelinearnih jednadžbi s jednom nepoznanicom ćemo moći poopćiti i na sustave nelinearnih jednadžbi s \(n\) nepoznanica. Ako nepoznanice označimo sa \(x_1, \ldots, x_n\), a postoji \(m\) jednadžbi koje te nepoznanice moraju zadovoljavati, onda svaku od tih jednadžbi možemo zapisati ovako:
za neke funkcije \(f_1, f_2, \ldots, f_m : \R^n \to \R\). Označimo li
vidimo da nas zapravo zanimaju nultočke funkcije
Do sada smo u ovom i drugim kolegijima promatrali samo sustave linearnih jednadžbi: za zadanu matricu \(A \in \R^{m \times n}\) i vektor \(b \in \R^m\) tražili smo sve vektore \(x \in \R^n\) koji su nultočke funkcije \(f(x) = Ax - b\). Sada će nas prvenstveno zanimati nelinearne funkcije \(f\).
Radi jednostavnosti, u nastavku uvodimo sljedeće pretpostavke:
Broj jednadžbi je jednak broju nepoznanica, tj. \(m=n\).
Funkcija \(f\) ima samo izolirane nultočke \(\alpha \in \R^n\).
Funkcija \(f\) je dovoljno glatka u okolini nultočke koju želimo odrediti.
Promotrimo sada metode kojima smo rješavali nelinearne jednadžbe s jednom nepoznanicom i pokušajmo ih poopćiti na sustave nelinearnih jednadžbi. Uočimo prvo da je to poopćenje vrlo teško napraviti za metodu bisekcije. Zamislimo da tražimo nultočke funkcije \(f : \R^2 \to \R^2\).
Kako poopćiti uvjet \(f(a) f(b) < 0\) koji jamči da je nultočka \(\alpha \in [a, b]\), a koji smo imali u 1d-slučaju? Kako bi glasio analogni uvjet za 2d-slučaj i pravokutnik \([x_1, x_2] \times [y_1, y_2]\) (ili možda neki drugi ograničeni podskup od \(\R^2\), koji?)
Ako za točku \((x_\ast, y_\ast)\) utvrdimo npr. \(f(x_\ast, y_\ast) < 0\), kako nastaviti proces bisekcije? Nije moguće pronaći manji pravokutnik unutar kojeg se nalazi nultočka!
Ova pitanja se samo još dodatno kompliciraju u općoj situaciji sa \(n\) jednadžbi i \(n\) nepoznanica. S druge strane, Newtonovu metodu i metodu jednostavnih iteracija možemo poopćiti i na funkcije više varijabli.
Newtonova metoda#
Kao i u slučaju \(n=1\), Newtonovu metodu dobivamo linearizacijom funkcije \(f\). Pretpostavimo da u \(k\)-tom koraku imamo aproksimaciju \(x^{(k)} \in \R^n\) za nultočku funkcije \(f\). Promotrimo Taylorov razvoj \(i\)-te komponente funkcije \(f\) oko točke \(x^{(k)}\), te odbacimo sve članove nakon linearnih:
Ovdje smo označili
Prisjetimo se definicije Jacobijeve matrice:
Izraz (6.3) možemo kompaktno zapisati kao
Kao i u slučaju nelinearnih jednadžbi s jednom nepoznanicom, novu aproksimaciju \(x^{(k+1)}\) dobivamo iz zahtjeva da je desna strane gornje približne jednakosti jednaka nuli jer tada očekujemo \(f(x^{(k+1)}) \approx 0\):
Stavimo \(d^{(k)} := x^{(k+1)} - x^{(k)}\). Ako je \(J_f(x^{(k)})\) regularna matrica, onda je \(d^{(k)}\) jedinstveno rješenje sustava linearnih jednadžbi
Slijedi da za iduću iteraciju u Newtonovoj metodi vrijedi
Uočimo da je dobivena formula zaista poopćenje „skalarne” Newtonove metode kod koje smo imali
jer se u slučaju \(n=1\) Jacobijeva matrica \(J_f(x^{(k)})\) podudara s derivacijom \(f'(x^{(k)})\).
Upozorenje
Kod implementacije Newtonove metode na računalu, sljedeću iteraciju ne računamo direktnim korištenjem formule (6.5), odnosno, ne računamo inverz Jacobijeve matrice.
Umjesto računanja inverza matrice (što se uvijek izbjegava), rješavamo sustav linearnih jednadžbi (6.4) i onda pomoću dobivene korekcije \(d^{(k)}\) računamo sljedeću iteraciju:
Slijedi jednostavna implementacija Newtonove metode, koju zaustavljamo nakon k_max
iteracija ili kada niz iteracija postane „dovoljno stacionaran”, tj. kada vrijedi
Ovaj kriterij zaustavljanja podsjeća na kriterij \(|x^{(k+1)} - x^{(k)}| \leq \sqrt{\frac{2m_1}{M_2} \eps}\) koji smo imali kod skalarne Newtonove metode no nećemo ga ovdje detaljnije diskutirati.
import numpy as np;
import numpy.linalg as nla;
def newton_sustav( f, Jf, x0, k_max, eps ):
# Ulaz:
# - f = funkcija čiju nultočku tražimo.
# - Jf = funkcija koja vraća Jacobijevu matricu od f u danoj točki.
# - x0 = početna iteracija
# - k_max = broj iteracija Newtonove metode
# Izlaz:
# - x = aproksimacija nultočke od f dobivena nakon k_max iteracija Newtonove metode
# ili nakon što niz postane stacionaran.
# - hist = polje svih izračunatih iteracija (treba samo za tablični prikaz kasnije).
x = x0; hist = [x0];
for k in range( 0, k_max ):
xk = x;
# Riješimo linearni sustav Jf(x_k)*d = -f(x_k).
dk = nla.solve( Jf(xk), -f(xk) );
# Iduća Newtonova iteracija = korekcija prethodne iteracije.
x = xk + dk;
# Spremi novu iteraciju u hist.
hist.append( x );
# Provjeri je li niz postao "dovoljno stacionaran".
if( np.max( np.abs( dk ) / np.abs( xk ) ) < eps ):
break;
return (x, hist);
Rezultati o lokalnoj konvergenciji kao i o brzini konvergencije Newtonove metode su posve analogni rezultatima koje smo izveli u skalarnom slučaju.
Neka je \(\alpha\) nultočka funkcije \(f : \R^n \to \R^n\). Pretpostavimo da je \(f\) klase \(C^2\) u nekoj okolini od \(\alpha\) i da je \(J_f(\alpha)\) regularna matrica.
Tada postoji okolina nultočke \(\alpha\) takva da:
Za svaku početnu iteraciju \(x^{(0)}\) iz te okoline, niz iteracija generiran Newtonovom metodom konvergira prema \(\alpha\).
Konvergencija je barem kvadratna, tj. vrijedi
\[ \|\alpha - x^{{(k+1)}}\| \in \bigO\left( \|\alpha - x^{(k)}\|^2 \right). \]
Dokaz je posve analogan onom u skalarnom slučaju, no treba obratiti pažnju na neke detalje koji postaju netrivijalni jer se umjesto skalara pojavljuju matrice. Skica dokaza:
Taylorova formula u višedimenzionalnom slučaju se može zapisati kao
\[ f(x) = f(x^{(k)}) + J_f(x^{(k)}) \cdot (x - x^{(k)}) + R(x, x^{(k)}), \]gdje je
\[\begin{split} \begin{align*} \|R(x, x^{(k)})\| &\leq \frac{M_2}{2} \|x - x^{(k)}\|^2, \\ \sum_{i, j, k} |\frac{\partial f_k}{\partial x_i \partial x_j}(z)|^2 &\leq M_2, \text{ za sve } \|z - x^{(k)}\| \leq \|x - x^{(k)}\|. \end{align*}\end{split}\]Ako je \(J_f(\alpha)\) regularna, onda postoji \(\eps > 0\) takav da je \(J_f(x)\) regularna za svaki \(\|x - \alpha\| < \eps\). To slijedi zato što je \(J_f\) klase \(C^1\), pa je onda i Lipschitzova upravo s konstantom \(M_2\). Stavimo \(\eps = \sigma_n / (2M_2)\), gdje je \(\sigma_n > 0\) najmanja singularna vrijednost od \(J_f(\alpha)\). Tada je \(\|J_f(x) - J_f(\alpha)\| \leq M_2 \|x - \alpha\| \leq \sigma_n/2\). Slijedi da je \(J_f(x)\) punog ranga, tj. regularna, jer u protivnom imamo kontradikciju s Teoremom 4.11 (Eckart, Young, Mirsky).
Štoviše, može se pokazati da iz \(\|J_f(x) - J_f(\alpha)\| \leq \sigma_n/2\) slijedi \(\|J_f(x)^{-1}\| \leq \frac{2}{\sigma_n} = 2 \|J_f(\alpha)^{-1}\|\).
Stoga je \(x^{(k+1)}\) dobro definiran i zbog \(f(\alpha) = 0\) imamo:
iz čega izvodimo ocjenu
Dakle, ako metoda konvergira, onda je konvergencija kvadratična. No metoda konvergira jer gornju nejednakost možemo nastaviti ovako:
pa niz \(x^{(k)}\) konvergira prema \(\alpha\).
Uvjet o regularnosti matrice \(J_f(\alpha)\) iz gornjeg teorema za \(n=1\) glasi \(f'(\alpha) \neq 0\), odnosno, to je poopćenje uvjeta da je \(f\) jednostruka nultočka.
Primjer#
Riješimo sljedeći sustav nelinearnih jednadžbi:
Dakle, funkcija \(f\) i njezina Jacobijeva matrica su dani formulama
Koristimo Newtonovu metodu s početnom točkom \(x^{(0)} = (1, 2)\).
Show code cell source
def tablica_newton_sustav( x, f ):
n = len(x);
print( ' k x_1 x_2 ||f(x)|| ' );
print( '------------------------------------------------------------' );
for k in range( 0, n ):
print( f'{k:2d} {x[k][0]:.12f} {x[k][1]:.12f} {nla.norm( f(x[k]) ):20.14f}' );
def f(x):
# Izračunavamo i vraćamo vrijednost funkcije f u točki x.
x1 = x[0]; x2 = x[1];
fx = np.array( [
x1**6 - 5*(x1**2)*(x2**2) + 136,
x2**4 - 3*(x1**4)*x2 + 80
] );
return fx;
def Jf(x):
# Izračunavamo i vraćamo vrijednost Jacobijeve matrice funkcije f u točki x.
x1 = x[0]; x2 = x[1];
Jfx = np.array( [
[ 6*x1**5 - 10*x1*(x2**2), -10*(x1**2)*x2 ],
[ -12*(x1**3)*x2, 4*(x2**3) - 3*(x1**4) ]
] );
return Jfx;
x0 = np.array( [1, 2] );
# Iteracije zaustavljamo nakon max 20 koraka
# ili ako niz postane "stacionaran" uz toleranciju 2.22*10^(-16).
(x, hist) = newton_sustav( f, Jf, x0, 20, 2.22e-16 );
tablica_newton_sustav( hist, f );
k x_1 x_2 ||f(x)||
------------------------------------------------------------
0 1.000000000000 2.000000000000 147.61097520171052
1 4.542291950887 1.828103683492 8863.03030110632790
2 3.775877835532 1.294999404577 2999.01253720699560
3 3.123284551508 1.027257121946 1034.76915095180448
4 2.545619794677 1.044378193958 376.16882189724976
5 1.995630009701 1.565902932840 150.77807034073686
6 1.697787817020 3.303311264075 116.76086717144095
7 2.073054677756 2.934926464100 31.42852345303919
8 2.081716791664 3.178510792324 3.36156552196635
9 2.088346798860 3.168604854290 0.01691824302317
10 2.088378995687 3.168732957947 0.00000071691863
11 2.088378995521 3.168732953137 0.00000000000011
12 2.088378995521 3.168732953137 0.00000000000004
Vidimo da je Newtonova metoda stala nakon \(12\) iteracija s vrlo točnom aproksimacijom \(x_1 \approx 2.088378995521\), \(x_2 \approx 3.168732953137\); kada uvrstimo ove aproksimacije u sustav onda je desna strana u svakoj od jednadžbi po modulu manja od \(4 \cdot 10^{-14}\).
Napomena
Ako sustav ima mnogo nepoznanica ili je funkcija \(f\) vrlo složena, računanje Jacobijeve matrice može biti računski vrlo zahtjevno. Zbog toga su osmišljene tzv. kvazi-Newtonove metode koje u svakom koraku rade aproksimaciju Jacobijeve matrice. Pokažimo samo neke osnovne ideje jedne ovakve metode. Na primjer, Broydenova metoda umjesto rješavanja sustava
u svakom koraku korekciju \(d^{(k)}\) računa tako da rješava sustav
gdje je \(Q^{(k)} \approx J_f(x^{(k)})\) aproksimacija Jacobijeve matrice. Kako su elementi Jacobijeve matrice parcijalne derivacije funkcija \(f_i\), možemo ih aproksimirati podijeljenim razlikama. Drugim riječima, matricu \(Q^{(k)}\) možemo odabrati tako da vrijedi
Uočite da ova jednakost ne određuje matricu \(Q^{(k)}\) jedinstveno, nego definira njezino ponašanje za samo jedan vektor. S ciljem da računanje bude što je moguće efikasnije, matrica \(Q^{(k)}\) se određuje tako da se pronađe korekcija ranga jedan matrice \(Q^{(k-1)}\) minimalne norme za koju vrijedi gornja jednakost. To vodi na sljedeću formulu (bez dokaza):
Uvjerite se da ovako definirana matrica \(Q^{(k)}\) zaista zadovoljava (6.7). Dodatno, s ovako definiranom \(Q^{(k)}\) moguće je izbjeći i rješavanje sustava (6.6) uz korištenje Sherman-Morrison-Woodburyjeve formule. Kao početna aproksimacija \(Q^{(0)}\) može se uzeti Jacobijeva matrica funkcije \(f\) u točki \(x^{(0)}\) ili neka njegova aproksimacija.
Metoda fiksne točke#
Kao i kod nelinearnih jednadžbi s jednom nepoznanicom, rješavanje sustava nelinearnih jednadžbi možemo reformulirati kao problem nalaženja fiksne točke \( \alpha\) neke funkcije \(\varphi : \R^n \to \R^n\). Ponovno, nakon odabira pogodne početne iteracije \(x^{(0)}\), promatramo niz \((x^{(k)})_k\) definiran sa
Kažemo da je gornji niz iteracija definiran metodom fiksne točke ili metodom jednostavnih iteracija.
Neka je \(\Omega \subseteq \R^n\). Preslikavanje \(\varphi : \Omega \to \R^n\) je kontrakcija ako postoji konstanta \(q < 1\) takva da je
za sve \(x, y \in \Omega\). Ovdje je \(\|\cdot\|\) neka vektorska norma.
Rezultate dobivene za metodu jednostavnih iteracija sada možemo poopćiti i na sustave. Kontrakcija ima jedinstvenu fiksnu točku ako preslikava zatvoreni skup \(\Omega\) u \(\Omega\).
Neka je \(\Omega \subseteq \R^n\) zatvoren skup, te \(\varphi : \Omega \to \R^n\) kontrakcija takva da je \(\varphi(\Omega) \subseteq \Omega\). Tada \(\varphi\) ima jedinstvenu fiksnu točku u \(\Omega\).
Dokaz je posve isti kao i u slučaju \(n=1\); provedite ga za vježbu. Isto vrijedi i za sljedeći teorem, gdje raniji uvjet \(|\varphi'(\alpha)| < 1\) prelazi u \(\|J_{\varphi}(\alpha)\| < 1\).
Pretpostavimo da funkcija \(\varphi : \Omega \to \R^n\) ima fiksnu točku \(\alpha\) u interioru od \(\Omega\), te da je \(\varphi\) klase \(C^1\) u nekoj okolini of \(\alpha\). Nadalje, pretpostavimo da za Jacobijevu matricu funkcije \(\varphi\) vrijedi
gdje je \(\|\cdot\|\) neka (bilo koja!) matrična norma.
Tada postoji okolina \(\hat{\Omega} \subseteq \Omega\) od \(\alpha\) takva da, za svaku \(x^{(0)} \in \hat{\Omega}\), sve iteracije \(x^{(k)}\) generirane metodom fiksne točke leže u \(\Omega\) i konvergiraju ka \(\alpha\).
Promotrimo nelinearnih sustav jednadžbi
Ovaj sustav je lako egzaktno riješiti; njegova rješenja su \(\alpha_1 = \mb{c} 0 \\ 1 \me\) i \(\alpha_2 = \mb{c} 4/5 \\ -3/5 \me\). Definirajmo dvije iteracijske funkcije \(\varphi_{1, 2} : \R^2 \to \R^2\) sa
Lako se provjeri da je \(\varphi_1 (\alpha_1) = \alpha_1\) i \(\varphi_2(\alpha_2) = \alpha_2\). Pripadne Jacobijeve matrice su
pa uvrštavanjem \(\alpha_1\) i \(\alpha_2\) imamo
Vidimo da je \(\|J_{\varphi_1}(\alpha_1)\|_1 = \frac{1}{2}\), pa će metoda fiksne točke konvergirati za početnu točku u okolini od \(\alpha_1\).
S druge strane, \(\|J_{\varphi_2}(\alpha_2)\|_1 = \|J_{\varphi_2}(\alpha_2)\|_{\infty} = \|J_{\varphi_2}(\alpha_2)\|_2 = \frac{4}{3} \geq 1\), pa se čini da metoda fiksne točke neće konvergirati ka \(\alpha_2\). Međutim, može se pokazati da je uvjet iz teorema o konvergenciji ekvivalentan zahtjevu
gdje je sa
označen spektralni radijus matrice \(A\). Svojstvene vrijednosti matrice \(J_{\varphi_2}(\alpha_2)\) su \(i \sqrt{2/3}\) i \(-i\sqrt{2/3}\), pa je \(\rho(J_{\varphi_2}(\alpha_2)) = \sqrt{2/3}\) i metoda fiksne točke će konvergirati! Dakle, postoji neka matrična norma takva da je \(\|J_{\varphi_2}(\alpha_2)\| < 1\), no to nije ni \(1\) ni \(2\) ni \(\infty\) norma.
Metoda fiksne točke za linearne sustave
Metodom fiksne točke smo ranije već rješavali sustave linearnih jednadžbi: kako bismo odredili rješenje sustava \(Ax = b\), proučavali smo iterativne metode oblika
U Propoziciji 2.26 smo pokazali da takva iterativna metoda konvergira ako je \(\|B\| < 1\) za bilo koju operatorsku matričnu normu. Iskazali smo i Teorem 2.29 koji kaže da to vrijedi ako i samo ako je \(\rho(B) < 1\), gdje je \(\rho(B)\) spektralni radijus matrice \(B\).
Označimo \(\varphi(x) = B x + c\). Promotrimo sada rješenje linearnog sustava kao fiksnu točku funkcije \(\varphi\). Jacobijeva matrica ove funkcije je \(J_\varphi(x) = B\), pa vidimo da je Propozicija 2.26 specijalni slučaj Teorema 6.21. Slično, zaključak o spektralnom radijusu matrice \(J_\varphi(\alpha)\) iz gornjeg primjera poopćava raniji rezultat za sustave linearnih jednadžbi.
Implementirajmo metodu fiksne točke u Pythonu i uvjerimo se da u gornjem primjeru zaista imamo konvergenciju prema nultočki \(\alpha_2\).
def metoda_fiksne_tocke( phi, x0, k_max, eps ):
# Ulaz:
# - phi = funkcija čiju fiksnu točku tražimo.
# - x0 = početna iteracija
# - k_max = broj iteracija metode fiksne točke
# Izlaz:
# - x = aproksimacija nultočke od f dobivena nakon k_max iteracija metode fiksne točke
# ili nakon što niz postane stacionaran.
# - hist = polje svih izračunatih iteracija (treba samo za tablični prikaz kasnije).
x = x0; hist = [x0];
for k in range( 0, k_max ):
xk = x;
# Iduća iteracija.
x = phi(xk);
# Spremi novu iteraciju u hist.
hist.append( x );
# Provjeri je li niz postao "dovoljno stacionaran".
if( np.max( np.abs( x - xk ) / np.abs( xk ) ) < eps ):
break;
return (x, hist);
# Primjer: Nađimo nultočku alpha2.
# Ona je fiksna točka funkcije phi2.
def phi2( x ):
x1 = x[0]; x2 = x[1];
phi2_x = np.array(
[
(1-x2)/2,
-np.sqrt( 1 - x1**2 )
] );
return phi2_x;
# Odredimo nultočku alpha2.
# Početna iteracija = (0.9, 0.9).
# Stajemo nakon max 150 iteracija ili kad je relativna promjena <10^(-10).
x0 = np.array( [0.9, 0.9] )
(x, hist) = metoda_fiksne_tocke( phi2, x0, 150, 1e-10 );
# Potrebno je puno iteracija pa ćemo samo ispisati zadnju.
print( f'Metoda je zaustavljena nakon {len(hist)} iteracija.' );
print( f'Aproksimacija nultočke alpha2: x = ({x[0]:.10f}, {x[1]:.10f})' );
Metoda je zaustavljena nakon 118 iteracija.
Aproksimacija nultočke alpha2: x = (0.8000000000, -0.6000000000)
Na kraju ove cjeline samo spomenimo da se Newtonova metoda kojom rješavamo nelinearni sustav \(f(x) = 0\) ponovno može protumačiti kao metoda fiksne točke za funkciju iteracije
na temelju čega se može analizirati konvergencija Newtonove metode i u slučaju nelinearnih sustava.