import platform
platform.platform()
platform.python_version()
from pylab import *
import cmath
import itertools as it
def flatten(a):
for elem in a:
if type(elem) in (tuple,list):
for i in flatten(elem):
yield i
else:
yield elem
Promatramo kompleksne kvadratne matrice reda 16 čiji elementi su definirani sljedećom formulom
$$ a_{kl}=\begin{cases} e^{i\varphi},& \text{ako je } k< l\\ e^{-i\xi\varphi},& \text{ako je } k>l\\ 1,& \text{inače} \end{cases} $$
pri čemu je $i=\sqrt{-1}$, $\varphi\in[0,2\pi]$, a $\xi\in\mathbb{C}$ je neka konstanta.
def Matrica(ksi,fi):
M=[ [1 for i in range(16)] for j in range(16)]
for i in range(16):
for j in range(16):
if i<j: M[i][j] = e**(1j*fi)
if i>j: M[i][j] = e**(-1j*ksi*fi)
return matrix(M)
Kako je segment $[0,2\pi]$ neprebrojiv, nemoguće je na računalu proći kroz sve elemente tog segmenta. Potrebno je napraviti diskretizaciju tog segmenta tako da s varijablom $\varphi$ kroz njega prođemo s nekim malim pomakom, npr. s pomakom $0.003$.
ksi=[1/6,2,5,50,70,100]
for i in range(1, 7):
lista=[Matrica(ksi[i-1],fi) for fi in ogrid[0:2*np.pi:2000j]]
lista2 = map(lambda x: list(eigvals(x)),lista)
sv=list(flatten(lista2))
listaX=list(map(lambda x: x.real, sv))
listaY=list(map(lambda x: x.imag, sv))
fig,ax = subplots(figsize=(8,6))
if i != 2:
text(0.01,0.9,r'$\xi={}$'.format(round(ksi[i-1],2)),fontsize=20,transform=ax.transAxes)
else:
text(0.99,0.9,r'$\xi={}$'.format(round(ksi[i-1],2)),fontsize=20,ha='right',transform=ax.transAxes)
scatter(listaX,listaY, c='k', s=1, marker='o', alpha=1)
Dodatno se možete poigrati s različitim opcijama za varijable cmap i interpolation.
ksi=2
A=Matrica(ksi,1.2)
S1 = matrix(list(map(lambda x: list(map(lambda y: abs(y), x)), eig(A)[1].tolist())))
S2 = matrix(list(map(lambda x: list(map(lambda y: cmath.phase(y), x)), eig(A)[1].tolist())))
Grafički prikaz matrice $S_1$ u dvije različite palete boja
fig, ax = subplots(figsize=(8,8))
ax.matshow(S1,cmap='bone',interpolation='lanczos')
axis('off');
fig, ax = subplots(figsize=(8,8))
ax.matshow(S1,cmap='ocean',interpolation='lanczos')
axis('off');
Grafički prikaz matrice $S_2$ u dvije različite palete boja
fig, ax = subplots(figsize=(8,8))
ax.matshow(S2,cmap='bone',interpolation='lanczos')
axis('off');
fig, ax = subplots(figsize=(8,8))
ax.matshow(S2,cmap='ocean',interpolation='lanczos')
axis('off');
Promatramo kompleksne kvadratne matrice reda 16 čiji elementi su definirani sljedećom formulom
$$ a_{kl}=\begin{cases} e^{l\varphi\operatorname{sign}{\!(k-l)}\cdot2\pi i},& \text{ako je } |k-l|=1\\ \qquad1,& \text{ako je } |k-l|=3\\ \qquad0,& \text{inače} \end{cases} $$
pri čemu je $i=\sqrt{-1}$, $\varphi\in[0,2\pi]$.
def Matrica2(fi,n):
M=[ [0 for i in range(n)] for j in range(n)]
for i in range(n):
for j in range(n):
if abs(i-j)==1: M[i][j] = e**(1j*2*pi*sign(i-j)*j*fi)
if abs(i-j)==3: M[i][j] = 1
return matrix(M)
Kako je segment $[0,2\pi]$ neprebrojiv, nemoguće je na računalu proći kroz sve elemente tog segmenta. Potrebno je napraviti diskretizaciju tog segmenta tako da s varijablom $\varphi$ kroz njega prođemo s nekim malim pomakom, npr. s pomakom $0.002$.
lista_matrica=[Matrica2(fi,16) for fi in list(np.ogrid[0:2*pi:3000j])]
svojstvene_vrijednosti = list(map(lambda x: list(eigvals(x)),lista_matrica))
sv = list(flatten(svojstvene_vrijednosti))
listaX=list(map(lambda x: x.real, sv))
listaY=list(map(lambda x: x.imag, sv))
fig, ax = subplots(figsize=(8,8),facecolor='white')
scatter(listaX,listaY, c='k', s=0.05, marker='o', alpha=1)
axis('off');
boje=list(flatten([list(np.random.rand(1))*16 for k in range(len(svojstvene_vrijednosti))]))
fig, ax = subplots(figsize=(8,8),facecolor='white')
scatter(listaX,listaY, c=boje, s=0.05, marker='o', alpha=1)
axis('off');
Neka je $\mathcal{T}$ skup svih kvadratnih matrica reda 16 sa sljedećim svojstvima.
Napišite program koji će izgenerirati sve matrice iz skupa $\mathcal{T}$ i na temelju toga odredite kardinalni broj skupa $\mathcal{T}$. Nadalje, odredite sve svojstvene vrijednosti svih matrica iz skupa $\mathcal{T}$ i prikažite ih kao točke u kompleksnoj ravnini.
def Matrica3(dijagonala):
d = len(dijagonala)+1
M=[ [0 for i in range(d)] for j in range(d)]
for i in range(d):
for j in range(d):
if j == i+1:
M[i][j]=1
elif j == i-1:
M[i][j]=dijagonala[j]
else:
M[i][j]=0
return matrix(M)
dijagonale = list(it.product([-1,1],repeat=15))
M1 = map(lambda x: list(eigvals(Matrica3(x))), dijagonale)
M2 = list(flatten(M1))
listaX = list(map(lambda x: x.real,M2))
listaY = list(map(lambda x: x.imag,M2))
fig, ax = subplots(figsize=(8,8),facecolor='white')
scatter(listaX,listaY, c='b', s=0.002, marker='o', alpha=1)
axis('off');
Za ljepšu sliku možemo sa slike maknuti svojstvene vrijednosti kojima su realni ili imaginarni dijelovi jednaki nula.
M1 = map(lambda x: list(eigvals(Matrica3(x))), dijagonale)
M3 = list(filter(lambda x: (abs(x.real) > 0.01) and (x.imag != 0), flatten(M1)))
listaX = list(map(lambda x: x.real,M3))
listaY = list(map(lambda x: x.imag,M3))
fig, ax = subplots(figsize=(8,8),facecolor='white')
scatter(listaX,listaY, c='b', s=0.002, marker='o', alpha=1)
axis('off');