Linearni operatori u pythonu

In [1]:
import platform
In [2]:
platform.platform()
Out[2]:
'Linux-5.4.143-1-MANJARO-x86_64-with-glibc2.33'
In [3]:
platform.python_version()
Out[3]:
'3.9.6'
In [4]:
import numpy as np
In [5]:
import numpy.linalg as LA
In [6]:
np.__version__
Out[6]:
'1.20.3'
In [7]:
import sympy as sp
In [8]:
sp.__version__
Out[8]:
'1.8'
In [9]:
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.

In [10]:
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.

In [11]:
help(MMZI.operator_baza)
Help on function operator_baza in module MMZI:

operator_baza(f, bazaD1, bazaD2, bazaK1=None, bazaK2=None, klasa='sympy')
    Ova funkcija je poopcenje funkcije operator_kanbaza. Ona daje
    matricni prikaz linearnog operatora f u paru baza (bazaD2,bazaK2)
    ako je on zadan u paru baza (bazaD1,bazaK1).
    Ako bazaK1 nije eksplicitno navedena, podrazumijeva se da je bazaK1=bazaD1.
    Ako bazaK2 nije eksplicitno navedena, podrazumijeva se da je bazaK2=bazaD2.
    
    Linearni operator f moze biti:
      * prethodno definiran kao funkcija u paru baza (bazaD1,bazaK1)
      * definiran na ulazu kao lambda funkcija u paru baza (bazaD1,bazaK1)
      * definiran svojim matricnim zapisom u paru baza (bazaD1,bazaK1), 
        pri cemu matrica mora pripadati klasi navedenoj u varijabli 'klasa'
    
    --- 1. PRIMJER ---
    
    Neka je [[2,0],[-1,0]] matrica operatora u paru baza {(1,1),(1,0)} i {(1,0),(0,1)}.
    Trazimo matricu tog operatora u bazi B={(1,0),(1,1)}.
    Dakle, u ovom slucaju je bazaD1={(1,1),(1,0)}, bazaD2=B, bazaK1={(1,0),(0,1)}, bazaK2=B.
    U ovom slucaju je bazaK2=bazaD2 pa ju nema potrebe dolje pisati na zadnjem mjestu.
    
    operator_baza(sp.Matrix([[2,0],[-1,0]]), [(1,1),(1,0)], [(1,0),(1,1)], [(1,0),(0,1)])
    operator_baza(np.array([[2,0],[-1,0]]), bazaD1=[(1,1),(1,0)], bazaD2=[(1,0),(1,1)], bazaK1=[(1,0),(0,1)], klasa='numpy')
    
    --- 2. PRIMJER ---
    
    Neka je [[1,0,2],[1,1,1],[1,0,1]] matrica linearnog operatora u bazi {(1,1,1),(1,2,1),(0,1,2)}.
    Trazimo matricu tog operatora u bazi {(1,0,1),(-1,0,1),(0,2,0)}.
    U ovom slucaju je bazaD1={(1,1,1),(1,2,1),(0,1,2)}, bazaD2={(1,0,1),(-1,0,1),(0,2,0)}, bazaK1=bazaD1, bazaK2=bazaD2.
    Kako je bazaK1=bazaD1, bazaK2=bazaD2, nema potrebe posebno pisati baze bazaK1, bazaK2 kod poziva funkcije.
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')
    
    Nije greska ako ih i posebno naglasimo.
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])
    
    ili da nam bude preglednije
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
                  bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
                  bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')

