2-4-Linearna_algebra-S
system:sage


<p><span style="font-size: xx-small;">K. Kumerički, verzija 1.1, 2011-10-25</span></p>
<h2>Linearna algebra</h2>
<p>O nizovima objekata (brojeva, simbola, ...) biti će vi&scaron;e govora u slijedećem poglavlju, a ovdje nam treba samo nekoliko osnovnih ideja. Često ćemo sretati dvije vrste nizova objekata: <em>liste</em> (engl. list) i <em>tuplove</em> (engl. tuple). Liste su nizovi elemenata odvojeni zarezom u uglatim zagradama, a tuplovi su to isto samo u okruglim zagradama. Razlike između liste i tupla će biti razja&scaron;njene kasnije; u ovom poglavlju će obje strukture funkcionirati bez razlika.</p>

{{{id=24|
a = [1,1,2]      # lista
b = (2, 2, 4)    # tupl
///
}}}

<p>Pristup pojedinim elementima se izvodi indeksom u uglatim zagradama (i za liste i za tuplove!), gdje je brojanje kao u C-u, tj. počinje od nule: prvi element liste a je a[0]:</p>

{{{id=54|
print a[2]
b[0]
///
}}}

<p>Ukoliko želimo napraviti pridruživanje gdje se vrijednosti uzimaju iz liste na slijedeći način je to moguće izvesti za cijelu listu odjednom. (Tzv. raspakiravanje.)</p>

{{{id=55|
b1, b2, b3 = b; b2
///
}}}

<p>Naravno, elementi listi mogu biti druge liste:</p>

{{{id=56|
c = [a, b, [a]]
avec, bvec, [cvec] = c; cvec    # ovo je korisno za donji zadatak sa svojstvenim vrijednostima matrice
///
}}}

<p>Vektori i matrice se konstruiraju pomoću funkcija vector() i matrix() kojima kao argument dajemo listu elemenata, odnosno listu listi elemenata (listu redak-vektora)</p>

{{{id=18|
vec1 = vector([1,1,2])
vec2 = vector(b)   # moze i tupl
///
}}}

<p>Množenje skalarom je prirodno:</p>

{{{id=66|
3*vec1
///
}}}

<p>Skalarni produkt vektora ...</p>

{{{id=21|
vec1.inner_product(vec2)
///
}}}

<p>... se može zapisivati kao i obično množenje:</p>

{{{id=19|
vec1*vec2
///
}}}

<p>Vektorski produkt (nema zapisa s $\times$!)</p>

{{{id=22|
vec1.cross_product(vec2)
///
}}}

<p>Norma ("duljina") vektora:</p>

{{{id=102|
vec2.norm()
///
}}}

<p>Svi vektori iste vrste i dimenzije su elementi apstraktnog vektorskog prostora koji je dostupan putem metode parent():</p>

{{{id=106|
vecspace=vec1.parent(); vecspace
///
}}}

<p>Ovdje je važno uočiti da je je prostor definiran na "prstenu" cijelih brojeva. Naravno, vektori mogu biti i nad drugim prstenovima/poljima:</p>

{{{id=107|
print vector([1/3, 1/4]).parent()
vector([1., 2.]).parent()
///
}}}

<p>Baza vektorskog prostora:</p>

{{{id=46|
vecspace.basis()
///
}}}

<p>Množenje matrica te množenje matrice i vektora ide na prirodan način:</p>

{{{id=20|
mat = matrix([[1, 2, 1], [4, 3, 3], [9, 1, 7]]); mat
///
}}}

{{{id=27|
mat*mat
///
}}}

{{{id=17|
mat*vec1
///
}}}

{{{id=29|
~mat      # inverz matrice, moze i m.inverse() ili m^-1
///
}}}

{{{id=1|
~mat*mat    # provjera
///
}}}

<p>Matrice isto imaju svoje apstraktne prostore kojima pripadaju:</p>

{{{id=45|
print mat.parent()
matinv.parent()
///
}}}

{{{id=47|
mat2 = matrix([[1., 2.], [3., 4.]])
print mat2.parent(); mat2
///
}}}

<p>Ovo defaultno polje realnih brojeva nije sasvim pogodno za numeričke račune pa je potrebno matrice s realnim koeficijentima kreirati uz eksplicitnu deklaraciju polja RDF&nbsp; ("real double field"):</p>

{{{id=48|
mat2 = matrix(RDF, [[1., 2.], [3., 4.]])
print mat2.parent(); mat2
///
}}}

<p>Pristup pojedinim elementima matrice se isto izvodi indeksiranjem:</p>

{{{id=30|
mat[0, 0] = 0; mat
///
}}}

<p><span id="cell_outer_21"><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-4</strong>.<strong>1</strong>: </span>Za datu matricu A <a href="http://en.wikipedia.org/wiki/Eigenvalue,_eigenvector_and_eigenspace">definiramo</a> svojstvene vektore (eigenvectors) ${\bf v}$ i njima pripadajuće svojstvene vrijednosti $\lambda$ (eigenvalues) kao rje&scaron;enja matrične jednadžbe</p>
<p>$$ A {\bf v} = \lambda {\bf v}\;.$$</p>
<p>Odredite svojstvene vrijednosti&nbsp; i svojstvene vektore&nbsp; matrice</p>
<p>$$ \left(\begin{array}{cc} 2.3 &amp; 4.5 \\ 6.7 &amp;-1.2 \end{array}\right) \;,$$</p>
<p>i provjerite da dobivena rje&scaron;enja zaista zadovoljavaju gornju jednadžbu.</p>


