Zajtenberg Zajtenberg
294
BLOG

Zrób sobie pasmo

Zajtenberg Zajtenberg Nauka Obserwuj temat Obserwuj notkę 2

Pewna łatwość w uzyskaniu struktury pasmowej widma energii dla jednowymiarowego modelu, zachęciła mnie do pokazania krok po kroku, jak można to zrobić. Co prawda tylko dla przypadku jednowymiarowego, ale za to od początku do końca.

Model

Punktem wyjścia będzie nieskończona studnia potencjału, bez toruso-podobnych zapętleń – po szczegóły znów odsyłam do notki „Kwantowe odbijanie się od ścian”. Funkcje falowe to sinusy, energia takiego stanu zależy kwadratowo od liczby n czy proporcjonalnej do niej liczby k (taki jednowymiarowy wektor falowy):

φn(x)=\sin(kx), gdzie k=nπ/L, oraz En={k^2ħ^2/2m}

Powyższa fromuła przedstawia energię kinetyczną cząstki w studni. Do tego dodaję jeden z najprostszych potencjałów: będą to cienkie bariery, dzielące studnię na obszary mające symbolizować obecność atomów sieci krystalicznej.

Obliczone sinusy nie są już teraz funkcjami własnymi energii, ale wciąż stanowią bazę w przestrzeni stanów i można obliczyć macierz energii w tej bazie. Bez udziału potencjału, macierz energii (sama energia kinetyczna) była diagonalna:

E_{k} = {π^2ħ ^2\over 2mL^2}\begin{pmatrix} 1 4 9 dots \end{pmatrix}

Macierz operatora energii potencjalnej V niestety liczy się jako całkę (V nie jest diagonalna w używanej bazie i dlatego wprowadziłem indeksy i oraz j):

V_{i,j} = \int_0^L φ_i(x) φ_j(x) V(x)dx = \sum_{bariery} \int_{obszar bariery} φ_i(x) φ_j(x) V_0 dx

Ponieważ jednak cały model to i tak daleko idące uproszczenie rzeczywistości, uproszczę sobie również i ów potencjał, zakładając, że bariera zajmuje tak niewiele miejsca, iż wartość funkcji bazowych nie zmienia się w obszarze całkowania i można użyć wyrażenia:

V_{ij} = \sum_{m=1}^{ilosc barier} α \sin(iπ m/L) \sin(jπ m/L)

Przez M oznaczyłem ilość obszarów – barier jest o 1 mniej. Za x podstawiłem lokalizację m-tej bariery: mL/M. Wprowadziłem też parametr α mający być iloczynem wysokości bariery, jej szerokości i kwadratu niewypisanej do tej pory stałej normującej funkcji falowej (we wzorze zamiast φ są już sinusy).

Jak dodamy macierze energii kinetycznej i potencjalnej dostaniemy wyrazy macierzowe operatora energii całkowitej H0+V. No i teraz pora na kawałek algebry: trzeba znaleźć taką bazę, żeby ta nowa macierz została zdiagonalizowana – to znaczy miała niezerowe elementy tylko na przekątnej.

Algebra z komputera

Tak w ogóle, to samo rachowanie diagonalizacji macierzy nie jest chyba zbyt podniecające, ale od czego dobrzy ludzie, którzy dali ludzkości narzędzia co zrobią to za nas? Chodzi o dostępne powszechnie biblioteki programistyczne. Notka zrobi się teraz znów nieco hermetyczna, ale zamiast matematyki, straszyć będzie programowanie, choć zaręczam, że niezbyt trudne.

Szczęśliwie tworzenie takich właśnie macierzy udostępnia biblioteka TNT, a operacje na niej realizuje biblioteka JAMA. W dokumentacji napisali, że powstały one w javie, ale zostały również dostosowane do języka C++. Wspomniane biblioteki wyguglałem dość przypadkowo, a ponieważ okazało się, że całość mieści się w plikach nagłówkowych (nic nie trzeba ekstra kompilować) pomyślałem, że się nadadzą dla amatorów.

Zanim rzucę się na głębokie wody diagonalizacji macierzy energii, mała próbka, czy wszystko przebiega według zapewnień dokumentacji – skąpej, ale w tym przypadku to chyba zaleta, że nie trzeba zbyt dużo czytać ☺. Test będzie polegał na znalezieniu wektorów własnych macierzy Pauliego (0, 1 / 1, 0). Uzupełniłem kod o komentarze, wyjaśniające, co do czego służy dana klasa:

#include <iostream>
//dodatkowo trzeba dołączyć pliki nagłówkowe
//tu umieszczone podkatalogu tnt
#include "tnt/tnt.h"
#include "tnt/jama_eig.h"