In [12]:
print(MMZI.operator_baza.__doc__)
 Ova funkcija je poopcenje funkcije operator_kanbaza. Ona daje
    matricni prikaz linearnog operatora f u paru baza (bazaD2,bazaK2)
    ako je on zadan u paru baza (bazaD1,bazaK1).
    Ako bazaK1 nije eksplicitno navedena, podrazumijeva se da je bazaK1=bazaD1.
    Ako bazaK2 nije eksplicitno navedena, podrazumijeva se da je bazaK2=bazaD2.
    
    Linearni operator f moze biti:
      * prethodno definiran kao funkcija u paru baza (bazaD1,bazaK1)
      * definiran na ulazu kao lambda funkcija u paru baza (bazaD1,bazaK1)
      * definiran svojim matricnim zapisom u paru baza (bazaD1,bazaK1), 
        pri cemu matrica mora pripadati klasi navedenoj u varijabli 'klasa'
    
    --- 1. PRIMJER ---
    
    Neka je [[2,0],[-1,0]] matrica operatora u paru baza {(1,1),(1,0)} i {(1,0),(0,1)}.
    Trazimo matricu tog operatora u bazi B={(1,0),(1,1)}.
    Dakle, u ovom slucaju je bazaD1={(1,1),(1,0)}, bazaD2=B, bazaK1={(1,0),(0,1)}, bazaK2=B.
    U ovom slucaju je bazaK2=bazaD2 pa ju nema potrebe dolje pisati na zadnjem mjestu.
    
    operator_baza(sp.Matrix([[2,0],[-1,0]]), [(1,1),(1,0)], [(1,0),(1,1)], [(1,0),(0,1)])
    operator_baza(np.array([[2,0],[-1,0]]), bazaD1=[(1,1),(1,0)], bazaD2=[(1,0),(1,1)], bazaK1=[(1,0),(0,1)], klasa='numpy')
    
    --- 2. PRIMJER ---
    
    Neka je [[1,0,2],[1,1,1],[1,0,1]] matrica linearnog operatora u bazi {(1,1,1),(1,2,1),(0,1,2)}.
    Trazimo matricu tog operatora u bazi {(1,0,1),(-1,0,1),(0,2,0)}.
    U ovom slucaju je bazaD1={(1,1,1),(1,2,1),(0,1,2)}, bazaD2={(1,0,1),(-1,0,1),(0,2,0)}, bazaK1=bazaD1, bazaK2=bazaD2.
    Kako je bazaK1=bazaD1, bazaK2=bazaD2, nema potrebe posebno pisati baze bazaK1, bazaK2 kod poziva funkcije.
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')
    
    Nije greska ako ih i posebno naglasimo.
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])
    
    ili da nam bude preglednije
    
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
                  bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)])
    operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
                  bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')
    
Ako želimo da se unutar jupyter notebooka help otvori u posebnom prozoru
In [13]:
MMZI.operator_baza?
Signature:
MMZI.operator_baza(
    f,
    bazaD1,
    bazaD2,
    bazaK1=None,
    bazaK2=None,
    klasa='sympy',
)
Docstring:
Ova funkcija je poopcenje funkcije operator_kanbaza. Ona daje
matricni prikaz linearnog operatora f u paru baza (bazaD2,bazaK2)
ako je on zadan u paru baza (bazaD1,bazaK1).
Ako bazaK1 nije eksplicitno navedena, podrazumijeva se da je bazaK1=bazaD1.
Ako bazaK2 nije eksplicitno navedena, podrazumijeva se da je bazaK2=bazaD2.

Linearni operator f moze biti:
  * prethodno definiran kao funkcija u paru baza (bazaD1,bazaK1)
  * definiran na ulazu kao lambda funkcija u paru baza (bazaD1,bazaK1)
  * definiran svojim matricnim zapisom u paru baza (bazaD1,bazaK1), 
    pri cemu matrica mora pripadati klasi navedenoj u varijabli 'klasa'

--- 1. PRIMJER ---

Neka je [[2,0],[-1,0]] matrica operatora u paru baza {(1,1),(1,0)} i {(1,0),(0,1)}.
Trazimo matricu tog operatora u bazi B={(1,0),(1,1)}.
Dakle, u ovom slucaju je bazaD1={(1,1),(1,0)}, bazaD2=B, bazaK1={(1,0),(0,1)}, bazaK2=B.
U ovom slucaju je bazaK2=bazaD2 pa ju nema potrebe dolje pisati na zadnjem mjestu.

operator_baza(sp.Matrix([[2,0],[-1,0]]), [(1,1),(1,0)], [(1,0),(1,1)], [(1,0),(0,1)])
operator_baza(np.array([[2,0],[-1,0]]), bazaD1=[(1,1),(1,0)], bazaD2=[(1,0),(1,1)], bazaK1=[(1,0),(0,1)], klasa='numpy')

--- 2. PRIMJER ---