<p><span id="cell_outer_459"><span id="cell_outer_426"><span id="cell_outer_18"><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-4.2</strong><strong>: </strong></span></span></span>Kreirajte 3x3 matricu sa slučajnim realnim brojevima između 0 i 10. Invertirajte je i pomnožite s originalnom matricom te se uvjerite da dobijete jediničnu matricu.</p>

<p>Elementi vektora i matrica mogu biti i simboli:</p>

{{{id=136|
var('x y z')
///
}}}

{{{id=125|
vec3 = vector([x, y, z])
vec3.norm()
///
}}}

<p>Međutim, ukoliko poku&scaron;amo već stvorenom vektoru nad poljem nekih brojeva zamijeniti neki element simbolom, to ne ide:</p>

{{{id=123|
vec1[2] = x
///
}}}

<p>Riječ je o tome da su npr. čisto realni vektori (nad poljem RDF) interno reprezentirani kao C-polja radi optimizacije. Da bismo mogli napraviti ovo &scaron;to želimo trebamo prvo konvertirati vektor u simbolički vektor. Tu konverziju radi odgovarajući vektorski prostor nad simboličkim prstenom (SR, symbolic ring). Taj prostor dobijemo pomoću metode parent() vektora istog ranga, ali koji već jest simbolički. (Za detalje o takvim konverzijama vidi prvih par odjeljaka <a href="http://www.sagemath.org/doc/reference/coercion.html">ovdje</a>.)</p>

{{{id=126|
vec3.parent()
///
}}}

{{{id=127|
vec1_symb = vec3.parent()(vec1)  # konverzija vec1 u simbolicki vektor
///
}}}

{{{id=128|
vec1_symb[1] = x; vec1_symb    # sad ide
///
}}}

<p><span id="cell_outer_459"><span id="cell_outer_426"><span id="cell_outer_18"><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-4.3 (*)</strong><strong>: </strong></span></span></span>Isto kao zadatak 2-4.3, ali prije invertiranja matrice zamijenite njen sredi&scaron;nji element simbolom x. Nakon invertiranja i množenja uvrstite za x slučajni broj (random()) i uvjerite se da dobivate jediničnu matricu.</p>


<p>Dijagonalizacija matrice A&nbsp; je pronalaženje njenog rastava oblika</p>
<p>$$</p>
<p>A = P D P^{-1}</p>
<p>$$</p>
<p>gdje je $D$ dijagonalna matrica. To se izvodi metodom eigenmatrix_right() koja vraća matrice $P$ i $D$:</p>

{{{id=135|
A = matrix(QQ, [[3, 1], [1, 3]])  # metoda is_diagonalizable ne radi nad ZZ
print A.is_diagonalizable()
D, P = A.eigenmatrix_right(); (D, P)
///
}}}

{{{id=139|
A == P*D*(~P) # provjera
///
}}}

<p>Treba uočiti da su elementi dijagonalne matrice $D$ i&nbsp; stupci matrice $P$ upravo svojstvene vrijednosti odnosno svojstveni vektori od $A$.</p>

{{{id=150|
mat3.eigenvectors_right()
///
}}}

<p>Neke matrice nisu dijagonalizabilne, u slučaju čega će&nbsp; matrice $P$ i $D$ koje vraća eigenmatrix_right() i dalje zadovoljavati</p>
<p>$$</p>
<p>AP = PD</p>
<p>$$</p>
<p>ali $P$ neće biti invertibilna:</p>

{{{id=140|
A = matrix(QQ, [[1, 1], [0, 1]])
print A.is_diagonalizable()
D, P = A.eigenmatrix_right(); (D, P)
///
}}}

{{{id=144|
A*P == P*D
///
}}}

{{{id=152|
~P
///
}}}

<p>U takvim slučajevima od koristi može biti i vrlo popularni rastav na singularne vrijednosti (<a href="http://en.wikipedia.org/wiki/Singular_value_decomposition">singular value decomposition</a>, SVD):</p>
<p>$$</p>
<p>A = U S V^{\dagger}</p>
<p>$$</p>
<p>gdje su $U$ i $V$ unitarne, a $S$ dijagonalna matrica. &nbsp;(Jedino treba imati na umu da je odgovarajuća metoda SVD() trenutno implementirana samo za matrice nad realnim RDF poljem pa je po potrebi potrebno prvo provesti konverziju matrice.)</p>

{{{id=143|
U, S, V = matrix(RDF, A).SVD()
///
}}}

{{{id=147|
U*S*V.conjugate_transpose()
///
}}}

<p><span id="cell_outer_459"><span id="cell_outer_426"><span id="cell_outer_18"><span id="cell_outer_10"><span id="cell_outer_5">&diams; </span></span><strong>Zadatak 2-4.4</strong><strong>:&nbsp;</strong></span></span></span><span><span><span>Stupci matrice $U$ u SVD rastavu su svojstveni vektori matrice $A A^\dagger$, a odgovarajuće svojstvene vrijednosti su kvadrati elemenata dijagonale matrice $S$. Uvjerite se u to eksplicitno na gornjem primjeru.</span></span></span></p>


<h3>Literatura</h3>
<p>Robert A. Beezer, <a href="http://linear.ups.edu/sage-fcla.html">A First Course in Linear Algebra</a>, (Sage-enhanced textbook)</p>

{{{id=153|

///
}}}