četvrtak, 18 aprila, 2024
Kako da...?

Numerička obrada i simulacije (5. deo)

Autor: Stefan Nožinić

U prethodnom delu smo objasnili operacije sa vektorima i njihovu upotrebu u našem razvojnom okruženju. Biblioteka Numpaj (eng. NumPy) koju koristimo, pored ovih osnovnih operacija, poseduje i mnogo složenije operacije i funkcije koje nam mogu pomoći. Složićete se da su operacije sa vektorima trivijalne za implementaciju i da nam ne treba biblioteka za tako nešto. Postoji više razloga zašto je važno koristiti svu funkcionalnost koju nam nudi biblioteka Numpaj. Jedan od njih je jednostavnost, a drugi je brzina. Naime, Pajton jako sporo izvršava for cikluse i jedini način da se to ubrza jeste da se data funkcija implementira u programskom jeziku C, a to je upravo ono što Numpaj radi.

Linearni sistemi jednačina

Jedan od osnovnih metoda koji ćemo koristiti u našim primerima se svodi na rešavanje linearnih jednačina. Možda su vam one delovale nepraktično dok ste ih obrađivali tokom formalnog obrazovanja, ali, verujte nam, one su ključne za numeričku obradu podataka.

Mnoge druge jednačine se aproksimiraju na linearne i tako rešavaju. Razlog za ovo je jednostavnost rešavanja linearnih jednačina.

Ove jednačine su oblika $$ Ax = b $$ gde je A matrica sa koeficijentima, x je nepoznati vektor, a b je desna strana jednačine (vektor).

Rešenje ove jednačine se može zapisati kao $$ x = A^{-1}b $$ što znači da je vektor sa desne strane pomnožen inverznom matricom matrice koeficijenata. Iako Numpaj poseduje metod za izračunavanje inverzne matrice, treba naglasiti da je to izračunavanje suvišno i da oduzima vreme. Sistem linearnih jednačina se može rešiti Gausovom eliminacijom i to je upravo ono što nam Numpaj omogućava pozivom samo jedne metode.

Evo kako bi to izgledalo u kodu:

>>> import numpy as np >>> import numpy.linalg as la >>> A = np.array([[1, 1], [1, -1]]) >>> A array([[ 1,  1], [ 1, -1]]) >>> b = np.array([4, 2]) >>> x = la.solve(A, b) >>> x array([ 3.,  1.]) >>> A.dot(x) array([ 4.,  2.])

Dakle, pozivom solve funkcije, rešavamo sistem u jednoj liniji koda. Ovo je brz i jednostavan način da se reši sistem linearnih jednačina.

Ako nam zatreba inverzna matrica, to možemo lako izračunati:

>>> A_inverse = la.inv(A) >>> A_inverse array([[ 0.5,  0.5], [ 0.5, -0.5]])

Aproksimacija funkcija

Druga korisna stvar koju nudi ovaj modul jeste aproksimacija funkcija. Zamislimo da imamo nekoliko tačaka i da želimo da pronađemo funkciju $$ f(x) = ax^2 + b $$ tako da zbir kvadrata grešaka bude minimalan, odnosno da nađemo koeficijente za ovu funkciju tako da ona što bolje opisuje date tačke. Ovo možemo uraditi metodom najmanjih kvadrata. Naime, ako napravimo matricu gde svaki red predstavlja tačku a svaka kolona dati sabirak bez koeficijenta, možemo iskoristiti Numpaj metod za aproksimaciju funkcije koji će nam vratiti potrebne koeficijente. Na primer, ako želimo da aproksimiramo funkcije $$ f(x) = ax^2 + b $$ sa tačkama (2, 5), (3, 10) i (4, 17), to možemo uraditi ovako:

>>> A = np.array([[4, 1], [9, 1], [16, 1]]) >>> A array([[ 4,  1], [ 9,  1], [16,  1]]) >>> y = np.array([5, 10, 17]) >>> k, r, rank, s = la.lstsq(A, y) >>> k array([ 1.,  1.])

Potrebno je primetiti da smo namerno dali tačke koje prolaze kroz funkciju $$ f(x) = x^2 + 1 $$, međutim, to ne mora da bude ispunjeno uvek:

>>> y = np.array([4, 7, 16]) >>> k, r, rank, s = la.lstsq(A, y) >>> k array([ 1.01834862, -0.8440367 ])

Ostale funkcije modula za linearnu algebru

Takozvani „linalg” je podmodul biblioteke Numpaj i sadrži dosta funkcija koje nam mogu pomoći u daljem radu. Tu se, između ostalog nalaze funkcije za dekompoziciju na svojstvene vrednosti i svojstvene vektore, razne norme i izračunavanje kondicionih brojeva. Predlažemo da pogledate dokumentaciju za ovaj modul ako vas zanima detaljno koje su vam sve funkcije na raspolaganju.

Šta sledi?

U narednom broju ćemo napraviti neke grafike na ekranu, da prikažemo ono što smo naučili i da to vizuelno dočaramo.