Neka je [[1,0,2],[1,1,1],[1,0,1]] matrica linearnog operatora u bazi {(1,1,1),(1,2,1),(0,1,2)}.
Trazimo matricu tog operatora u bazi {(1,0,1),(-1,0,1),(0,2,0)}.
U ovom slucaju je bazaD1={(1,1,1),(1,2,1),(0,1,2)}, bazaD2={(1,0,1),(-1,0,1),(0,2,0)}, bazaK1=bazaD1, bazaK2=bazaD2.
Kako je bazaK1=bazaD1, bazaK2=bazaD2, nema potrebe posebno pisati baze bazaK1, bazaK2 kod poziva funkcije.

operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])
operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')

Nije greska ako ih i posebno naglasimo.

operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)], [(1,1,1),(1,2,1),(0,1,2)], [(1,0,1),(-1,0,1),(0,2,0)])

ili da nam bude preglednije

operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)])
operator_baza(sp.Matrix([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
              bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)])
operator_baza(np.array([[1,0,2],[1,1,1],[1,0,1]]), bazaD1=[(1,1,1),(1,2,1),(0,1,2)], bazaD2=[(1,0,1),(-1,0,1),(0,2,0)], 
              bazaK1=[(1,1,1),(1,2,1),(0,1,2)], bazaK2=[(1,0,1),(-1,0,1),(0,2,0)], klasa='numpy')
File:      ~/Documents/python/jupyter/MMZI.py
Type:      function

Zadaci

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.

1. zadatak

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).$

  1. Odredite matrični zapis operatora $h$ u paru kanonskih baza.
  2. Odredite matrični zapis operatora $h$ u paru baza $\mathcal{A}=\left\{\left[\begin{smallmatrix}6&4\\ 8&-2\end{smallmatrix}\right],\left[\begin{smallmatrix}4&-6\\ 9&-6\end{smallmatrix}\right],\left[\begin{smallmatrix}9&-6\\ -4&-1\end{smallmatrix}\right],\left[\begin{smallmatrix}2&-4\\ -8&8\end{smallmatrix}\right]\right\}$ i $\mathcal{B}=\{(3,4),(-1,7)\}.$
  3. Odredite jezgru, sliku, rang i defekt operatora $h.$

Rješenje

In [14]:
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)]

Pomoću sympy modula

a) dio

In [15]:
Hkan=MMZI.operator_kan(formula,klasa='sympy')
Hkan
Out[15]:
$\displaystyle \left[\begin{matrix}1 & 0 & 0 & 1\\1 & -1 & 1 & 0\end{matrix}\right]$

b) dio

In [16]:
H=MMZI.operator_kanbaza(formula,A,B,'sympy')
H
Out[16]:
$\displaystyle \left[\begin{matrix}\frac{38}{25} & \frac{1}{5} & \frac{67}{25} & \frac{68}{25}\\\frac{14}{25} & \frac{13}{5} & \frac{1}{25} & - \frac{46}{25}\end{matrix}\right]$
In [17]:
MMZI.operator_kanbaza(Hkan,A,B,'sympy')
Out[17]:
$\displaystyle \left[\begin{matrix}\frac{38}{25} & \frac{1}{5} & \frac{67}{25} & \frac{68}{25}\\\frac{14}{25} & \frac{13}{5} & \frac{1}{25} & - \frac{46}{25}\end{matrix}\right]$
In [18]:
sp.N(H)
Out[18]:
$\displaystyle \left[\begin{matrix}1.52 & 0.2 & 2.68 & 2.72\\0.56 & 2.6 & 0.04 & -1.84\end{matrix}\right]$

c) dio

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\}$

In [19]:
jezgraH=Hkan.nullspace()
jezgraH
Out[19]:
$\displaystyle \left[ \left[\begin{matrix}0\\1\\1\\0\end{matrix}\right], \ \left[\begin{matrix}-1\\-1\\0\\1\end{matrix}\right]\right]$

defekt: $d(h)=2$

In [20]:
len(jezgraH)
Out[20]:
$\displaystyle 2$

Jedna baza za sliku: prva dva stupca iz matrice Hkan

$\mathcal{B}_{\mathop{Im}{h}}=\{(1,1),(0,-1)\}$