int main()
{
//utworzenie dwóch tabel: badanej macierzy 2 na 2
TNT::Array2D< double > macierz( 2, 2, 0.0 );
// i tablicy na wartości własne o długości 2
TNT::Array1D< double > wart( 2, 0.0 );
//obie tabele inicjowane są zerami, 
//więc trzeba jeszcze nadać wartości różne od zera
macierz[0][1] = 1;
macierz[1][0] = 1;
//obróbka danych
JAMA::Eigenvalue<double> diag( macierz );
diag.getRealEigenvalues( wart );
//i na koniec wypisanie
std::cout << "Pierwsza wart. wl: " << wart[0] 
   << "\nDruga wart. wl: " << wart[1] << "\n";

return 0;
}

Na ekranie pojawi się:

Pierwsza wart. wl: -1
Druga wart. wl: 1

Przy okazji mały pokaz, jak działają postulaty kwantówki: Jeśli tę macierz przemnożyć przez ħ/2 to wyjdzie operator składowej X-owej spinu. Program policzył ±1, co przemnożone przez stałą ħ/2, da możliwe wyniki pomiaru składowej spinu. Ale wracam do głównego tematu, bo to już dygresja w dygresji.

Znajdowanie wartości własnych macierzy było/jest jednym z najważniejszych zadań algebry. Powstał nawet dość bogaty aparat rachunkowy. Szczęśliwie sporo szczegółów matematycznych możemy sobie tu darować, bo macierz jaką będziemy obrabiać jest hermitowska, jak spojrzymy dokładniej okaże się że jest jeszcze lepsza, bo jest symetryczna i rzeczywista. Dzięki temu możemy TNT używać, bo biblioteka ta pozwala przeliczać macierze tylko o współrzędnych rzeczywistych. Wyliczone wartości własne mogą w ogólności być zespolone, ale w naszym przypadku będą rzeczywiste – operator energii jest w końcu macierzą hermitowską.

Program

W programie utworzyłem macierz operatora energii. W modelu teoretycznym jest ona nieskończona, w programie miała rozmiar 50×50 (stała N). Na wykresie umieściłem tylko 40 wartości własnych, by efekt zaburzenia struktury energii poprzez takie obcięcie nie był widoczny. Hamiltonian H=H0+V w programie wyglądał następująco (przeindeksowałem macierz, bo w C/C++ tabele liczy się od 0 a nie od 1):

TNT::Array2D< double > H( N,N, 0.0 );
//E kinetyczna (stala h reprezentuje hbar^2 pi^2/2m L^2)
for( int n=0; n<N; n++ ) H[n][n]=h*(n+1)*(n+1);
//+E potencjalna
for( int i=0; i<N; i++ )
  for( int j=0; j<N; j++ )
    for( int m=1; m<M; m++ )
       H[i][j] += alfa*sin(M_PI*(i+1)*m/M)*sin(M_PI*(j+1)*m/M);

Przeliczenia przeprowadzałem dla przypadku, gdy długość studni podzielona była na 10 „podstudni” (stała M). Żeby sprawdzić, jak będą zachowywać się wartości własne przeprowadziłem szereg przeliczeń dla różnych wartości parametru α. Jak zależą możliwe energie od tegoż parametru przedstawia poniższy zestaw dziewięciu wykresów. Dla α=0 wartości (kropki) są ułożone zgodnie z pierwotnym wzorem na En czyli kwadratowo – odległości między parami kropek rosną liniowo. Dla ośmiu wartości α>0 mamy osiem pionowo ułożonych wykresów En – każdy dla innej wartości α.

Z wykresu widać dwie rzeczy: Po pierwsze możliwe energie „grupują się” – taką grupę fizycy nazywają pasmem. Po drugie zmodyfikowane wartości energii wciąż można parametryzować liczbami n (albo k).

* * *

A bardziej rzeczywiste modele? Grupowanie się poziomów energetycznych w pasma jest dość „odporne” na postacie zastosowanego potencjału. Ma ono miejsce nie tylko dla takich prostych modeli ale i dla potencjałów lepiej odpowiadających rzeczywistości. Najlepsze jest to, że w przypadku 3D wprowadzenie do równania Schrödingera członu odpowiadającego oddziaływaniu elektronu z siecią krystaliczną, pozwala na uzyskanie całego bogactwa wyników obserwowanych w prawdziwych ciałach stałych. Nie tylko metali.

Zajtenberg
O mnie Zajtenberg

Amator muzyki "młodzieżowej" i fizyki. Obie te rzeczy wspominam na blogu, choć interesuję się i wieloma innymi. Tematycznie: | Spis notek z fizyki | Notki o mechanice kwantowej | Do ściągnięcia: | Wypiski o fizyce (pdf) | Historia The Beatles (pdf)

Nowości od blogera

Komentarze

Inne tematy w dziale Technologie