import platform
platform.platform()
platform.python_version()
import numpy as np
import numpy.linalg as LA
np.__version__
import sympy as sp
sp.__version__
sp.init_printing()
U datoteci MMZI.py implementirane su funkcije matrica_prijelaza, operator_kan, operator_kanbaza i operator_baza koje ubrzavaju pronalaženje matrice linearnog operatora u zadanom paru baza.
Prve dvije naredbe su potrebne da python traži modul i u roditeljskom direktoriju od tekućeg direktorija. Ovisno o tome gdje se MMZI.py datoteka nalazi, po potrebi treba modificirati drugi redak u donjoj ćeliji. Ako je MMZI.py datoteka u tekućem direktoriju ili na nekoj stazi koju python "poznaje", onda prve dvije naredbe nisu uopće potrebne.
import sys
sys.path.append("..")
import MMZI
Nećemo opisivati navedene funkcije jer postoje napisane kratke informacije o njima unutar samih implementacija. U nastavku su prikazana tri načina dobivanja tih informacija. Naravno, uvijek možete i direktno otvoriti MMZI.py datoteku i pogledati help koji se nalazi unutar samog koda.
help(MMZI.operator_baza)
print(MMZI.operator_baza.__doc__)
MMZI.operator_baza?
Pokazano je na nekoliko zadataka kako ih brzo riješiti pomoću dostupnih naredbi iz numpy i sympy modula i pomoćnih funkcija iz datoteke MMZI.py.
Zadan je linearni operator $h:M_2(\mathbb{R})\to\mathbb{R}^2$ s $h\left(\left[\begin{smallmatrix}a&b\\ c&d\end{smallmatrix}\right]\right)=\big(a+d,\,a-b+c\big).$
formula = lambda a,b,c,d:(a+d,a-b+c)
A=[(6,4,8,-2),(4,-6,9,-6),(9,-6,-4,-1),(2,-4,-8,8)]
B=[(3,4),(-1,7)]
Hkan=MMZI.operator_kan(formula,klasa='sympy')
Hkan
H=MMZI.operator_kanbaza(formula,A,B,'sympy')
H
MMZI.operator_kanbaza(Hkan,A,B,'sympy')
sp.N(H)
Jedna baza za jezgru
$\mathcal{B}_{\mathop{Ker}{h}}=\left\{\left[\begin{smallmatrix}0&1\\ 1&0\end{smallmatrix}\right],\left[\begin{smallmatrix}-1&-1\\ 0&1\end{smallmatrix}\right]\right\}$
jezgraH=Hkan.nullspace()
jezgraH
defekt: $d(h)=2$
len(jezgraH)
Jedna baza za sliku: prva dva stupca iz matrice Hkan
$\mathcal{B}_{\mathop{Im}{h}}=\{(1,1),(0,-1)\}$
Hkan.rref()
Hkan.columnspace()
rang: $r(h)=2$
Hkan.rank()
Možemo koristiti i matricu $H$. No, u tom slučaju dobivene rezultate moramo interpretirati kao koordinate pripadnih vektora u bazama $\mathcal{A}$ i $\mathcal{B}$ jer je $H$ matrica operatora u paru baza $(\mathcal{A},\mathcal{B}).$
Dobiveni vektori baze za jezgru operatora $h$ dani su svojim koordinatama u bazi $\mathcal{A}.$
H.nullspace()
Pronađimo njihove koordinate u kanonskoj bazi.
Akan=[(1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)]
T=MMZI.matrica_prijelaza(Akan,A)
T
u1=T*sp.Matrix([sp.Rational(-29,16),sp.Rational(3,8),1,0])
u1
u2=T*sp.Matrix([sp.Rational(-31,16),sp.Rational(9,8),0,1])
u2
Matrice $\begin{bmatrix}- \frac{3}{8}&-\frac{31}{2}\\ -\frac{121}{8}&\frac{3}{8}\end{bmatrix}$ i $\begin{bmatrix}-\frac{41}{8}&-\frac{37}{2}\\ -\frac{107}{8}&\frac{41}{8}\end{bmatrix}$ također čine bazu za jezgru operatora $h$.
M=sp.Matrix([list(jezgraH[0]),list(jezgraH[1]),list(u1),list(u2)]).T
M
M.rref()
Dobiveni vektori baze za sliku operatora $h$ dani su svojim koordinatama u bazi $\mathcal{B}.$
H.columnspace()
Pronađimo njihove koordinate u kanonskoj bazi.
Bkan=[(1,0),(0,1)]
T2=MMZI.matrica_prijelaza(Bkan,B)
T2
v1=T2*sp.Matrix([sp.Rational(38,25),sp.Rational(14,25)])
v1
v2=T2*sp.Matrix([sp.Rational(1,5),sp.Rational(13,5)])
v2
Hkan=MMZI.operator_kan(formula,klasa='numpy')
Hkan
MMZI.operator_kanbaza(formula,A,B,'numpy')
MMZI.operator_kanbaza(Hkan,A,B,'numpy')
Numeričkim putem se također može doći do neke baze za jezgru i sliku linearnog operatora, ali ovdje nećemo dublje ulaziti u numeričku matematiku pa ćemo samo odrediti rang i defekt.
rang=LA.matrix_rank(Hkan)
rang
Iz teorema o rangu i defektu odredimo defekt.
Hkan.shape
defekt=Hkan.shape[1]-rang
defekt
Zadana je matrica $A=\begin{bmatrix}4&1&-1\\ 2&5&-2\\ 1&1&2\end{bmatrix}$.
A=sp.Matrix([[4,1,-1],[2,5,-2],[1,1,2]])
t=sp.Symbol('t')
pol=A.charpoly(t)
pol
pol.as_expr()
Svojstvene vrijednosti su 3 i 5, a njihove algebarske kratnosti su redom 2 i 1.
A.eigenvals()
$\mathcal{B}_{S(3)}=\{(-1,1,0),(1,0,1)\}$, $\mathcal{B}_{S(5)}=\{(1,2,1)\}$
A.eigenvects()
pol.as_expr().factor()
minimalni polinom: $m_A(\lambda)=(\lambda-5)(\lambda-3)$
(A-5*sp.eye(3))*(A-3*sp.eye(3))
Odredite spektar matrice
$$D=\begin{bmatrix}9&-7&6&7&1\\ 7&-9&-8&1&-4\\ 1&2&-8&2&-1\\ -3&4&-6&-1&-8\\ -1&7&3&0&-5\end{bmatrix}.$$D=sp.Matrix([[9,-7,6,7,1],[7,-9,-8,1,-4],[1,2,-8,2,-1],[-3,4,-6,-1,-8],[-1,7,3,0,-5]])
Pomoću sympy modula ne dobivamo svojstvene vrijednosti jer se one ne mogu egzaktno odrediti.
D.eigenvals()
Karakteristični polinom ima stupanj 5.
pol=D.charpoly(t)
pol.as_expr()
Nultočke polinoma petog stupnja se općenito ne mogu egzaktno odrediti.
sp.solve(pol,t)
Možemo nultočke (svojstvene vrijednosti) odrediti numeričkim putem.
sv=sp.nroots(pol)
sv
Matrica $D$ ima samo jednu realnu svojstvenu vrijednost.
list(filter(lambda x:x.as_real_imag()[1]==0, sv))
Pomoću numpy modula možemo također dobiti svojstvene vrijednosti numeričkim putem. U detalje numeričkih metoda za traženje svojstvenih vrijednosti kvadratne matrice ovdje nećemo ulaziti. Koristit ćemo gotove numpy naredbe.
D=np.array([[9,-7,6,7,1],[7,-9,-8,1,-4],[1,2,-8,2,-1],[-3,4,-6,-1,-8],[-1,7,3,0,-5]])
Na izlazu se vraća uređeni par. Prvi element uređenog para je jednodimenzionalno polje sa svojstvenim vrijednostima. Drugi element uređenog para je dvodimenzionalno polje (matrica) čiji stupci su svojstveni vektori. $i$-ti stupac je svojstveni vektor pridružen svojstvenoj vrijednosti na $i$-tom mjestu u jednodimenzionalnom polju.
LA.eig(D)
Ako želimo samo svojstvene vrijednosti
sv=LA.eig(D)[0]
sv
LA.eigvals(D)
Matrica $D$ ima samo jednu realnu svojstvenu vrijednost.
resv=np.extract(sv.imag==0, sv)
resv
Ako želimo samo svojstvene vektore
vek=LA.eig(D)[1]
vek
Svojstveni vektor pridružen realnoj svojstenoj vrijednosti pripada stupcu s indeksom 4 jer se realna svojstvena vrijednosti nalazi u pripadnom jednodimenzionalnom polju na poziciji s indeksom 4.
vek[:,4]
Možemo maknuti 0.j ako nas smeta takav zapis kod vektora i realne svojstvene vrijednosti.
only_real=lambda x: x.real
vector_real = np.vectorize(only_real)
vector_real(vek[:,4])
vector_real(resv)
Postoji li linearni operator $f:\mathbb{R}^3\to\mathbb{R}^2$ za kojeg vrijedi $$f(1,0,0)=(1,0),\quad f(0,1,0)=(1,3),\quad f(1,1,1)=(2,4)?$$ Ako postoji, odredite u tom slučaju $f(0,0,1)$ i njegovu matricu u paru kanonskih baza.
Matrica $B$ ima maksimalni rang pa je skup $\mathcal{B}=\{(1,0,0),(0,1,0),(1,1,1)\}$ jedna baza za $\mathbb{R}^3.$ Stoga postoji jedinstveni linearni operator koji zadovoljava zadane uvjete.
B=np.array([(1,0,0),(0,1,0),(1,1,1)])
B
LA.matrix_rank(B)
B=[(1,0,0),(0,1,0),(1,1,1)]
Bkan=[(1,0,0),(0,1,0),(0,0,1)]
Akan=[(1,0),(0,1)]
Matrica operatora $f$ u paru baza $\mathcal{B}=\{(1,0,0),(0,1,0),(1,1,1)\}$ i $\mathcal{A}_{\mathrm{kan}}=\{(1,0),(0,1)\}$
F1=np.array([[1,0],[1,3],[2,4]])
F1=np.transpose(F1)
F1
Matrica operatora $f$ u paru kanonskih baza $\mathcal{B}_{\mathrm{kan}}=\{(1,0,0),(0,1,0),(0,0,1)\}$ i $\mathcal{A}_{\mathrm{kan}}=\{(1,0),(0,1)\}$
F2=MMZI.operator_baza(F1, bazaD1=B, bazaD2=Bkan, bazaK1=Akan, bazaK2=Akan, klasa='numpy')
F2
$f(0,0,1)=(0,1)$
v=np.array([0,0,1])
np.matmul(F2,v)
Zadan je linearni operator $h:\mathbb{R}^3\rightarrow\mathcal{P}_4(t)$ s $g(a,b,c)=(a-b)t^3+2ct^2+(b+3c)t+a+b+c.$
Zadatak istovremeno rješavamo pomoću sympy i numpy modula.
fun=lambda a,b,c:(a+b+c,b+3*c,2*c,a-b)
A=[(1,0,0),(0,1,0),(0,0,1)]
B=[(1,2,0,0),(1,0,-1,0),(1,0,0,1),(0,1,1,0)]
Hsp=MMZI.operator_kanbaza(fun,A,B,'sympy')
Hsp
Hnp=MMZI.operator_kanbaza(fun,A,B,'numpy')
Hnp
Drugi stupac matrice $H$
Hsp[:,1]
Hnp[:,1]
Suma svih elemenata drugog stupca matrice $H$
sum(Hsp[:,1])
sum(Hnp[:,1])
Treći redak matrice $H$
Hsp[2,:]
Hnp[2,:]
Suma svih elemenata trećeg retka matrice $H$
sum(Hsp[2,:])
sum(Hnp[2,:])
Rang operatora $h$
Hsp.rank()
LA.matrix_rank(Hnp)
Defekt operatora $h$
Hsp.shape[1]-Hsp.rank()
Hnp.shape[1]-LA.matrix_rank(Hnp)