In [21]:
Hkan.rref()
Out[21]:
$\displaystyle \left( \left[\begin{matrix}1 & 0 & 0 & 1\\0 & 1 & -1 & 1\end{matrix}\right], \ \left( 0, \ 1\right)\right)$
In [22]:
Hkan.columnspace()
Out[22]:
$\displaystyle \left[ \left[\begin{matrix}1\\1\end{matrix}\right], \ \left[\begin{matrix}0\\-1\end{matrix}\right]\right]$

rang: $r(h)=2$

In [23]:
Hkan.rank()
Out[23]:
$\displaystyle 2$

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}.$

In [24]:
H.nullspace()
Out[24]:
$\displaystyle \left[ \left[\begin{matrix}- \frac{29}{16}\\\frac{3}{8}\\1\\0\end{matrix}\right], \ \left[\begin{matrix}- \frac{31}{16}\\\frac{9}{8}\\0\\1\end{matrix}\right]\right]$

Pronađimo njihove koordinate u kanonskoj bazi.

In [25]:
Akan=[(1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)]
T=MMZI.matrica_prijelaza(Akan,A)
T
Out[25]:
$\displaystyle \left[\begin{matrix}6 & 4 & 9 & 2\\4 & -6 & -6 & -4\\8 & 9 & -4 & -8\\-2 & -6 & -1 & 8\end{matrix}\right]$
In [26]:
u1=T*sp.Matrix([sp.Rational(-29,16),sp.Rational(3,8),1,0])
u1
Out[26]:
$\displaystyle \left[\begin{matrix}- \frac{3}{8}\\- \frac{31}{2}\\- \frac{121}{8}\\\frac{3}{8}\end{matrix}\right]$
In [27]:
u2=T*sp.Matrix([sp.Rational(-31,16),sp.Rational(9,8),0,1])
u2
Out[27]:
$\displaystyle \left[\begin{matrix}- \frac{41}{8}\\- \frac{37}{2}\\- \frac{107}{8}\\\frac{41}{8}\end{matrix}\right]$

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$.

In [28]:
M=sp.Matrix([list(jezgraH[0]),list(jezgraH[1]),list(u1),list(u2)]).T
M
Out[28]:
$\displaystyle \left[\begin{matrix}0 & -1 & - \frac{3}{8} & - \frac{41}{8}\\1 & -1 & - \frac{31}{2} & - \frac{37}{2}\\1 & 0 & - \frac{121}{8} & - \frac{107}{8}\\0 & 1 & \frac{3}{8} & \frac{41}{8}\end{matrix}\right]$
In [29]:
M.rref()
Out[29]:
$\displaystyle \left( \left[\begin{matrix}1 & 0 & - \frac{121}{8} & - \frac{107}{8}\\0 & 1 & \frac{3}{8} & \frac{41}{8}\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1\right)\right)$

Dobiveni vektori baze za sliku operatora $h$ dani su svojim koordinatama u bazi $\mathcal{B}.$

In [30]:
H.columnspace()
Out[30]:
$\displaystyle \left[ \left[\begin{matrix}\frac{38}{25}\\\frac{14}{25}\end{matrix}\right], \ \left[\begin{matrix}\frac{1}{5}\\\frac{13}{5}\end{matrix}\right]\right]$

Pronađimo njihove koordinate u kanonskoj bazi.

In [31]:
Bkan=[(1,0),(0,1)]
T2=MMZI.matrica_prijelaza(Bkan,B)
T2
Out[31]:
$\displaystyle \left[\begin{matrix}3 & -1\\4 & 7\end{matrix}\right]$
In [32]:
v1=T2*sp.Matrix([sp.Rational(38,25),sp.Rational(14,25)])
v1
Out[32]:
$\displaystyle \left[\begin{matrix}4\\10\end{matrix}\right]$
In [33]:
v2=T2*sp.Matrix([sp.Rational(1,5),sp.Rational(13,5)])
v2
Out[33]:
$\displaystyle \left[\begin{matrix}-2\\19\end{matrix}\right]$

Pomoću numpy modula

a) dio

In [34]:
Hkan=MMZI.operator_kan(formula,klasa='numpy')
Hkan
Out[34]:
array([[ 1.,  0.,  0.,  1.],
       [ 1., -1.,  1.,  0.]])

b) dio

