Kwantowa paczka falowa
Transkrypt
Kwantowa paczka falowa
Kwantowa paczka falowa
A. Baran
3 stycznia 2017
Ruch paczki falowej
Leapfrog method
Metoda Numerova
Unitarność
Postać Cayley’a operatora ewolucji
Metody stabilne, unitarne i jawne
Równanie dyfuzji
Więcej wymiarów
Problemy graficzne
Rzutowanie
Poziomice
Problem niewidocznych linii
Model przestrzeni kolorów RGB
Rzutowanie z R2 na przestrzeń RGB
Paczka falowa 2D
0
Ruch paczki falowej
Ruch paczki falowej
Wave packet motion through the Square-well potential.
START
0
1
2
3
4
5
Probability P(x,t)
Rysunek 1, pokazany obok, przedstawia stary
sposób ilustrowania zjawiska ruchu paczki
falowej w zadanym potencjale (w tym przypadku
nad studnią prostokątną). Obecnie, gdy
komputery są szybkie i posiadają duże
możliwości graficzne, możemy zrobić to lepiej.
Przykłady:
John L. Richardson z Silicon Graphics: http://
www.sgi.com/fun/java/john/wave-sim.html
– Oscylacje pakietu falowego, 1-dim.
Denis Rapaport: http://www.ph.biu.ac.il/
~rapaport/java-apps/quant1d.html. –
1dim; http://www.ph.biu.ac.il/~rapaport/
java-apps/quant2d.html, 2-dim.
Które przedstawienie jest lepsze?
6
7
8
9
10
11
0
0.1
0.2
0.3
0.4
0.5
x
0.6
0.7
0.8
0.9
1
Rysunek 1: Ruch pakietu
falowego.
1
Leapfrog method
Leapfrog method I
Jak to zrealizować? Nie jesteśmy pierwsi. Co zrobili inni.
Można skorzystać z metody opracowanej przez Visschera [3], którą podaje też
Horbatsch [4, 6]. Warto zajrzeć do klasyków mechaniki kwantowej (Schiff) [1].
Schiff cytuje również pracę Goldberga i Scheya z 1967r: Jeszcze jedną
interesującą publikacją jest praca [5].
Metoda nosi nazwę leap frog czyli żabiego skoku. Polega na tym, że zespolona
funkcja falowa ψ = ψR + iψI , jest zadana w chwili t0 i jej ewolucja, zgodnie z
czasowym równaniem Schrödingera, wyznaczana jest poprzez obliczenia, na
zmianę, raz wartości ψR , a raz ψI w kolejnych chwilach t0 + ∆t/2, t0 + ∆t), ... w
odpowiedni sposób.
Z równania Schrödingera (i∂ψ/∂t = Hψ) mamy
ψ̇R = HψI ,
ψ̇I = −HψR .
2
Leapfrog method II
Po dyskretyzacji czasu (∆t ) i przestrzeni (∆x ) odkładamy na osi czasowej odcinki
∆t/2. Ponieważ ewolucja ψR wyznaczana jest przez ψI , natomiast ewolucja ψI
wyznaczana jest poprzez ψR , można zastosować następujący schemat iteracyjny.
ψR (x, t + ∆t)
=
ψR (x, t) + ∆tHψI (x, t + ∆t/2) ,
(1)
ψI (x, t + (3/2)∆t)
=
ψI (x, t + ∆t/2) − ∆tHψR (x, t + ∆t) .
(2)
Centralne różnice skończone wyznaczaja pochodne z dokładnością do drugiego
rzędu w t. Metoda jest stabilna o ile tylko ∆t < ∆x2 .
Problem polega na tym, że nie znamy wartości ψR i ψI w tej samej chwili czasu
t lecz naprzemiennie w co drugim kroku o długości ∆t/2. Można je jednak
wyznaczyć w tej samej chwili przez interpolację.
3
Schemat programu I
/*
* Scheme of the Wave Packet program
* (basis: Horbatsch, Maple program)
*
*/
static double dt, dth, Time, dxsq;
static int nx;
static double[] xmesh, psiR, psiI, Vpot, Hpsi;
// time discretization; time step
dt = 1d/50d;
// half time step
dth = dt/2d;
// space discretization
// space step
dx
= 1d/5d;
dxsq = 1d/(2*dx^2);
// space extension
xmax = 15d;
4
Schemat programu II
// number of space points
nx = (int)2*xmax/dx + 1;
// x mesh
for(int i=0;i<nx;i++)
xmesh[i] = -xmax + (i-1)*dx;
// initialize real and imaginary parts of Psi
// at t = 0 and t = dt/2 respectively
w0 = 1d/2d;
x0 = -10d;
p0 =
2d;
for(int i=0;i<nx;i++) {
psiR[i] = pack(xmesh[i], 0,x0,p0,w0).Re();
psiI[i] = pack(xmesh[i],dth,x0,p0,w0).Im();
}
// at t= 0
// at t=dth
// picture psiR[i], psiI[i]
// and the density |psiR[i]+psiI[i]|^2
// Hamiltonian on the mesh
// Kinetic energy couples nearest neighbours
5
Schemat programu III
// Potential energy is local
// Potential; square well
for(int i=0;i<nx;i++)
Vpot[i] = Math.abs(xmesh[i]) <= 2 ? -4 : 0;
// picture Vpot[i]
// Calculate H psiR(0), H psiI(dth)
doHpsi(psiR);
doHpsi(PsiI);
// doHpsi
public void doHpsi(double[] args) {
// calculates H psiR or HpsiI
for(int i=1;i<nx-1;i++)
Hpsi[i] = -dxsq * (args[1][i+1]+args[1][i-1]-2*args[1][i])
+Vpot[i]*args[1][i];
Hpsi[0] = -dxisq*(args[1][2]-2*args[1][1])+Vpot[1]*args[1][1];
Hpsi[nx] = -dxisq*(args[1][nx-1]-2*args[1][nx])
+Vpot[nx]*args[1][nx];
}
6
Schemat programu IV
/*
* The basic time evolution step for the real and imaginary
* parts of the wavefunction. It assumes that the imaginary
* part is a half-step ahead of the real part.
*/
public void timeStep() {
for(int i=0;i<nx-1;i++) {
psiR[i] = psiR[i] + dt*Hpsi[i];
psiI[i] = psiI[i] - dt*Hpsi[i];
}
// Time:=Time+dt;
}
/*
* Set up the time-loop.
*/
while ( go ) {// go is true if the process is running and false otherwise
timeStep();
// plot xmesh[i], psiR[i]^2+psiI[i]^2], psiR[i], psiI
}
class complex {
double re, im;
7
Schemat programu V
complex() {
re = 0; im = 0;
}
complex(double x, double y){
re = x;
im = y;
}
public void add(complex a, complex b){
re = a.re + b.re;
im = a.im + b.im;
}
public void mult(complex a, complex b){
re = a.re * b.re - a.im * b.im;
im = a.re * b.im + a.im * b.re;
}
public void set(complex a){
re = a.re;
im = a.im;
}
}
8
Metoda Numerova
Metoda Numerova
Metoda Numerova-Cowella-Goodwina-Foxa nadaje się do rozwiązywania
specjalnych zagadnień własnych, równań, gdzie nie występuje pierwsza
pochodna.
Zadanie 1.
Zakoduj algorytm Numerova w JavaTM . Zastosuj program do rozwiązania równań rozpatrywanych w
zadaniach 1-4 zamieszczonych w części Metoda Numerova . . . .
9
Unitarność
Unitarność I
Pokazany poprzednio schemat iteracyjny rozwiązania równania Schrödingera
zależnego od czasu jest schematem jawnym, tzn. ψn+1 jest wyliczane na
podstawie poprzedniej wartości ψn , lecz nie jest schematem unitarnym. Operator
ewolucji exp(±i∆t Ĥ) zastąpiliśmy wyrażeniem 1 ± i∆t Ĥ, które nie zapewnia
R
unitarności funkcji falowej ( |ψ|2 dx 6= 1). Podobnie jest z prostymi schematami
niejawnymi opartymi na tym wyrażeniu. Eliminują one niestabilność numeryczną
lecz problem niezachowania unitarności wciąż pozostaje. Przyjrzyjmy się
stabilnej metodzie niejawnej. Otrzymamy ją następująco. Funkcja falową ψ n+1 w
chwili ∆t potraktujmy chwilowo jako zadaną. Na jej podstawie wyliczmy ψ n .
Ponieważ ψ(∆t) = exp(−i∆tH)ψ(0)}, więc ψ(0) = exp(i∆t Ĥ)ψ(∆t). Stąd,
rozwijając w szereg Taylora, mamy
10
Unitarność II
n+1
n+1
ψjn = ψjn+1 − (i∆t/∆x 2 )[ψj+1
− 2ψjn+1 − ψj−1
− ∆x 2 Vj ψjn+1 ] .
Metoda jest typu implicit. Równanie, chociaż stabilne, daje niejawnie ψ n+1 . Aby
wyznaczyć ψ n+1 potrzeba stosować specjalne techniki algebraiczne.
Ważniejszy jest jednak problem unitarności ψ.
11
Operator Cayleya
Prostym przybliżeniem operatora ewolucji exp(i∆t Ĥ) jest postać podana przez
Cayleya
1
1
(3)
(1 − ∆t Ĥ)/(1 + ∆t Ĥ) ,
2
2
która dodatkowo zapewnia dokładność do rzędu ∆t 2 .
Stosując postać Cayleya operatora ewolucji możemy zapisać
ψjn+1 = (1 −
1
1
∆t Ĥ)/(1 + ∆t Ĥ)ψjn ,
2
2
(4)
Po prostych obliczeniach mamy następujacy schemat różnicowy
2∆x 2
n+1
− ∆t 2 Vj − 2)ψjn+1 + ψj−1
=
∆t
2
2∆x
n
n
−ψj+1
+ (i
+ ∆t 2 Vj + 2)ψjn − ψj−1
.
∆t
n+1
ψj+1
+ (i
(5)
Równanie to jest stabilne, zapewnia unitarność, lecz nie daje jawnie wartości
dla ψn+1 .
12
Metody stabilne, unitarne i jawne
Metody stabilne, unitarne i jawne I
Opieramy się na pracy [6].
Dyskutowane poprzednio metody były oparte na przybliżeniu dla operatora
ewolucji funkcji falowej, który jest formalnym rozwiązaniem równania
Schrödingera. Równanie ewolucji jest postaci
ψ(x, t) = exp(−i
t − t0
Ĥ) ψ(x, t0 ) .
~
(6)
Najprostsza metoda (niestabilna) była oparta na przybliżeniu
exp(−i
∆t
∆t
∆t
Ĥ) = 1 − i
Ĥ + O([ Ĥ]2 ) .
~
~
~
(7)
Prowadziło to do rozbieżności metody.
Drugie przybliżenie było oparte na postaci Cayleya operatora ewolucji (patrz 3).
Ta metoda jest stabilna numerycznie lecz niejawna i kosztowna numerycznie
gdyż wymaga złożonych obliczeń prowadzących do rozwikłania niejawnego
schematu ewolucji.
13
Metody stabilne, unitarne i jawne II
Metoda, którą podaje Richardson, jest również oparta na przybliżeniu operatora
ewolucji, lecz jest zarówno jawna, unitarna i stabilna numerycznie.
Operator ewolucji zapisywany jest najpierw w postaci sumy operatora energii
kinetycznej T̂ i potencjalnej V̂ . Dalej T̂ rozbija się na sumę M częsci
P
T̂ = M
l=1 T̂l , dla których łatwo jest policzyć exp T̂l . Następnie korzystamy z
tzw. przybliżenia iloczynowego Trottera:
!
M
Y
∆t
∆t
∆t
exp(−i
Ĥ) =
exp(−i
T̂j ) exp(−i
V̂ ) + O(∆t 2 )
(8)
~
~
~
j=1
Błąd jaki tutaj popełniamy zależy od wartości komutatorów [Tl , Tl0 ], [Tl , V ] i od
wielkości kroku czasowego ∆t.
W przypadku jednego wymiaru przestrzennego podział operatora T̂ można
określić z formuły różnicowej dla Laplasjanu:
(T̂ ψ)n =
~2
[2ψn − ψn−1 − ψn+1 ] .
2ma2
14
Metody stabilne, unitarne i jawne III
Macierz T jest postaci
2
−1
~2
0
[T ] =
2ma2
...
0
−1
−1
2
−1
...
0
...
...
−1
0
−1
2
−1
0
...
0
...
2
−1
−1
0
0
−1
2
(9)
Macierz ta daje się zapisać jako suma macierzy
~2
[Te ] =
2ma2
M
0
...
0
0
0
M
0
0
...
...
...
0
0
...
M
0
0
0
0
M
(10)
15
Metody stabilne, unitarne i jawne IV
oraz
~2
[To ] =
2ma2
1
0
...
0
−1
0
M
...
0
...
...
0
0
0
...
M
0
−1
0
,
0
1
(11)
gdzie M jest macierzą kwadratową 2 × 2
M=
1
−1
−1
1
!
.
Macierze [Te ] i [To ] są sumami prostymi macierzy M =
obliczyć eksponent macierzy M. Mamy mianowicie
exp(−i
∆t
M)
~
=
1 + [exp(−iε) − 1]
=
1
2
1 + exp(−iε)
1 − exp(−iε)
(12)
~2
M.
2ma2
Łatwo jest
ma2
~2
1 − exp(−iε)
1 + exp(−iε)
!
=
1
2
α
β
!
β
(13)
α
16
Metody stabilne, unitarne i jawne V
gdzie ε = ∆t~/ma2 , a α = 1 + exp(−iε)/2 i β = 1 − exp(−iε)/2. Macierz
M) jest unitarna i posiada wartości własne λ1 = 1, λ2 = exp(−iε).
exp(−i ∆t
~
Zadanie 2.
Proszę sprawdzić słuszność ostatniej formuły. Obliczyć wartości własne M i exp(−iεM).
Zapiszmy wyniki w postaci operatorowej
~2
1
1
n
n
(T̂e ψ)n =
ψ
−
(1
−
(−1)
)ψ
−
(1
+
(−1)
)ψ
,
n
n−1
n+1
2ma2
2
2
(T̂o ψ)n =
~2
2ma2
1
1
ψn − (1 + (−1)n )ψn−1 − (1 − (−1)n )ψn+1 .
2
2
(14)
(15)
17
Metody stabilne, unitarne i jawne VI
Eksponent tych wyrażeń jest
o
n
β
β
n
n
exp(−i∆t/~T̂e ψ) = αψn − (1 − (−1) )ψn−1 − (1 + (−1) )ψn+1 ,
n
2
2
(16)
n
exp(−i∆t/~T̂o ψ)
o
n
=
β
β
αψn − (1 + (−1)n )ψn−1 − (1 − (−1)n )ψn+1 .
2
2
(17)
18
Dyfuzja
Wyniki dotyczące stabilności, dyskutowane tutaj dla przypadku równania
Schrödingera, są również słuszne dla równania dyfuzji. Podstawienie t → −it i
V = 0 przekształca wszystkie wzory otrzymane dla równania Schrödingera w
klasyczne równanie dyfuzji. Operatory unitarne zamieniane sa rzeczywistymi
operatorami o wartościach własnych mniejszych niż jeden i stabilność metody
jest zapewniona.
19
Więcej wymiarów
W przypadku większej liczby wymiarów wyrażenia są niewiele bardziej
skomplikowane.
Zadanie 3.
Otrzymać wzory różnicowe dyskutowanej metody dla przypadku n-wymiarowego równania
Schrödingera lub równania dyfuzji.
20
Problemy graficzne
Grafika I
Ponieważ dyskutowane wyżej problemy można przedstawić graficznie zajmiemy
się przez chwilę sposobami reprezentacji danych na ekranie. Dyskusja będzie
dotyczyć trzech spraw. Pierwsza to proste rzutowanie figur 3 wymiarowych,
druga to rysowanie poziomic (konturów), a trzecia to problem niewidocznych
linii na rysowanych rzutach.
21
Rzutowanie
RZUTOWANIE
y
p''
oko
o
E
P'' P(X,Y,Z)
Y
p(x,y)
p'
O
x
P'
Z
C
X
rzut
obiekt
E
E
p''
y
o
x
p'
P''
O
P'
y=Y(Z - Zo )/(Z - Z)
E
E
x=X(Z - Zo )/(ZE - Z)
E
Rysunek 2: Schemat rzutowania na ekran
Łatwo sprawdzić słuszność następujących równości
x
=
|OP 0 | · |EO|/|EQ| = X (ZE − ZO )/(ZE − Z )
(18)
y
=
Y (ZE − ZO )/(ZE − Z )
(19)
Zadanie 4.
Napisz program w JavaTM (klasa), który rzutuje figurę o zadanych wierzchołkach (xi , yi , zi ) na ekran.
Zastosuj do kilku wybranych figur przestrzennych.
22
Poziomice I
Poziomice są liniami jednakowej wartości funkcji z = f (x, y ), a więc określone
są równaniem z = const. Najwygodniej jest podzielić obszar określoności
funkcji f na trójkątne podobszary. Interpolacja wielkości z w takim
elementarnym obszarze trójkąta przebiega następująco (patrz rysunek).
k
(xm,yu,zu)
i
(xi,yi,zi)
(xm,ym,zm)
(xm, yl, zl)
j
Rysunek 3: Interpolacja z w punkcie wewnętrznym (xm , ym ) trójkąta (i-j-k).
23
Poziomice II
Najpierw znajdujemy najdalej wysunięte punkty w x:
xmin = min(xi , xj , xk ) ,
xmax = max(xi , xj , xk ) .
W celu zbadania całego obszaru trójkąta przesuwamy linię x = xm od xmin do
xmax . Dla każdej wartości xm znajdujemy granice zmienności y . Nazwiemy je yl
oraz yu . Są one ograniczone dwoma bokami trójkąta i − j − k. Trzeci bok nie
jest ważny i wykluczymy go z rozważań. Aby sprawdzić, który to bok
sprawdzamy czy xm leży poza przedziałem (xp , xq ), gdzie p, q = i, j, k. Jeśli np.
xm leży poza przedziałem (xk , xj ) (patrz rysunek), to bok ij wykluczamy z
procedury znajdowania yu i yl dla x = xm . Jeśli xm przekroczy xk to znajdzie się
na zewnątrz (xi , xk ) i w konsekwencji wykluczymy bok ik. Jeśli będziemy
wyznaczać xu i xl z równań boków ik oraz ij, jak na rysunku, to dostaniemy
yu = yi + (yk − yi )(xm − xi )/(xk − xi ) ,
yl = yi + (yj − yi )(xm − xi )/(xj − xi ) .
24
Poziomice III
Jeżeli xk = xi lub xj = xi to yu i yl są równe maksymalnej i minimalnej wartości
y . Podobne formuły interpolacyjne stosujemy dla z otrzymując zu i zl w
punktach (xm , yu ) i (xm , yl ) (wystarczy zamienic y -ki przez z-ty w równanich).
Znajomość granic zl i zu na linii xm pozwala znaleźć wartość z w punkcie ym
przez interpolację
z(xm , ym ) = zm = zl + (ym − yl )(zu − zl )/(yu − yl ) .
Zmieniając xm w granicach (xmin , xmax i ym oraz ym w granicach (yl , yu ) możemy
znaleźć z we wszystkich interesujących nas punktach trójkąta i − j − k. Należy
przy tym dobrać wielkość przyrostów ∆x, ∆y tak by otrzymać w miarę gładkie
krzywe.
Zadanie 5.
(Dla zainteresowanych) Napisz program dokonujący triangulacji dziedziny z = f (x, y ) i znajdujący
poziomice z = const.
25
Niewidoczne linie I
Które linie rysowanej na ekranie figury są widoczne, a które nie? Jak je
odróżnić? Problem ten prosto opisał H.N. Lerman [7]. Aby zrozumieć na czym to
polega spójrzmy na rysunek prostopadłościanu.
3
2
1
7
6
4
8
5
Rysunek 4: Prostopadłościan.
26
Niewidoczne linie II
Zewnętrzne wierzchołki prostopadłościanu wraz z łączącymi je krawędziami są
zawsze widoczne. Wewnętrzne wierzchołki mogą być albo widoczne albo
niewidoczne. Zależy to od tego, z której strony kartki papieru one się znajduje,
a więc zależy to od wartości współrzędnej z wierzchołka. Np., jeśli kartkę
papieru (ekran) ustawimy tak by przechodziła przez z = 0 to wierzchołki o
z < 0 (i punkty linii o z < 0 ) nie powinny pojawić się na rysunku.
Zadanie 6.
(Dla zainteresowanych) Napisz program, który rysuje powierzchnię z = f (x, y ) bez linii niewidzialnych.
27
Model przestrzeni kolorów RGB
Kolory RGB I
(Literatura: [8, 6])
Model barw RGB (Red, Green, Blue) jest najczęściej stosowanym standardem
przestrzeni barw. Jest to przestrzeń zwarta i taka, że punkt (rgb)=(000)
odpowiada w niej czerni, a punkt (111) bieli. Na przekątnej (000)-(111)
sześcianu RGB leżą odcienie szarości. Innym wierzchołkom sześcianu
odpowiadaja barwy podstawowe: czerwona (010), zielona (100) oraz niebieska
(001). Pozostałe barwy wierzchołkowe to żółta (110) oraz magenta (011).
Pośrednie wartości natężeń rgb dają w wyniku mieszankę barw, a więc barwę
złożoną.
28
Kolory RGB II
blue
cyan
magenta
black
white
green
red
yellow
Rysunek 5: Sześcian kolorów RGB i wartości parametrów r , g , b w jego wierzchołkach
Standard RGB stosowany jest w urządzeniach wyświetlających takich, jak
monitory oraz lampy kineskopowe TV. Obok modelu RGB stosuje się często
model barw HSB (Hue, Saturation, Brightnes). Inne standardy, takie jak CMYK
(Cyan, Magenta, Yellow) stosowane są w drukarstwie .
29
Kolory RGB III
Rysunek 6: Sześcian kolorów RGB i wartości parametrów r, g, b w jego wierzchołkach
30
Kolory RGB IV
RGB CUBE
b
(011)
(001)
(101)
(111)
(010)
(000)
g
(100)
(110)
r
Rysunek 7: Sześcian kolorów RGB
Dalej pokażemy, jak odwzorować w przestrzeń RGB funkcję określoną na
zespolonej płaszczyźnie C (lub R2 ) tak by można było śledzić jej wartości oraz
fazy. Metoda ta nadaje się np. do przedstawienia rozpraszania kwantowej
paczki falowej na dwuwymiarowym potencjale (patrz Richardson).
31
Rzutowanie R 2 →RGB I
W celu przedstawienia liczby zespolonej (x + iy ) lub pola wektorowego z R2
zastosujemy dwzorowanie stereograficzne płaszczyzny na sferę jednostkową S 2 .
Polega ono na tym, że promienie przechodzą przez biegun północny (0, 0, 1)
sfery oraz przez punkty (x, y , 0) na płaszczyżnie C. Punkty z wnętrza koła
jednostkowego odwzorowywane są na półkulę południową, punkt z = 0 na
biegun południowy, a punkty leżące poza okręgiem jednostkowym są
odwzorowane na półkulę północną. Wszystkim punktom w nieskończoności
odpowiada punkt bieguna północnego (0, 0, 1). Okrąg jednostkowy przechodzi w
tym odwzorowaniu w równik sfery. Sytuację przedstawia schematycznie rysunek.
32
Rzutowanie R 2 →RGB II
(0,0,1)
(x',y',z')
(0,0,-1)
(x, y)
Rysunek 8: Rzutowanie R2 (C) na S2
Opisane odwzorowanie jest postaci (patrz również rysunek)
(x 0 , y 0 , z 0 ) =
2x, 2y , x 2 + y 2 − 1
.
x2 + y2 + 1
(20)
Następny krok polega na zanurzeniu sfery jednostkowej w przestrzeń kolorów.
W tym celu zmniejszymy promień sfery do 1/2 i umieścimy jej środek w punkcie
33
Rzutowanie R 2 →RGB III
(r , g , b) = (1/2, 1/2, 1/2). Oś południe-północ sfery utożsamimy z kierunkiem
przekątnej sześcianu RGB (000) − (111), a więc z szarym kierunkiem czerń-biel
w przestrzeni barw. W ten sposób biegun południowy, bliski punktowi (0, 0, 0) w
RGB, jest prawie czarny - zerowa amplituda, a biegun północny prawie biały maksymalna amplituda. Aby określić jednoznacznie orientację azymutalną
zażądamy by kierunek osi y przebiegał przez maksimum natężenia czerwieni,
a więc przez punkt (010) w przestrzeni RGB.
Opisane odwzorowanie dobrze oddaje sytuację dla punktów z sąsiedztwa okręgu
jednostkowego. Początek układu oraz punkty w nieskończoności nie są
dostatecznie różne. Aby poprawić sytuację, można zamienić sferę parą stożków o
wierzchołkach w punktach (0, 0, 0) i (1, 1, 1), sklejonych na równiku sfery. W ten
sposób nie zepsujemy za bardzo obszaru równikowego i jednocześnie "dodamy
więcej punktów"w obszarze biegunów sfery, a więc łatwiej będzie rozróżnić
punkty w okolicy początku układu i w nieskończoności (rysunek).
34
Rzutowanie R 2 →RGB IV
(1,1,1)
(0,0,0)
Rysunek 9: Dwa stożki zamiast sfery S2
Odwzorowanie to ma postać
p
√
2x, 2y , sign(z)(x 2 + y 2 − 1) 3(x 2 + y 2 + 1 − 2 x 2 + y 2 )
(x 0 , y 0 , z 0 ) =
(21)
x2 + y2 + 1
35
Rzutowanie R 2 →RGB V
Dzieląc przez 2, obracając tak by osie stożków pokryły się z kierunkiem
diagonali sześcianu kolorów i przesuwając do środka sześcianu otrzymamy
ostatecznie
p
x2 + y2
1
1
2x
2
2
r = + sign(x + y − 1)( − 2
)+ √
(22)
2
2 x + y2 + 1
6(1 + x 2 + y 2 )
p
x2 + y2
1
x
1
y
)− √
g = +sign(x 2 +y 2 −1)( − 2
+√
2
2 x + y2 + 1
6(1 + x 2 + y 2 )
6(1 + x 2 + y 2 )
(23)
p
2 + y2
x
1
1
x
y
b = +sign(x 2 +y 2 −1)( − 2
)− √
−√
2
2 x + y2 + 1
6(1 + x 2 + y 2 )
6(1 + x 2 + y 2 )
(24)
Przykład tego typu odwzorowania pokazuje Rysunek 10. Przedstawiona funkcja
f (x, y ) została tylko pomalowana, tzn. (x, y ) → (r , g , b) z użyciem algorytmu
Richardsona bez specjalnych powodów.
36
Rzutowanie R 2 →RGB VI
Rysunek 10: Funkcja pokolorowana wg. algorytmu Richardsona
37
Program
Program w JavaTM , który wyznacza kolory podany jest poniżej.
\import java.awt.Color;
...
private Color toRGB(float x, float y){
// transform (x,y,z) position to color space rgb
float xy, sq, iq, eta, q1, q2, q3, r, g, b;
final float half = 0.5f;
Color color;
xy = x*x+y*y;
sq = (float)Math.sqrt(xy);
iq = 1f/(xy+1f);
eta = xy-1<=0?-1f:1f;
q1 = half+eta*(half-sq*iq);
q2 = iq/(float)Math.sqrt(6);
q3 = iq/(float)Math.sqrt(2);
r = q1 + 2*x*q2;
g = q1 - x*q2 + y*q3;
b = q1 - x*q2 - y*q3;
color = new Color(r, g, b);
return color;
}
38
Paczka falowa 2D
Przykład
Rysunek 11: Kilka kadrów z rozpraszania na kołowej jamie potencjału. Każdy rysunek
przedstawia kolejno: |ψ|2 , <ψ, =ψ oraz obie cząści ψ jednocześnie.
39
Paczka falowa 2D I
/**
* Scattering of the two dimensional wave packet
*
* @author
AB, 2001
*
* @see
JL Richardson, CPC 63, 1991, 84-94.
*
*/
import Jampack.*;
import Jampack.Times;
import java.awt.Color;
public class WavePacket {
static int xpts[], ypts[], nx, ny, drx, dry;
final static Znum CZERO = new Znum(0, 0);
double
double
double
double
tmin, t, dt;
x0, xmin, xmax, dx, xscale;
y0, ymin, ymax, dy, yscale;
hbar, mass, epsilon, xwidth, vx, ywidth, vy;
40
Paczka falowa 2D II
double
Znum
Zmat
Zmat
double
vwidth, energy, energyScale;
alpha, beta;
psi, expv;
betaeven, betaodd;
[][] re, im;
WavePacket() {
xmin = -4.;
xmax = 4.;
ymin = -4.;
ymax = 4.;
nx = 200;
ny = nx;
xpts = new int[nx];
ypts = new int[ny];
dx = (xmax-xmin)/(nx-1);
dy = (ymax-ymin)/(ny-1);
xscale = (nx-0.5)/(xmax-xmin);
yscale = (ny-0.5)/(ymax-ymin);
drx = (int)(xscale*dx + 1);
dry = (int)(yscale*dy + 1);
re = new double[nx][ny];
im = new double[nx][ny];
41
Paczka falowa 2D III
}
public void go(){
// set physics
energyScale = 1;
try {
Physics();
} catch (JampackException e){
System.out.println("Some errors...Jampack");
}
StdDraw.enableDoubleBuffering();
StdDraw.setCanvasSize(2*nx,2*ny);
StdDraw.setXscale(0,2*nx);
StdDraw.setYscale(0,2*ny);
while(true){
t += dt/10; // .15
StdDraw.clear(StdDraw.BLACK);
doStep(2);
makeGraph();
StdDraw.show();
StdDraw.pause(50);
//System.out.println(t+" "+dt);
//if(Math.round(t*100) % 60==0)
42
Paczka falowa 2D IV
//StdDraw.save("pac-"+Math.round(t) +".jpg");
}
}
/**
* Physical data of the wave packet
*/
private void Physics() throws JampackException {
// This is like in J.L. Richardson, CPC 63, 84-94, 1990
x0 = -1.2;
y0 = -1.2;
tmin = 0;
t = tmin;
hbar = 1;
mass = 100;
xwidth = 0.4;
ywidth = 0.4;
vwidth = 0.6;
vx = .6;
vy = .6;
double ds2 = dx*dx+dy*dy;
dt = 0.5 * mass * ds2 / hbar;
epsilon = hbar * dt /( mass * ds2);
43
Paczka falowa 2D V
double sin = 0.5*Math.sin(epsilon);
double cos = 0.5*Math.cos(epsilon);
alpha = new Znum(0.5 + cos,-sin);
beta = new Znum(0.5 - cos,-sin);
energy = 0.5 * mass * (vx * vx + vy * vy);
// initialize coordinates and the packet
double ex, xval, ey, yval, ang, r;
for(int x=0;x<nx;x++){
xval = xmin + dx*x;
xpts[x] = (int)(xscale*(xval - xmin));
ex = Math.exp(-((xval-x0)/xwidth)*((xval-x0)/xwidth));
for(int y=0;y<ny;y++){
yval = ymin + dy*y;
ypts[y] = (int)(yscale*(yval - ymin));
ey = Math.exp(-((yval-y0)/ywidth)*((yval-y0)/ywidth));
r = ex*ey;
ang = mass*(vx*xval+vy*yval)/hbar;
re[x][y] = r*Math.cos(ang);
im[x][y] = r*Math.sin(ang);
}
}
psi = new Zmat(re, im);
44
Paczka falowa 2D VI
psi = Star.o(norm(psi), psi);
// init expv matrix
for(int x=0;x<nx;x++){
xval = xmin + dx*x;
for(int y=0;y<ny;y++){
yval = ymin + dy*y;
r = Potential(xval, yval)*dt/hbar;
re[x][y] = Math.cos(r);
im[x][y] = -Math.sin(r);
}
}
expv = new Zmat(re, im);
// betaeven(), betaodd() are defined to be zero on odd
// or even sites respectively and beta otherwise
betaeven = new Zmat(nx, ny);
betaodd = new Zmat(nx, ny);
for(int x=0;x<nx;x++)
for(int y=0;y<ny;y++){
if((x+y)%2!=0){
betaeven.put0(x, y, CZERO);
betaodd.put0(x, y, beta);
45
Paczka falowa 2D VII
} else {
betaeven.put0(x, y, beta);
betaodd.put0(x, y, CZERO);
}
}
}
/**
* Potential function
* @param
x coordinate
* @param
y coordinate
* @return
the Potential
*/
double Potential(double x, double y){
//wall or row
//return x+y < 0 ? 0 : energy*energyScale;
// jama kolowa lub pien
return Math.sqrt(x*x + y*y) < vwidth ? -energy*energyScale : 0;
//return chpot(x, y);
//return 0;
}
double chpot(double x, double y) {
46
Paczka falowa 2D VIII
// 1/cosh()
double ar = Math.sqrt((x*x + y*y))/vwidth;
double ch = 2./(Math.exp(-ar)+Math.exp(ar));
ch = ch*ch;
return -.01*ch*energy*energyScale;
}
/**
* The norm of the wavefunction
*/
private double norm(Zmat psi){
Znum c = new Znum();
double d = 0;
for(int x=0;x<nx;x++)
for(int y=0;y<ny;y++){
c = psi.get0(x, y);
d += c.re*c.re + c.im*c.im;
}
return 1/Math.sqrt(d*dx*dy);
}
/**
* Stepping method for two dimensional
47
Paczka falowa 2D IX
* time dependent Schroedinger equation
*/
private void doStep(int num) {
try {
for(int k=0;k<num;k++){
psi = Star.o(expv, psi);
psi = Plus.o(Star.o(alpha, psi),
Plus.o(Star.o(betaeven, Cshift.o(psi,
Star.o(betaodd, Cshift.o(psi,
psi = Plus.o(Star.o(alpha, psi),
Plus.o(Star.o(betaeven, Cshift.o(psi,
Star.o(betaodd, Cshift.o(psi,
psi = Plus.o(Star.o(alpha, psi),
Plus.o(Star.o(betaeven, Cshift.o(psi,
Star.o(betaodd, Cshift.o(psi,
psi = Plus.o(Star.o(alpha, psi),
Plus.o(Star.o(betaeven, Cshift.o(psi,
Star.o(betaodd, Cshift.o(psi,
// norm
//System.out.println("norm = "+norm(psi));
psi = Star.o(norm(psi), psi);
}
} catch (JampackException e) {}
1, -1)),
1, +1))));
1, +1)),
1, -1))));
2, -1)),
2, +1))));
2, +1)),
2, -1))));
48
Paczka falowa 2D X
}
/**
Makes graph of <b>dens, all, re, im</b></br>
depending on no = 1, 2, 3, 4 respectively
*/
private void makeGraph(){
double f, g;
double amp = 5;
Znum p = new Znum();
for(int n=1;n<5;n++){
for(int x=0;x<nx;x++)
for(int y=0;y<ny;y++){
p = psi.get0(x, y);
switch (n) {
case 1: // density
f = (p.re*p.re+p.im*p.im)*amp;
StdDraw.setPenColor(toRGB(f, f/2));
StdDraw.filledRectangle(xpts[x], ny+ypts[y],
drx/2, dry/2);
break;
case 2: // real part
f = p.re*amp;
49
Paczka falowa 2D XI
g = (p.re*p.re+p.im*p.im)*amp;
StdDraw.setPenColor(toRGB(f, g));
StdDraw.filledRectangle(nx+xpts[x], ny+ypts[y],
drx/2, dry/2);
break;
case 3: // imaginary part
f = p.im*amp;
g = (p.re*p.re+p.im*p.im)*amp;
StdDraw.setPenColor(toRGB(g, f));
StdDraw.filledRectangle(xpts[x], ypts[y],
drx/2, dry/2);
break;
case 4: // both re and im
StdDraw.setPenColor(toRGB(p.re*amp, p.im*amp));
StdDraw.filledRectangle(nx+xpts[x], ypts[y],
drx/2, dry/2);
break;
}
}
}
StdDraw.setPenColor(StdDraw.WHITE);
StdDraw.text(30,2*ny-20,"abs(f)");
StdDraw.text(nx+30,2*ny-20,"Re(f)");
50
Paczka falowa 2D XII
StdDraw.text(30,nx-20,"Im(f)");
StdDraw.setPenColor(StdDraw.BOOK_BLUE);
StdDraw.line(0, ny, 2*nx, ny);
StdDraw.line(nx, 0, nx, 2*ny);
}
/**
* Calculates RGB color; (x, y) -> to (r, g, b)
* @param
x
* @param
y - coordinates on C2
* @return Color
*/
private static Color toRGB(double x, double y){
// transforms (x, y) to color space rgb
double xy, sq, iq, eta, q1, q2, q3, r, g, b;
final double half = 0.5;
Color color;
xy = x*x+y*y;
sq = Math.sqrt(xy);
iq = 1/(xy+1);
eta = xy-1<=0?-1:1;
q1 = half+eta*(half-sq*iq);
q2 = iq/Math.sqrt(6);
51
Paczka falowa 2D XIII
q3 = iq/Math.sqrt(2);
r = q1 + 2*x*q2;
g = q1 - x*q2 + y*q3;
b = q1 - x*q2 - y*q3;
r = r<0 ? 0 : r;
g = g<0 ? 0 : g;
b = b<0 ? 0 : b;
color = new Color((float)r, (float)g, (float)b);
return color;
}
public static void main(String[] argv){
WavePacket pac = new WavePacket();
pac.go();
}
}
52
Literatura I
L. Schiff, Mechanika kwantowa. PWN, Warszawa, 1977, str.102 oraz
rozdział 12.
A. Goldberg, H.M. Schey. J.L. Schwartz, Computer-Generated Motion
Pictures of One-Dimensional Quantum Mechanical Transmission and
Reflection Phenomena, Am. J. Phys, 35, 177 (1967).
P.B. Visscher, Comp. in Phys., 5, 596-598 (1991).
M. Horbatsch. Quantum Mechanics Using Maple. Springer, 1995.
Galbraith, I., Ching, Y. S., & Abraham, E. Am. J. Phys, 52, 60 (1984).
Richardson, John L., Visualizing quantum scattering on the CM-2
supercomputer, Computer Physics Communications, 63, 84-94 (1991).
H.N. Lerman. Software Age, July, 1970.
J. Foley i inni. Wprowadzeie do grafiki komputerowej. WNT, Warszawa,
2001.
53
Thank you!
54