06- Su$-$Schrieffer$-$Heeger-modell sávszerkezete ☠

A szilárdtestfizikában a Su$-$Schrieffer$-$Heeger-modell egy végtelen periodikus poliacetilén láncot ír le. A modell Hamilton-operátora az alábbi 2x2-es hermitikus mátrix: $$ H=\left( \begin{array}{cc} 0 & 1+w e^{-i k} \\ 1+w e^{i k} & 0 \\ \end{array} \right). $$ A fenti kifejezésben $k$ a hullámszámvektor, melynek értéke a $[-\pi,\pi]$ intervallumon változhat, $w$ pedig egy valós szám, melynek értéke $0.5$ és $1.5$ között változhat. Készítsünk egy interaktív ábrát, mely a Hamilton-operátor sajátértékeit ábrázolja $k$ függvényében, ahol egy csúszka segítségével $w$ értékét változtathatjuk!

Megoldás

Először betölrjük a pylab és az ipywidgets csomagot.

In [1]:
%pylab inline
from ipywidgets import *
Populating the interactive namespace from numpy and matplotlib

Ezután definiáljuk a függvényt, ami elvégzi az ábrázolás.

In [2]:
def abrazol(w):
    k = linspace(-pi, pi, 100) # Tömb a k értékeknek
    lambda_1 = zeros(len(k))   # Tömbök az ábrázolandó sajátértékeknek (mivel 2x2-es mátrixról van szó, két sajátérték lesz)
    lambda_2 = zeros(len(k))
    for i in range(len(k)):    # Minden k-ra kiszámoljuk a sajátértékeket, és ezeket eltároljuk a lambda tömbökben
        Hi = matrix([[0, 1 + w * exp(-1j * k[i])], [1 + w * exp(1j * k[i]), 0]])
        lambda_1[i], lambda_2[i] = eig(Hi)[0]
    plot(k, lambda_1)          # Majd ábrázoljuk a sajátértékeket a k hullámszám függvényében
    plot(k, lambda_2)
    xlabel("k", size=12)
    ylabel("sajátérték", size=12)
    title("H sajátértékei k függvényében", size=18, y = 1.05)
    xticks(linspace(-4, 4, 9))
    yticks(linspace(-3, 3, 7))

Majd az interact() függvénnyel meghívjuk az előbb definiált függvényt, ezzel a w paraméter értékét kedvünkre tudjuk módosítani.

(A program figyelmeztet, hogy a komplex számnak elveszik a képzetes része, de ezzel nem kell foglalkozni, hiszen az ilyen alakú mátrixok sajátértéke biztos, hogy valós, maximum a kerekítési hibák miatt lehet, hogy a kapott sajátértékeknek van kicsi képzetes része.)

In [3]:
interact(abrazol, w=FloatSlider(min=-0.5, max=1.5, step=0.02, value=0.5))
/opt/conda/lib/python3.5/site-packages/ipykernel/__main__.py:7: ComplexWarning: Casting complex values to real discards the imaginary part