In [35]:
MMZI.operator_kanbaza(formula,A,B,'numpy')
Out[35]:
array([[ 1.52,  0.2 ,  2.68,  2.72],
       [ 0.56,  2.6 ,  0.04, -1.84]])
In [36]:
MMZI.operator_kanbaza(Hkan,A,B,'numpy')
Out[36]:
array([[ 1.52,  0.2 ,  2.68,  2.72],
       [ 0.56,  2.6 ,  0.04, -1.84]])

c) dio

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.

In [37]:
rang=LA.matrix_rank(Hkan)
rang
Out[37]:
2

Iz teorema o rangu i defektu odredimo defekt.

In [38]:
Hkan.shape
Out[38]:
$\displaystyle \left( 2, \ 4\right)$
In [39]:
defekt=Hkan.shape[1]-rang
defekt
Out[39]:
2

2. zadatak

Zadana je matrica $A=\begin{bmatrix}4&1&-1\\ 2&5&-2\\ 1&1&2\end{bmatrix}$.

  1. Odredite karakteristični polinom matrice $A$.
  2. Odredite svojstvene vrijednosti matrice $A$.
  3. Odredite svojstvene potprostore matrice $A$.
  4. Odredite minimalni polinom matrice $A$.

Rješenje

In [40]:
A=sp.Matrix([[4,1,-1],[2,5,-2],[1,1,2]])
t=sp.Symbol('t')

a) dio

In [41]:
pol=A.charpoly(t)
pol
Out[41]:
$\displaystyle \operatorname{PurePoly}{\left( t^{3} - 11 t^{2} + 39 t - 45, t, domain=\mathbb{Z} \right)}$
In [42]:
pol.as_expr()
Out[42]:
$\displaystyle t^{3} - 11 t^{2} + 39 t - 45$

b) dio

Svojstvene vrijednosti su 3 i 5, a njihove algebarske kratnosti su redom 2 i 1.

In [43]:
A.eigenvals()
Out[43]:
$\displaystyle \left\{ 3 : 2, \ 5 : 1\right\}$

c) dio

$\mathcal{B}_{S(3)}=\{(-1,1,0),(1,0,1)\}$, $\mathcal{B}_{S(5)}=\{(1,2,1)\}$

In [44]:
A.eigenvects()
Out[44]:
$\displaystyle \left[ \left( 3, \ 2, \ \left[ \left[\begin{matrix}-1\\1\\0\end{matrix}\right], \ \left[\begin{matrix}1\\0\\1\end{matrix}\right]\right]\right), \ \left( 5, \ 1, \ \left[ \left[\begin{matrix}1\\2\\1\end{matrix}\right]\right]\right)\right]$

d) dio

In [45]:
pol.as_expr().factor()
Out[45]:
$\displaystyle \left(t - 5\right) \left(t - 3\right)^{2}$

minimalni polinom: $m_A(\lambda)=(\lambda-5)(\lambda-3)$

In [46]:
(A-5*sp.eye(3))*(A-3*sp.eye(3))
Out[46]:
$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$

3. zadatak

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}.$$

Rješenje

In [47]:
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.

In [48]:
D.eigenvals()
Out[48]:
$\displaystyle \left\{ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 0\right)} : 1, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 1\right)} : 1, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 2\right)} : 1, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 3\right)} : 1, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 4\right)} : 1\right\}$

Karakteristični polinom ima stupanj 5.

In [49]:
pol=D.charpoly(t)
pol.as_expr()
Out[49]:
$\displaystyle t^{5} + 14 t^{4} + 92 t^{3} - 236 t^{2} - 1404 t + 22941$

Nultočke polinoma petog stupnja se općenito ne mogu egzaktno odrediti.

In [50]:
sp.solve(pol,t)
Out[50]:
$\displaystyle \left[ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 0\right)}, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 1\right)}, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 2\right)}, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 3\right)}, \ \operatorname{CRootOf} {\left(\lambda^{5} + 14 \lambda^{4} + 92 \lambda^{3} - 236 \lambda^{2} - 1404 \lambda + 22941, 4\right)}\right]$

Možemo nultočke (svojstvene vrijednosti) odrediti numeričkim putem.

In [51]:
sv=sp.nroots(pol)
sv
Out[51]:
$\displaystyle \left[ -7.69100268563089, \ -6.88473864426525 - 8.61937775355931 i, \ -6.88473864426525 + 8.61937775355931 i, \ 3.73023998708069 - 3.25521195280626 i, \ 3.73023998708069 + 3.25521195280626 i\right]$

Matrica $D$ ima samo jednu realnu svojstvenu vrijednost.

In [52]:
list(filter(lambda x:x.as_real_imag()[1]==0, sv))
Out[52]:
$\displaystyle \left[ -7.69100268563089\right]$

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.

In [53]:
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.

In [54]:
LA.eig(D)
Out[54]:
(array([ 3.73023999+3.25521195j,  3.73023999-3.25521195j,
        -6.88473864+8.61937775j, -6.88473864-8.61937775j,
        -7.69100269+0.j        ]),
 array([[-8.01531447e-01+0.j        , -8.01531447e-01-0.j        ,
          5.55839005e-02+0.34672821j,  5.55839005e-02-0.34672821j,
         -1.55747627e-01+0.j        ],
        [-3.16018350e-01+0.05161828j, -3.16018350e-01-0.05161828j,
          5.99411963e-01+0.j        ,  5.99411963e-01-0.j        ,
         -1.23664815e-01+0.j        ],
        [-5.78605990e-02-0.03424872j, -5.78605990e-02+0.03424872j,
         -2.14122141e-04-0.18626165j, -2.14122141e-04+0.18626165j,
         -4.18434706e-01+0.j        ],
        [ 3.58361087e-01-0.3039628j ,  3.58361087e-01+0.3039628j ,
          7.51626830e-02-0.4963692j ,  7.51626830e-02+0.4963692j ,
          5.02035628e-01+0.j        ],
        [-1.49614095e-01+0.08540514j, -1.49614095e-01-0.08540514j,
         -2.00487499e-01-0.43643417j, -2.00487499e-01+0.43643417j,
          7.30289199e-01+0.j        ]]))

Ako želimo samo svojstvene vrijednosti

In [55]:
sv=LA.eig(D)[0]
sv
Out[55]:
array([ 3.73023999+3.25521195j,  3.73023999-3.25521195j,
       -6.88473864+8.61937775j, -6.88473864-8.61937775j,
       -7.69100269+0.j        ])
In [56]:
LA.eigvals(D)
Out[56]:
array([ 3.73023999+3.25521195j,  3.73023999-3.25521195j,
       -6.88473864+8.61937775j, -6.88473864-8.61937775j,
       -7.69100269+0.j        ])

Matrica $D$ ima samo jednu realnu svojstvenu vrijednost.

In [57]:
resv=np.extract(sv.imag==0, sv)
resv
Out[57]:
array([-7.69100269+0.j])

Ako želimo samo svojstvene vektore

In [58]:
vek=LA.eig(D)[1]
vek
Out[58]:
array([[-8.01531447e-01+0.j        , -8.01531447e-01-0.j        ,
         5.55839005e-02+0.34672821j,  5.55839005e-02-0.34672821j,
        -1.55747627e-01+0.j        ],
       [-3.16018350e-01+0.05161828j, -3.16018350e-01-0.05161828j,
         5.99411963e-01+0.j        ,  5.99411963e-01-0.j        ,
        -1.23664815e-01+0.j        ],
       [-5.78605990e-02-0.03424872j, -5.78605990e-02+0.03424872j,
        -2.14122141e-04-0.18626165j, -2.14122141e-04+0.18626165j,
        -4.18434706e-01+0.j        ],
       [ 3.58361087e-01-0.3039628j ,  3.58361087e-01+0.3039628j ,
         7.51626830e-02-0.4963692j ,  7.51626830e-02+0.4963692j ,
         5.02035628e-01+0.j        ],
       [-1.49614095e-01+0.08540514j, -1.49614095e-01-0.08540514j,
        -2.00487499e-01-0.43643417j, -2.00487499e-01+0.43643417j,
         7.30289199e-01+0.j        ]])

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.

In [59]:
vek[:,4]
Out[59]:
array([-0.15574763+0.j, -0.12366482+0.j, -0.41843471+0.j,  0.50203563+0.j,
        0.7302892 +0.j])

Možemo maknuti 0.j ako nas smeta takav zapis kod vektora i realne svojstvene vrijednosti.

In [60]:
only_real=lambda x: x.real
vector_real = np.vectorize(only_real)
In [61]:
vector_real(vek[:,4])
Out[61]:
array([-0.15574763, -0.12366482, -0.41843471,  0.50203563,  0.7302892 ])
In [62]:
vector_real(resv)
Out[62]:
array([-7.69100269])

4. zadatak

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.

Rješenje

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.

In [63]:
B=np.array([(1,0,0),(0,1,0),(1,1,1)])
B
Out[63]:
array([[1, 0, 0],
       [0, 1, 0],
       [1, 1, 1]])
In [64]:
LA.matrix_rank(B)
Out[64]:
3
In [65]:
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)\}$

In [66]:
F1=np.array([[1,0],[1,3],[2,4]])
F1=np.transpose(F1)
F1
Out[66]:
array([[1, 1, 2],
       [0, 3, 4]])

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)\}$

In [67]:
F2=MMZI.operator_baza(F1, bazaD1=B, bazaD2=Bkan, bazaK1=Akan, bazaK2=Akan, klasa='numpy')
F2
Out[67]:
array([[1., 1., 0.],
       [0., 3., 1.]])

$f(0,0,1)=(0,1)$

In [68]:
v=np.array([0,0,1])
np.matmul(F2,v)
Out[68]:
array([0., 1.])

5. zadatak

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.$

  1. Odredite matricu $H$ linearnog operatora $h$ u paru baza $\mathcal{A}=\{(1,0,0),(0,1,0),(0,0,1)\}$ i $\mathcal{B}=\{1+2t,1-t^2,1+t^3,t+t^2\}.$
  2. Odredite sumu svih elemenata drugog stupca matrice $H$.
  3. Odredite sumu svih elemenata trećeg retka matrice $H$.
  4. Odredite rang i defekt linearnog operatora $h$.

Rješenje

Zadatak istovremeno rješavamo pomoću sympy i numpy modula.

In [69]:
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)]

a) dio

In [70]:
Hsp=MMZI.operator_kanbaza(fun,A,B,'sympy')
Hsp
Out[70]:
$\displaystyle \left[\begin{matrix}0 & -1 & 0\\0 & 3 & 1\\1 & -1 & 0\\0 & 3 & 3\end{matrix}\right]$
In [71]:
Hnp=MMZI.operator_kanbaza(fun,A,B,'numpy')
Hnp
Out[71]:
array([[ 0., -1.,  0.],
       [ 0.,  3.,  1.],
       [ 1., -1.,  0.],
       [ 0.,  3.,  3.]])

b) dio

Drugi stupac matrice $H$

In [72]:
Hsp[:,1]
Out[72]:
$\displaystyle \left[\begin{matrix}-1\\3\\-1\\3\end{matrix}\right]$
In [73]:
Hnp[:,1]
Out[73]:
array([-1.,  3., -1.,  3.])

Suma svih elemenata drugog stupca matrice $H$

In [74]:
sum(Hsp[:,1])
Out[74]:
$\displaystyle 4$
In [75]:
sum(Hnp[:,1])
Out[75]:
$\displaystyle 4.0$

c) dio

Treći redak matrice $H$

In [76]:
Hsp[2,:]
Out[76]:
$\displaystyle \left[\begin{matrix}1 & -1 & 0\end{matrix}\right]$
In [77]:
Hnp[2,:]
Out[77]:
array([ 1., -1.,  0.])

Suma svih elemenata trećeg retka matrice $H$

In [78]:
sum(Hsp[2,:])
Out[78]:
$\displaystyle 0$
In [79]:
sum(Hnp[2,:])
Out[79]:
$\displaystyle 0.0$

d) dio

Rang operatora $h$

In [80]:
Hsp.rank()
Out[80]:
$\displaystyle 3$
In [81]:
LA.matrix_rank(Hnp)
Out[81]:
3

Defekt operatora $h$

In [82]:
Hsp.shape[1]-Hsp.rank()
Out[82]:
$\displaystyle 0$
In [83]:
Hnp.shape[1]-LA.matrix_rank(Hnp)
Out[83]:
0
In [ ]: