Computerorientierte Physik / SS2011 Stefan Rosenberger 25. Juni 2011 Inhaltsverzeichnis 1 Nummerische Lösung des Doppelpendels 1.1 Beschreibung der Problemstellung . . . . . . . . . . . . . 1.2 Mathematische Beschreibung des Problems . . . . . . . . 1.3 Nummerische Lösung der einfachen Differentialgleichnung 1.4 Analyse von chaotischen Verhalten und Stabilitätsanalyse 1.5 Auswertung und Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Berechnung von elektrostatischen Potentialen 2.1 Beschreibung der Problemstellung und Grundlegende Gleichungen 2.2 Numerische Lösung von Poisson- und Laplace Gleichung . . . . . . 2.3 Realisierung des Verfahrens . . . . . . . . . . . . . . . . . . . . . . 2.4 Auswertung und Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 . 8 . 8 . 10 . 12 3 Berechnung des Ising Modells mit der Monte Carlo Simulation 3.1 Beschreibung der Problemstellung . . . . . . . . . . . . . . . . . . 3.2 Monte-Carlo Simulation . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Technische Details, Berechnung von Observablen . . . . . . . . . . 3.4 Auswertung und Graphen . . . . . . . . . . . . . . . . . . . . . . . 3.5 Auszug aus dem Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 15 17 18 23 4 Molecular-Dynamic-Simulation 4.1 Beschreibung der Problemstellung . . . . . . . . . . 4.2 Grundgleichungen für klassische Molucular-Dynamic 4.3 Schritte zur praktischen Implementierung . . . . . . 4.4 Graphen . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Auszug aus dem Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 25 25 26 28 38 5 Numerische Lösung der eindimensionalen Schrödingergleichung 5.1 Beschreibung der Problemstellung . . . . . . . . . . . . . . . . . . . 5.2 Der unendlich tiefe Potentialtopf . . . . . . . . . . . . . . . . . . . . 5.3 Bestimmung der Korrekten Energie Eigenwerte E . . . . . . . . . . . 5.4 Auszug aus meinem Code . . . . . . . . . . . . . . . . . . . . . . . . 5.5 Auswertung und Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 41 42 43 43 45 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 4 5 . . . . . . . . . . . . . . . . . . . . . . . . . 6 Lösung der 1-dim. zeitabhängigen Schrödingergleichung 55 6.1 Beschreibung der Problemstellung und Algorithmus . . . . . . . . . . . . . . . . 55 6.2 Auswertung und Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 1 1 Nummerische Lösung des Doppelpendels 1.1 Beschreibung der Problemstellung In diesem Projekt wird als Ausgangsproblem ein zwei dimesionales Doppelpendel betrachtet. Der Ortsraum wird hierbei durch {(x, z)T |x, z ∈ R} beschrieben. Das erste Pendel ist an einem Fixpunkt x0 = (0, 2 · L)T aufgehängt, und kann sich mit konstantem Abstand L > 0 um diesen Punkt bewegen. Das zweite Pendel wird am Massepunkt des ersten Pendels aufgehängt, und kann sich mit konstantem Abstand L > 0 um dieses bewegen. Beide Pendel haben jeweils die Masse m. Zur Vereinfachung wird angenommen dass die Verbindungen kein Gewicht aufweisen, die Rotationsbewegung reibungsfrei verläuft und nur die Gravitationsbeschleunigung g = 9, 81 sm2 wirkt. 1.2 Mathematische Beschreibung des Problems Zur Lösung werden die Hamilton’schen Gleichungen verwendet. Alternativ hätten auch die Lagrange Gleichungen das Problem beschreiben können, da diese jedoch Differentialgleichungen 2-ter Ordnung sind, die Hamilton’schen Gleichungen hingegen Differentialgleichungen 1-ter Ordnung sind, sind sie bei nummerischer Näherung durch den Computer wesentlich leichter, insbesondere bei weniger Rechenschritten genauer, zu lösen. Hierfür wird das Problem in Polarkoordinaten umgeschrieben: 1. Pendel 2. Pendel x1 = L · sin(Θ1 ) z1 = 2 · L − L · cos(Θ1 ) x2 = L · sin(Θ1 ) + L · sin(Θ2 ) z2 = 2 · L − L · cos(Θ1 ) − L · cos(Θ2 ) Wobei Θ1 den Winkel beschreibt der vom ersten Pendel und der negativen z-Achse eingeschlossen wird und Θ2 jenen der vom zweiten Pendel und der negativen z-Achse eingeschlossen wird. Somit kann die Lagrange Funktion aufgestellt werden: L=T −U = m · L2 2 · Θ˙ 21 + Θ˙ 22 + 2Θ̇1 Θ̇2 cos(Θ1 − Θ2 ) − m · g · L (3 − 2 cos(Θ1 ) − cos(Θ2 )) 2 2 Daraus berechnen sich die verallgemeinterten Impulse: p1 = m · L2 ∂L = (4Θ̇1 + 2Θ̇2 cos(Θ1 − Θ2 )) 2 ∂ Θ̇1 m · L2 ∂L = (2Θ̇2 + 2Θ̇1 cos(Θ1 − Θ2 )) 2 ∂ Θ̇2 Mit diesen Gleichungen lassen sich die Hamilton Funktion und daraus die Hamilton’schen Gle∂H ∂H ichungen Θ̇i = ∂p , p˙i = − ∂Θ aufstellen. i i p2 = H=T +U = p˙1 = − p2 + 2p22 − 2p1 p2 cos(Θ1 − Θ2 ) 1 · 1 + m · g · (3 − 2 cos(Θ1 ) − cos(Θ2 )) 2 2mL 1 + sin(Θ1 − Θ2 )2 Θ̇1 = 1 p1 − p2 cos(Θ1 − Θ2 ) · mL2 1 + sin(Θ1 − Θ2 )2 Θ̇2 = 1 2p2 − p1 cos(Θ1 − Θ2 ) · mL2 1 + sin(Θ1 − Θ2 )2 1 p21 + 2p22 − 2p1 p2 cos(Θ1 − Θ2 ) 1 p1 p2 sin(Θ1 − Θ2 ) · + · sin(Θ1 −Θ2 ) cos(Θ1 −Θ2 ) mL2 1 + sin(Θ1 − Θ2 )2 mL2 1 + sin(Θ1 − Θ2 )2 −2mgL sin(Θ1 ) p˙2 = − 1 p1 p2 sin(Θ1 − Θ2 ) 1 p21 + 2p22 − 2p1 p2 cos(Θ1 − Θ2 ) · − · sin(Θ1 −Θ2 ) cos(Θ1 −Θ2 ) mL2 1 + sin(Θ1 − Θ2 )2 mL2 1 + sin(Θ1 − Θ2 )2 −mgL sin(Θ2 ) Um die Notation zu vereinfachen werden im folgenden die Zustände ~y (t) ∈ P := {(Θ1 (t), Θ2 (t), p1 (t), p2 (t))T |∀t ≥ 0Θ1 (t), Θ2 (t), p1 (t), p2 (t) ∈ R} betachtet. Damit lassen sich die Bewegungsgleichungen vereinfacht schreiben: ~y˙ (t) = F~ (~y (t)) 1.3 (1) Nummerische Lösung der einfachen Differentialgleichnung Zur Lösung von 1 haben wir zwei Diskretisierungsverfahren besprochen. Euler-Methode Die Euler Methode verwendet die Potenzreihenentwicklung einer reell analytischen Funktion, und bricht diese beim quadratischen Term ab. f (t + ε) = f (t) + εf 0 (t) + ε2 00 f (t) + ... 2 =⇒ ~y (t + ε) = ~y (t) + εF~ (~y (t), t) + O(ε2 ) Mithilfe dieser Beschreibung der Differentialgleichung lässt sich eine rekursive Definition, beginnend mit der Zeit t0 = 0, angeben: ~y (t0 ) = ~y (0) ~y (tn+1 ) = ~y (tn ) + εF~ (~y (tn ), tn ) mit tn+1 = tn + ε 3 Runge-Kutter 4 Das Runge Kutter 4 Verfahren verwendet zusätzliche Stützstellen bei ~y (tn + 2ε ), insgesamt werden 4 Stützstellen betrachtet. Durch geeignete Linearkombination werden alle Korrekturen bis inklusive ε4 wegfallen, womit der Fehler des Iterationsverfahrens nur noch der Ordnung ε5 ist. Ein Herzstück des Verfahrens sind die vier Stützstellen: ~k1 = F~ (~y (tn ), tn ) ~k2 = F~ (~y (tn ) + ε ~k1 , tn + ε ) 2 2 ~k3 = F~ (~y (tn ) + ε ~k2 , tn + ε ) 2 2 ~k4 = F~ (~y (tn ) + ε~k3 , tn + ε) Mit diesen Gleichungen ergibt sich die Iterationsvorschrift: ε ~y (tn + ε) = ~y (tn ) + (~k1 + 2~k2 + 2~k3 + ~k4 ) + O(ε5 ) 6 1.4 Analyse von chaotischen Verhalten und Stabilitätsanalyse Um das System auf chaotisches Verhalten zu überprüfen haben wir Poincare Schnitte, und für die Stabilitätsanalyse haben wir die Ljapunov-Stabilität besprochen. Poincare Schnitte Hierfür wird das Problem im Phasenraum P betrachtet. Wenn der Raum P die Dimension k hat, so kann man diese durch Erhaltungsgrößen reduzieren, denn jede Erhaltungsgröße reduziert die Dimension der Untermanigfaltigkeit (welche die Bewegung beschreibt) im Phasenraum. Beim Problem des Doppelpendes ist (für g 6= 0) nur die Energie erhalten. (Für g = 0 gilt zusätzlich die Drehimpulserhaltung) Das Doppelpendel bewegt sich in einem vier dimensionalen Raum. Mithilfe der Energieerhaltung verbleibt also eine 3-dimensionale Untermanigfaltigkeit für die Bewegung des Pendels. Um im verbleibenden Raum Stabilitätseigenschaften zu erkennen, betrachten wir 2-dimensionale Unterräume, indem wir eine Komponente Null setzen. Ist im System Stabilität gegeben so kann man eine weitere Einschränkung erkennen, die Bewegung des Pendels kann in solchen Fällen eine (eindimensionale) Kurve beschreiben. In unserem Problem wird die Differentialgleichung in diskreten Schritten beschrieben. Da hierbei der Fall dass eine Komponente genau gleich 0 ist selten (bzw. so gut wie garnicht) auftritt kann man für die Poincare Schnitte verschiedene Konzepte verwenden. Hier zwei Möglichkeiten: 1. Man betrachte all jene Punkte für die die einzuschränkende Komponente sich in einer ε-Umgebung um Null befindet. 2. Man nutzt die Eigenschaft dass die Bewegung des Pendels ein stetiger Vorgang ist, daher kann man jene Punkte betrachten an denen die einzuschränkende Komponente das Vorzeichen wechselt. Beide Konzepte haben Vorteile und Nachteile: 1. Wenn man nur eine kleine Umgebung um die Nullstelle betrachtet so kann es sein, dass, falls ε sehr klein gewählt wurde, viele Nullstellen nicht berücksichtigt werden. Was entweder zu sehr langen Rechenzeiten führt oder es nicht ermöglicht eine Stabilität zu erkennen. Falls die Umgebung zu groß gewählt wurde vermischen sich die eigentlichen Nullstellen mit Punkten (bzw. Untermanigfaltigkeiten) welche nicht zur Einschränkung gehören, was dazu führen kann dass die mögliche Kurve ”verwischt”bzw. durch ”rauschen”verzerrt wird. 4 2. Wenn man das Wechseln der Vorzeichen betrachtet so findet man so gut wie alle Nullstellen. Bei großen Änderungsraten des Systems können jedoch viele Punkte in den Schnitten auftauchen die weit von der Nullstelle entfernt sind. Ljapunov Analyse Bei der Ljapunov Analyse der Stabilität betrachtet man die Differenz zweier nahe beisammen liegender Startbedingungen, also der Form: ~y (t, ~y0 ) und ~y (t, ~y00 ) = y(t, ~y0 + ~ε). Die Idee besteht darin die Differenz dieser Startbedinungen ∆(t) = k~y (t, ~y0 ) − ~y (t, ~y00 )k zu betrachten. Mithilfe dieser Abschätzung kann man folgendes schließen: ∆(t) wächst schnell =⇒ Chaotisches System ∆(t) bleibt klein =⇒ Reguläres Verhalten Das Problem in der Praxis besteht natürlich darin dass die Beschreibung nahe beisammen sehr dehnbar ist. Mathematisch lässt sich die Ljapunov Stabilität für einen Startvektor ~y (t, ~y0 ) wie folgt definieren: . (∀ε > 0)(∃δε > 0)(∀~y00 )..k~y0 − ~y00 k < δε =⇒ k~y (t, ~y0 ) − ~y 0 (t, ~y00 )k < ε 1.5 Auswertung und Graphen Ich habe das Problem mit C ++ beschrieben und die Visualisierung mit Matlab gemacht. Hier ein Auszug aus meinem Code: Runge Kutter 4 // yy a k t u e l l e F u n k t i o n s w e r t ; t t a k t u e l l e Z e i t ; eps Z e i t s c h r i t t v e c t o r <double> RK4( c o n s t v e c t o r <double>& yy , c o n s t d o u b l e t t , const double eps ) { v e c t o r <double> k1 (NN) , k2 (NN) , k3 (NN) , k4 (NN) ; v e c t o r <double> YY(NN) , y y t i l d e (NN) ; double t t t i l d e ; k1 = Fkt ( yy , t t ) ; // E r s t e r S c h r i t t f o r ( i n t i =0; i <NN; i ++) { y y t i l d e [ i ] = yy [ i ] + e p s /2 * k1 [ i ] ; } t t t i l d e = t t + eps /2; k2 = Fkt ( y y t i l d e , t t t i l d e ) ; // Z w e i t e r S c h r i t t f o r ( i n t i =0; i <NN; i ++) { y y t i l d e [ i ] = yy [ i ] + e p s /2 * k2 [ i ] ; } k3 = Fkt ( y y t i l d e , t t t i l d e ) ; f o r ( i n t i =0; i <NN; i ++) { 5 // D r i t t e r S c h r i t t y y t i l d e [ i ] = yy [ i ] + e p s * k3 [ i ] ; } t t t i l d e = t t + eps ; k4 = Fkt ( y y t i l d e , t t t i l d e ) ; // V i e r t e r S c h r i t t f o r ( i n t i =0; i <NN; i ++) // Der zuruckzugebende Vektor { YY[ i ] = yy [ i ] + e p s /6 * ( k1 [ i ] + 2 * k2 [ i ] + 2 * k3 [ i ] + k4 [ i ] ) ; } r e t u r n YY; } Um zu prüfen ob das Programm das gewünschte Resultat liefert wurde zusätzlich die Gesamtenergie berechnet. Da dies eine Erhaltungsgröße ist soll sich diese nicht ändern. Auswertung und Graphen Die ersten beiden Graphen zeigen die Winkel der Testwerte, das zweite Paar an Graphen zeigt die Poincare Schnitte. Für den Startwert (1, −1, 3, 0) kann man auf reguläres Verhalten schließen, für den Startwert (0, 0, 4, −2) kann man auf chaotisches Verhalten schließen. Die ersten beiden Graphen zeigen die ersten 20.000 Schritte (bei einer Zeitänderung von 0, 01). Die zweiten beiden Graphen zeigen die Nullstellen von Θ2 , falls der dazugehörige Impuls p2 größer Null ist. Poincare Schnitte 6 Ljapunov Analyse Um die Stabilitätsanalyse nach Ljapunov durchzuführen wurden die Startbedingungen (1, −1, 3, 0) und (1, −1, 2.9, 0.1) für die erste Differenz sowie (0, 0, 4, −2) und (0, 0, 3.9, −2.1) für die zweite Differenz betrachtet. Auch hierbei ist das Verhalten von chaotisch und regulär gleich dem Re- sultat aus den Poincare Schnitten. 7 2 2.1 Berechnung von elektrostatischen Potentialen Beschreibung der Problemstellung und Grundlegende Gleichungen Dieser Abschnitt hat das Ziel ein beliebiges Elektrostatisches Potential zu berechnen wenn die Randbedingungen oder die Ladungsverteilung vorgegeben sind. ~ dass Bei einer gegebenen kontinuierliche Ladungsverteilung gilt für das Elektrische Feld E Z ~r − ~r0 3 0 ~ E(~r) = ρ(~r0 ) d ~r . k~r − ~r0 k3 Wegen ∇ 1 1 ~r − ~r0 1 1 0 p = − 2(~ r − ~ r ) = − = ∇ ~r − ~r0 2 (~r − ~r0 ) 32 k~r − ~r0 k3 (~r − ~r0 )2 gilt ~ r) = −∇ E(~ Z ρ(~r0 ) 3 0 d ~r := −∇φ(~r). k~r − ~r0 k wobei φ(~r) das Elektrostatische Potential beschreibt. Aus dieser Beziehung folgt ~ r) = ∇(−∇φ(~ ~ r) = −4φ(~r) = 4πρ(~r) ∇E(~ Damit lässt sich das Problem als Laplace bzw. Poisson Gleichung formulieren: 4φ(~r) = −4πρ(~r) .....Piosson Gleichung 4φ(~r) = 0 .....Laplace Gleichung 2.2 Numerische Lösung von Poisson- und Laplace Gleichung Für unser Problem betrachten wir Differentialgleichungen die vorgegebene Randbedingungen erfüllen. Der Ansatz zur Lösung ist ähnlich zum Doppelpendel eine Diskretisierung des Raums. Eine Standard-Diskrtetisierung für die zweite Ableitung einer gegebenen Funktion f resultiert wie folgt. Da f zwei mal stetig differenzierbar ist können wir eine Taylor-Reihen Entwicklung betrachten: f (x + ε) = f (x) + f 0 (x)ε + f 00 (x) ε2 ε3 ε4 + f 000 (x) + f (4) (x) + O(ε5 ) 2 6! 4! ε2 ε3 ε4 − f 000 (x) + f (4) (x) + O(ε5 ) 2 6! 4! Addieren und umformen der Gleichungen liefert: f (x − ε) = f (x) − f 0 (x)ε + f 00 (x) f 00 (x) = [f (x + ε) − 2f (x) + f (x − ε)] 1 + O(ε2 ) ε2 (2) Zuerst betrachten wir die Laplace-Gleichung 4φ(~r), und eine Diskretisierung der Koordinaten (n) (0) xi = xi + δi · n wobei n ∈ {1, 2, ..., Ni } gilt. Um die Beschreibung zu vereinfachen wird im folgenden angenommen dass δi = δ gilt ∀i. Mit der eben gezeigten Repräsentation der zweiten Ableitung folgt nun für den Laplace-Operator: 4φ(~r) = d X ∂2 φ(x1 , .., xi , .., xd ) = ∂x2i i=0 8 = d X φ(x1 , .., xi + δ, .., xd ) − 2φ(x1 , .., xi , .., xd ) + φ(x1 , .., xi − δ, .., xd ) δ2 i=0 Führt man noch den Vektor î = (0, ..., 1, ..., 0)T (der i-te Einheitsvektor) ein so folgt: 4φ(~r) = d X φ(~r + îδ) − 2φ(~r) + φ(~r − îδ) δ2 i=0 Somit gilt: 2 δ 4φ(~r) = d X φ(~r + îδ) − 2φ(~r) + φ(~r − îδ) = δ 2 ρ(~r) i=0 =⇒ d X φ(~r + îδ) + φ(~r − îδ) = 2dφ(~r) + δ 2 ρ(~r) i=0 " d # 1 X 1 =⇒ φ(~r) = φ(~r + îδ) + φ(~r − îδ) + δ 2 ρ(~r) 2d 2d i=0 Wenn man sich diese Gleichung etwas näher ansieht, so kann man erkennen das der Funktionswert an der Position ~r dem Mittlewert der Funktionswerte aller 2d Nachbarn entspricht (natürlich mit einem Fehler der Ordnung O(ε2 )). Um diese Gleichung zu nähern betrachten wir ein Relaxationsverfahren, welches folgende Grundstruktur hat: Verwende Generationen von Feldwerten φ(n) (~r), n = 0, 1, 2, ... Die Feldwerte der Anfangskonfiguration φ(0) (~r) müssen vorgegeben werden. (Nach Möglichkeit sollten diese Anfagswerte geschickt gewählt werden, dass kann die Rechenzeit deutlich verkürzen) Schreibe eine Masterschleife: Bei jedem Durchlauf wird an jedem Gitterpunkt der Mittelwert der Nachbarn gebiltet (+eventuell Korrektur bei ρ 6= 0). Dieser Mittelwert ersetzt den alten Feldwert −→ φ(n+1) (~r). Die Masterschleife endet wenn bei einer vorgegebenen Fehlerschrankt ε für alle ~r gilt d h 1 X i 2 δ φ(n) (~r + îδ) − φ(n) (~r − îδ) − φ(n) (~r) − ρ(~r) ≤ ε 2d 2d i=0 Für die Relaxationsverfahren Haben wir drei Beschreibungen der Generationen besprochen: Jakobi-Methode φ (n+1) " d # 1 X (n) 1 (n) (~r) = φ (~r + îδ) + φ (~r − îδ) + δ 2 ρ(~r) 2d 2d i=0 φ(n+1) (~r) in ein Hilfsfeld einschreiben. Wenn die Werte φ(n+1) (~r) für alle ~r berechnet sind, wird das Masterfeld mit dem Hilfsfeld überschrieben. 9 Gauß-Seidl-Methode " d # X 1 1 φ(n+1) (~r) = φ(n) (~r + îδ) + φ(n+1) (~r − îδ) + δ 2 ρ(~r) 2d 2d i=0 Hierbei wird jeder berechnete Feldwert sofort weiterverwendet. Dieses Verfahren benötigt zum einen kein Hilfsfeld und konvergiert zusätzlich deutlich schneller als die JakobiMethode. Sukzessive Überrelaxation Definiere die Gauß-Seidl-Methode durch: " d # 1 X (n) 1 φ(~r) = φ (~r + îδ) + φ(n+1) (~r − îδ) + δ 2 ρ(~r) 2d 2d i=0 Man betrachte nun folgende Gleichung: h i φ(n+1) (~r) = φ(n) (~r) + ω φ(~r) − φ(n) (~r) ω = 1 ⇒ Gauß-Seidl Methode ω > 1 ⇒ Überrelaxation ω < 1 ⇒ Unterrelaxation Ein Theorem besagt dass die Relaxation nur für 0 < ω < 2 konvergieren kann und dass nur bei Überrelaxation (ω > 1) das Verfahren schneller konvergieren kann als Gauß-Seidl. Die Geschwindigkeit des Algorithmus ist sehr sensitiv auf ω. Leider gibt es kaum allgemeine Aussagen über die Wahl von ω −→ ausprobieren. 2.3 Realisierung des Verfahrens Um das Hilfsfeld und die Funktionswerte von φ effizient aufrufen zu können verwenden wir einen sogenannten aufgerollten Index. Bei einem d-dimensionalen N1 × N2 × ... × Nd -Gitter und einem gegebenen Vektor (n1 , n2 , ..., nd ) ist der Index gegeben durch k = n1 + n2 · N1 + n3 · N1 · N2 + ... + nd · N1 · N2 · ... · Nd−1 Weiters ist es hilfreich ein sogenanntes Nachbarfeld als Hilfsfeld zu erzeugen. Ich habe diesen aufgerollten Index und das Hilfsfeld mit C++ wie folgt realisiert: // I n i t i a l i s i e r e n e i n e s d d i m e n s i o n a l e n G i t t e r s v o i d n e i b i n i t ( i n t d , v e c t o r <v e c t o r <i n t > > & neib , c o n s t v e c t o r <i n t > & Abmessung ) { v e c t o r <i n t > xx ( d ) , xxp ( d ) , xxm( d ) ; i n t k=0; S c h l e i f e ( d , k , neib , Abmessung , xx , xxp , xxm ) ; } //******************************************************************* // k i s t Z a e h l v a r i a b l e d i e zu Beginn 0 s e i n muss // Das Feld n e i b hat dann am Ende im : 10 / / 0 . t e n E i n t r a g den Nachbar d e r 1 . t e n Achse i n Plus Richtung / / 1 . t e n E i n t r a g den Nachbar d e r 1 . t e n Achse i n Minus Richtung / / 2 . t e n E i n t r a g den Nachbar d e r 2 . t e n Achse i n Plus Richtung / / 3 . t e n E i n t r a g den Nachbar d e r 2 . t e n Achse i n Minus Richtung // e c t . v o i d S c h l e i f e ( c o n s t i n t d , i n t k , v e c t o r <v e c t o r <i n t > > & neib , c o n s t v e c t o r <i n t > & Abmessung , v e c t o r <i n t > xx , v e c t o r <i n t > xxp , v e c t o r <i n t > xxm) { // Rufe d i e S c h l e i f e a u f b i s a l l e Dimensionen e r r e i c h t s i n d i f ( k<d−1) { i n t p = k+1; f o r ( i n t i =0; i <Abmessung [ k ] ; i ++) { xx [ k ] = i ; xxp [ k ] = i +1; xxm [ k ] = i −1; i f ( xx [ k ] == Abmessung [ k ] −1) xxp [ k ] = 0 ; i f ( xx [ k ] == 0 ) xxm [ k ] = Abmessung [ k ] −1; // Rufe d i e S c h l e i f e e r n e u t a u f S c h l e i f e ( d , p , neib , Abmessung , xx , xxp , xxm ) ; } } else { v e c t o r <i n t > n a c h b a r p l u s ( d ) , nachbarminus ( d ) ; i n t i s , i s p , ism ; f o r ( i n t i =0; i <Abmessung [ k ] ; i ++) { xx [ k ] = i ; xxp [ k ] = i +1; xxm [ k ] = i −1; i f ( xx [ k ] == Abmessung [ k ] −1) xxp [ k ] = 0 ; i f ( xx [ k ] == 0 ) xxm [ k ] = Abmessung [ k ] −1; // Berechne d i e a k t u e l l e P o s i t i o n i s = i n d e x ( xx , Abmessung , d ) ; f o r ( i n t q=0; q<d ; q++) { n a c h b a r p l u s = xx ; nachbarminus = xx ; n a c h b a r p l u s [ q ] = xxp [ q ] ; nachbarminus [ q ] = xxm [ q ] ; i s p = i n d e x ( n a c h b a r p l u s , Abmessung , d ) ; 11 ism = i n d e x ( nachbarminus , Abmessung , d ) ; neib [ i s ] [ 2 * q ] = isp ; n e i b [ i s ] [ 2 * q+1] = ism ; } } } } //******************************************************************* // Berechnen d e s ” a u f g e r o l l t e n ” Index i n t i n d e x ( c o n s t v e c t o r <i n t > & xx , c o n s t v e c t o r <i n t > & abm , const int d) { i n t i s = xx [ 0 ] ; i n t NN = 1 ; f o r ( i n t i =1; i <d ; i ++) { NN = NN*abm [ i − 1 ] ; i s += xx [ i ] * NN; } return i s ; } 2.4 Auswertung und Graphen Ich habe diese Konzepte nun zum Einen angewand um das Potential eines Dipols (mit Laplace) und zum Anderen einen Kondensator mit integrierten Faradyschen Käfig darzustellen. Da ich mein Programm für beliebige Dimensionen erweitert habe, habe ich auch einen Kondensator mit integrierten Faradayschen Käfig in 3 Dimensionen simuliert. Hierfür habe ich folgende Randbedingungen betrachtet: Ein 3 dimensionaler Würfel mit den Rasterabmessungen 45 × 45 × 45. Im inneren befindet sich ein Fraday Käfig mit den Rasterabmessungen 25 × 25 × 25 der zentriert platziert wurde. Die Darstellung des Potential ist natürlich nicht direkt möglich, daher habe ich 8 plots des Potential gemacht, wobei jeweils das Potential in der x − y-Ebene für fixierte z-Werte geplottet wurde. 12 13 Abbildung 1: Kondensator mit Farady Käfig in 3 Dimensionen 14 3 3.1 Berechnung des Ising Modells mit der Monte Carlo Simulation Beschreibung der Problemstellung In diesem Beispiel betrachten wir ein d-dimensionales kubisches Gitter Ω an dem an jedem Punkt ~n ∈ Ω ein Teilchen mit Spin S~n ∈ {−1, 1} sitzt. Die Randbedingungen sollen periodisch sein, soll heißen dass die Ränder zusammengeklappt“ werden. ” Mikroskopisches Modell Die Hamiltonfunktion für das Modell lässt sich schreiben als: d H[S] = α XX µX (1 − S~n ) (1 − S~n · S~n+î ) + 2 2 ~ n i=1 ~ n wobei α ∈ R die nächste Nachbarkopplung und µ ein äußeres Magnetfeld beschreibt und î = (0, ..., 0, 1, 0, ..., 0) der i-te Einheitsvector ist. Damit lässt sich nun die Entwicklung abhängig vom Zustand betrachten: Grundzustand: Alle Spins ↑= +1 damit gilt H = 0. 1. angeregter Zustand: Ein Spin ↓= −1 sonst sind alle Spins ↑ dann gilt H = 2dα + µ. 2. angeregter Zustand: Zwei benachbarte Spins ↓↓ dann gilt H = (4d − 2)α + 2µ. 3. angeregter Zustand: Zwei nicht benachbarte Spins ↓↓ dann gilt H = 4dα + 2µ. .. . Nun wird angenommen dass das System (Ising Magnet) in einem Wärmebad ist, und daher wird eine konstante Temperatur T betrachtet. Ein solches System kann mit dem kanonischen Ensamble beschrieben werden. Die Wahrscheinlichkeit das System in einem Zustand S zu finden ist gegeben durch: P (S) = X 1 −βH[S] 1 e mit Z = e−βH[S] ; β = Z kB T S wobei kB die Boltzmann Konstante ist. Der Erwartungswert einer Observablen O(S) ist gegeben durch: X 1 X hOiT = O(S) · P (S) = O(S)e−βH[S] Z S 3.2 S Monte-Carlo Simulation Zur Berechnung der Observablen werden sehr viele Beiträge benötigt. Für auch nur annähernd realistische Systeme ist es praktisch unmöglich alle Beiträge zu berücksichtigen, daher verwenden wir eine Monte-Carlo Simulation um uns bei einem großen System der Lösung anzunähern. Idee der Simulation: Man ersetzte die Summe über alle Konfigurationen durch eine Summe über eine mit Zufallsmethoden generierte Untermenge von Konfigurationen. S (t) für t = 1, ..., N 15 seien die Konfigurationen die durch einen Zufallsprozess erzeugt werden. (N <<< 2V ) N 1 X (t) O[S (t) ]e−βH[S ] Z hOi ∼ t=1 Z∼ n X e−βH[S (t) ] t=1 Um die Zufallsmethode umzusetzen haben wir zwei Möglichkeiten kennengelernt: Simple sampling: (Naive Methode) Hierbei wird S (t) als gleichverteilt angenommen und hofft daß hOiT ∼ N 1 X (t) O[S (t) ]e−βH[S ] ZN t=1 Dieser direkte Ansatz funktioniert im Allgemeinen nicht, nur für T −→ ∞ ist dieser brauchbar, denn dann strebt der Boltzmann Faktor gegen 1. Importance Sampling: Man wählt die Konfiguration nicht gleichverteilt sondern nach einer Verteilung R[S (t) ]. Dann gilt hOiN (t) N 1 X e−βH[S ] = O[S (t) ] (t) ZN R[S ] t=1 mit ZN = (t) N X e−βH[S ] R[S (t) ] t=1 Eine Gute Wahl für viele Anwendungen ist: R[S (t) ] = mit ζN = 1 −βH[S (t) ] e ζN N X e−βH[S (t) ] t=1 Somit erhalten wir für unser Model: hOiN N N t=1 t=1 X X 1 = ζN O[S (t) ]; ZN = ζN = N ζN ZN Daher erhalten wir den Erwartungswert approximiert durch einen einfachen Mittelwert der Observablen über alle N Konfigurationen: hOiN ' N 1 X O[S (t) ] N t=1 Es gilt: hOi = hOiN + o 1 √ N 16 =⇒ lim hOiN = hOi N →∞ Es bleibt nun die Aufgabe die Konfigurationen zu S (t) gemäß einer Verteilung P [S (t) ] zu erzeu(t) gen. (bei uns gilt P [S (t) ] ∼ e−βH[S ] ). Dafür verwenden wir das Konzept der Markov Ketten: Man geht Schrittweise auf einem Pfad von aufeinander folgenden Konfigurationen S (t) durch den Raum aller Konfigurationen. Die Konfiguration S (t+1) wird aus der Konfiguration S (t) durch einen Zufallsprozess erzeugt. Der Zufallsprozess wird durch eine Übergangswahrscheinlichkeit charakterisiert: W (S (t+1) ) = S 0 |S (t) = S) = W (S → S 0 ) Wir verwenden für unser Model die Detailed balance Gleichung: 0 e−βH[S] W (S → S 0 ) = e−βH[S ] W (S 0 → S) Bildet man die Summe über alle Konfigurationen S dann folgt: X X e−βH[S] W (S → S 0 ) = e−βH[S] W (S 0 → S) = e−βH[S] S S Ein attraktiver Fixpunkt dieser Abbildung ist die Zielverteilung (gewünscht) e−βH[S] Metropolis Algorithmus: Hier die Struktur des Metropolis Algorithmus für das Ising Modell 1. Wähle einen Gitterpunkt ~n0 Die Angebotskonfiguration S̃ unterscheidet sich von S nur durch den Spin S~n0 dessen Vorzeichen umgedreht wurde. 2. Berechnen der Übergangswahrscheinlichkeit: " ±d #! ±d α X α X e−βH[S̃] (1 − (−S~n0 )S~n0 +î ) − (1 − S~n0 S~n0 +î ) ρ = −βH[S] = exp −β 2 2 e i=±1 i=±1 ±d X α S~n0 +î = exp −β S~n0 · 2 2 ! = exp −2JS~n0 i=±1 ±d X ! S~n0 +î i=±1 3. Mann wähle eine Zufallszahl r ∈ [0, 1]. Falls r < ρ gilt dann: −§~n0 −→ §~n0 . 4. GoTo (1). 3.3 Technische Details, Berechnung von Observablen Bemerkungen zum Algorithmus 1. Bei Gleichgewichtssystemen: ~n0 . . . systematisches Durchlaufen des Gitters. 2. Alle Konfigurationen können in endlich vielen Schritten erreicht werden. 3. Der Algorithmus muss äquilibriert werden. 4. Critical slowing down: In der Nähe von Phasenübergängen wird die Anzahl der benötigten äquilibrierungs Schritte sehr groß 17 Observablen: Magnetisierung: M [S] = X S~n ; Suszeptibilität: χ = h(M − hM i)2 i ~ n Energie: H[S] = d XX ~ n 1 − S~n S~n+î ; Wärmekapazität: C = h(H − hHi)2 i i=1 1 Für die Magnetisierung gilt die Grenzfunktion: M (T ) = [1 − sinh(2J)−4 ] 8 für J > 0, 44068 und 0 sonst. 3.4 Auswertung und Graphen Auf einem 100 × 100 Feld lässt sich einfach eine Zufallsverteilung simulieren und auswerten: Abbildung 2: Zufallsverteilung mit P = 0.5 Ich eine Simulation in einem 500 × 500 Feld durchgeführt, dies liefert ein Resultat in dem man gut die Weißschen Bezirke erkennen kann. Lässt man nun die Monte-Carlo Simulation laufen so kann man bei verschiedenen Kopplungskonstanten J die Weiß’schen Bezirke erkennen. (kleines J bedeutet hohe Temperatur, großes J bedeutet eine niedrige Temperatur). 18 19 20 21 22 3.5 Auszug aus dem Code i n t main ( ) { c o n s t i n t d=2; v e c t o r <i n t > Abmessung ( d ) ; f o r ( i n t i =0; i <d ; i ++) { Abmessung [ i ] = 1 0 0 ; } i n t Volumen = 1 ; f o r ( i n t i =0; i <d ; i ++) { Volumen = Volumen * Abmessung [ i ] ; } v e c t o r <v e c t o r <i n t > > Nachbarn ( Volumen , v e c t o r <i n t >(2 * d ) ) ; n e i b i n i t ( d , Nachbarn , Abmessung ) ; i n t s p i n s [ Volumen ] ; z u f a l l ( s p i n s , Volumen ) ; // Z u f a l l i g e s v e r t e i l e n d e r S p i n s // Begin f r den M e t r o p o l i s Algorithmus // c o l d s t a r t ( s p i n s , Volumen ) ; d o u b l e J0 = 0 . 5 0 ; double J ; double J d i s t = 0 . 0 1 ; int JSchritte = 1; i n t nsweep = 2 0 ; int Gesamtschritte = 5000; i n t nequi = 500; s t r i n g name = ”MagUEner . t x t ” ; o f s t r e a m d a t e i ( name . c s t r ( ) ) ; s t r i n g name2 = ” Ausgabe . t x t ” ; o f s t r e a m d a t e i 2 ( name2 . c s t r ( ) ) ; s t r i n g name3 = ” S p i n k o n f i g . t x t ” ; o f s t r e a m d a t e i 3 ( name3 . c s t r ( ) ) ; f o r ( i n t k=0; k<J S c h r i t t e ; k++) { J = J0 + k * J d i s t ; c o u t << J << e n d l ; update ( s p i n s , Nachbarn , nequi , J , Volumen , d ) ; 23 f o r ( i n t i =0; i <G e s a m t s c h r i t t e ; i ++) { update ( s p i n s , Nachbarn , nsweep , J , Volumen , d ) ; Observablen1 ( s p i n s , Nachbarn , Volumen , d , d a t e i ) ; } } i n t kk =0; v e c t o r <i n t > yy ( d ) ; ausgabe ( s p i n s , Abmessung , yy , d a t e i 3 , d , kk ) ; Observablen2 ( J0 , J d i s t , J S c h r i t t e , G e s a m t s c h r i t t e , d a t e i 2 , . . . Volumen ) ; datei . close ( ) ; return 0; } //******************************************************************* // Anderung d e r S p i n s j e D u r c h l a u f v o i d update ( i n t s p i n s [ ] , v e c t o r <v e c t o r <i n t > > & neib , i n t nsweep , . . . d o u b l e J , i n t Volumen , i n t d ) { s ra n d ( time (NULL) ) ; d o u b l e r r , roh ; i n t SpinSumme ; f o r ( i n t k=0; k<nsweep ; k++) { f o r ( i n t l =0; l <Volumen ; l ++) { SpinSumme = 0 ; f o r ( i n t i =0; i <2*d ; i ++) { SpinSumme += s p i n s [ n e i b [ l ] [ i ] ] ; } roh = exp(−2 * J * SpinSumme * s p i n s [ l ] ) ; r r = ( rand ( ) + 0 . 0 ) /RAND MAX; i f ( r r <roh ) { s p i n s [ l ] = −s p i n s [ l ] ; } } } } 24 4 4.1 Molecular-Dynamic-Simulation Beschreibung der Problemstellung In diesem Beispiel simulieren wir Mehrteilchen Systeme die untereinander wechselwirken. (Gase, Flüssigkeiten, Festkörper). Hierfür verwenden wir Bewegungsgleichungen der klassischen Mechanik. Wir betrachten ein System mit folgender Notation: 4.2 N ...Teilchen ~ri ...Position des i-ten Teilchen ~vi ...Geschwindigkeit des i-ten Teilchen ~rkl = ~rk − ~rl ...Abstandsvektor des k-ten zum l-ten Teilchen rkl = |~rk − ~rl | ...Abstand des k-ten zum l-ten Teilchen Grundgleichungen für klassische Molucular-Dynamic Es lassen sich die Bewegungsgleichungen schreiben als: d2 ri = f~i für i = 1, · · · , N dt2 Für das Potential zwischen den Teilchen verwenden wir das Lennard-Jones-Potential : σ 12 σ 6 − U(~t) = 4ε r r mi · Nun verwenden wir eine weiter Vereinfachung der Notation: ~ = (~r1 , ~r2 , · · · , ~rN ) R ~ = (~v1 , ~v2 , · · · , ~vN ) V ! ~N ~1 f~2 f f ~ = , ,··· , G m1 m2 mN Um die Differentialgleichung nummerisch zu lösen verwenden wir erneut eine Diskretisierung der Zeit, wobei h der Abstand zwischen den Zeitschritten ist und n ∈ N gilt: t ~ R(t) ~ (t) V −→ n · h ~ n = R(n ~ · h) −→ R ~n = V ~ (n · h) −→ V ~ R(t)) ~ ~ n = G( ~ R ~ n) G( −→ G Mit dem selben Ansatz wie schon in 2 erhalten wir: f (t + h) − 2 · f (t) + f (t − h) f 00 (t) = + O(h2 ) h2 Mit analogem Vorgehen folgt: f (t + h) − f (t − h) + O(h2 ) 2·h Mit diesen Näherungen erhalten wir (nach einfachen Umformungen) die Bewegungsgleichungen für den Verlet-Algorithmus: f 0 (t) = ~ n+1 = 2 · R ~n − R ~ n−1 + G ~ n · h2 + O(h4 ) R h i ~n ~ n+1 − R ~ n−1 1 + O(h2 ) V = R 2·h 25 Vor und Nachteile des Verlet Algorithums: ⊕ Der Algorithmus ist symmetrisch unter Zeitumkehr. ⊕ Hohe Präzision der Positionen. Geringe Präzision der Geschwindigkeiten. Auswertung der Geschwindigkeiten einen Zeitschritt hinterher. Aufwändige Startprozedur. Andere Variante des Verlet Algorithmus Mit einigen einfachen Umformungen (Taylorreihe umschreiben und einsetzen) kann der VelocityVerlet-Algorithmus umgeschrieben werden zu: 2 ~ n+1 = R ~n + h · V ~n + h G ~ n + O(h3 ) R 2 h i ~n+1 = V ~n + h G ~ n+1 − G ~ n + O(h3 ) V 2 Diese neue Formulierung weist einige bessere Eigenschaften auf: ~ n+1 und V ~n+1 werden im gleichen Zeitschritt berechnet. ⊕ R ~ n+1 und V ~n+1 haben die gleiche Genauigkeit. ⊕ R ⊕ Einfache Startprozedur Die Zeitumkehr ist weg. (soll heißen dass der Algorithmus nicht in die Vergangenheit rechnen kann) 4.3 Schritte zur praktischen Implementierung Systeme die in der Praxis simuliert werden können sind VIEL kleiner als realistische Systeme, daher sind finite Volume Effekte unvermeidbar. Periodische Randbedingungen haben meist die geringeren finite Volume Effekte (aufgrund der erhaltenen Translationsinvarianz). Periodische Randbedingungen entsprechen einer zusätzlichen Wechselwirkung mit unendlich vielen Kopien des Systems. In unserem Model verwenden wir das Lennard Jones Potential. 26 Eine zentrale Eigenschaft diese Potentials ist dass es für große Abstände sehr schnell abfällt. Daher verwenden wir den Ansatz das jene Potentialkräfte mit großem Abstand vernachlässigt werden. Dafür wird die Minimal Image convention verwendet: ~ 1. Ersetze rij −→ min ~ri − ~rj + k · L. ~k∈{−~1,~0,~1} 2. Nach einem Propagationsschritt wird das Teilchen zurück in die Box gesetzt: xi < 0 =⇒ xi ←− xi + L xi > L =⇒ xi ←− xi − L Wobei L die Länge der Box ist. Häufig ist es sinnvoll die Schwehrpunktsbewegung abzudrehn (Damit das System in dem vorgegebenen Bereich bleibt). In unserem Model verwenden wir zufällig gewählte Geschwindigkeiten. Im Allgemeinen verschwindet der Gesamtimpuls nicht, er ist jedoch eine Erhaltungsgröße. Es entsteht also eine Gleichförmige Bewegung des Schwerpunkts. Diese Bewegung trägt zwar zu kinetischen Energie (und somit zu Temperatur) bei, hat jedoch keinen physikalischen Beitrag. (Soll heißen dass es für uns egal ist ob sich das gesamte System bewegt oder nicht, da wir nur an den Wechselwirkungen der Teilchen interessiert sind.) Die Gesamtbewegung abzudrehen ist prinzipiell einfach: 1. Berechne ~vtot = N P ~vn (0). n=1 2. Ersetze ~vn (0) ←− ~vn (0) − ~vtot N . Damit ist die Schwerpunktsbewegung des Systems eliminiert. Einstellen der Temperatur Wir verwenden das Mikrokanonische Ensamble, also E = const. Um die Temperatur einzustellen reskalieren wir die Geschwindigkeiten: ~vn −→ ~vn0 = λ · ~vn Es gilt: Ekin = N X m n=1 2 1 ~vn2 = (dN − d) kB T 2 (−d da durch das abdrehen der Schwerpunktsbewegung drei Freiheitsgrade eliminiert wurden!) Damit folgt nun kB T = N N n=1 n=1 X 2 X λ2 m v~0 n = ~vn = kB Tgewollt d(N − 1) d(N − 1) Damit resultiert der Parameter zur Reskalierung als: s d(N − 1)kB Tgewollt λ= 2Ekin Wichtig bei der praktischen Implementierung: Es sind mehrere Iterationen von Reskalierungen und Äquilibrierungen notwendig bis die Temperatur verlässlich eingestellt ist. 27 Transformation auf natürliche Einheiten Wir verwenden nun die natürliche Längeneinheit σ, ε die natürliche Energie und betrachten damit die erste Verlet Gleichung zerlegt für den Beitrag zum Teilchen k: " 6 # 12 2 24 · ε X r~k d h σ σ ~ il ~ ~ k rn+1 = rnk + h · rnk + · 2 − k k dt 2 m (ril )2 ril rilk i6=l Um zu kontrollieren ob das System richtig simmuliert wird sollte kontrolliert werden ob die Energie in einer vorgegebenen Toleranz liegt: E(t) − E0 ∆E <δ = E0 E0 4.4 Graphen Die ersten Grafiken wurden erstellt durch eine Simulation mit folgenden Parametern (wobei eine Äquilibrirung mit 100 Schritten gemacht wurde): 2 Dimensional Gitterabmessung: 30 × 30 Teilchenanzahl: 100 Zeitinterval: 0.01 Gesamtschritte der Simulation: 2000 28 Abbildung 3: Kristallförmig bei kB T = 0, 1 Abbildung 4: Schmelzprozess bei kB T = 0, 4 29 Abbildung 5: Tropfenbildung bei kB T = 1, 2 Abbildung 6: Gasförmig bei kB T = 2, 0 30 Nun lässt sich die Verteilung der Geschindigkeiten berechnen. (Bei der Initialisierung werden diese zufällig gewählt und dann so moduliert dass die entsprechende Temperatur erreicht wird) 31 32 Nun habe ich die Simulation beliebig Dimensional programmiert, daher hab ich die Simulationen auch in 3D durchlaufen lassen. Folgende Parameter wurden fixiert: 3 Dimensional Gitterabmessung: 30 × 30 × 30 bzw. 50 × 50 × 50 Teilchenanzahl: 1000 Zeitinterval: 0.01 Gesamtschritte der Simulation: 1000 33 Abbildung 7: Kristallförmig bei kB T = 0, 1 Abbildung 8: Schmelzprozess bei kB T = 0, 4 34 Abbildung 9: Beginn einer Tropfenbildung bei kB T = 1, 2 Abbildung 10: Tröpfchen - gasförmig: bei kB T = 2, 0 35 Weiters habe ich zwei ausgedehnte Simulationen gemacht, die erste unter folgenden Parametern: 3 Dimensional Gitterabmessung: 50 × 50 × 50 Teilchenanzahl: 1000 Zeitinterval: 0.01 Gesamtschritte der Simulation: 2500 Hier bewegen sich alle Teilchen auf EINE gemeinsame Position zu (periodische RB). Vermut- Abbildung 11: Bei kB T = 2, 0 lich war die Simulation nicht lang genug, daher hab ich eine lange Simulation durchgeführt: 36 Und unter folgenden Parametern: 3 Dimensional Gitterabmessung: 50 × 50 × 50 Teilchenanzahl: 1000 Zeitinterval: 0.009 Gesamtschritte der Simulation: 5000 Gesamt Rechenzeit: 8 Stunden und 5 Minuten Abbildung 12: Gasförmig bei kB T = 2, 7 37 4.5 Auszug aus dem Code v o i d o n e s t e p ( v e c t o r <v e c t o r <double> > & Eig , c o n s t i n t T e i l c h e n , . . . c o n s t i n t d , c o n s t i n t Volumen , c o n s t v e c t o r <i n t > & Abmessung , . . . const double h) { v e c t o r <v e c t o r <double> > EigNeu ( 3 * T e i l c h e n , v e c t o r <double >(d ) ) ; d o u b l e MinAbQuad = 0 ; double F = 0 ; v e c t o r <double> MinRichtVec ( d ) ; v e c t o r <double> GSum( d ) ; f o r ( i n t i =0; i <T e i l c h e n ; i ++) { f o r ( i n t j =0; j <d ; j ++) { EigNeu [ 3 * i ] [ j ] = Eig [ 3 * i ] [ j ] + . . . h * Eig [ 3 * i + 1 ] [ j ] + h * h/2 * Eig [ 3 * i + 2 ] [ j ] ; } } f o r ( i n t i =0; i <T e i l c h e n ; i ++) { f o r ( i n t k=0; k<d ; k++) { GSum[ k ] = 0 ; } f o r ( i n t j =0; j <T e i l c h e n ; j ++) { i f ( j != i ) { f i n d m i n ( EigNeu [ 3 * i ] , EigNeu [ 3 * j ] , . . . Abmessung , d , Volumen , MinAbQuad , . . . MinRichtVec ) ; F = ZweiPot ( MinAbQuad ) ; f o r ( i n t k=0; k<d ; k++) { GSum[ k ] += F * ( MinRichtVec [ k ] ) ; } } } f o r ( i n t k=0; k<d ; k++) { EigNeu [ 3 * i + 2 ] [ k ] = GSum[ k ] ; } } f o r ( i n t i =0; i <T e i l c h e n ; i ++) { f o r ( i n t k=0; k<d ; k++) { 38 EigNeu [ 3 * i + 1 ] [ k ] = Eig [ 3 * i + 1 ] [ k ] + . . . h / 2 * ( Eig [ 3 * i + 2 ] [ k ] + EigNeu [ 3 * i + 2 ] [ k ] ) ; } } f o r ( i n t i =0; i <T e i l c h e n ; i ++) { f o r ( i n t k=0; k<d ; k++) { i f ( EigNeu [ 3 * i ] [ k ] < 0 ) { EigNeu [ 3 * i ] [ k ] += Abmessung [ k ] ; } i f ( EigNeu [ 3 * i ] [ k ] > Abmessung [ k ] ) { EigNeu [ 3 * i ] [ k ] −= Abmessung [ k ] ; } Eig [ 3 * i ] [ k ] = EigNeu [ 3 * i ] [ k ] ; Eig [ 3 * i + 1 ] [ k ] = EigNeu [ 3 * i + 1 ] [ k ] ; Eig [ 3 * i + 2 ] [ k ] = EigNeu [ 3 * i + 2 ] [ k ] ; } } } //******************************************************************* // Funktion um min ( | Ri−Rj+LK | ) zu f i n d e n v o i d f i n d m i n ( c o n s t v e c t o r <double> & E r s t e , . . . c o n s t v e c t o r <double> & Zweite , c o n s t v e c t o r <i n t > & Abmessung , . . . c o n s t i n t d , c o n s t i n t Volumen , d o u b l e & MinAbQuad , . . . v e c t o r <double> & MinRichtVec ) { MinAbQuad = 1 ; f o r ( i n t i =0; i <d ; i ++) { MinAbQuad *= Abmessung [ i ] ; } v e c t o r <double> RIJ ( d ) ; f o r ( i n t i =0; i <d ; i ++) { RIJ [ i ] = E r s t e [ i ]− Z w e i t e [ i ] ; } f o r ( i n t i =0; i <d ; i ++) { MinRichtVec [ i ] = RIJ [ i ] ; } i n t kk =0; v e c t o r <double> Abstand ( d ) ; hat M i n S c h l e i f e ( RIJ , MinRichtVec , Abstand , Abmessung , d , kk , . . . MinAbQuad ) ; } 39 //******************************************************************* // R e k u r s i v e S c h l e i f e durch a l l e Dimensionen z u r Minimumssuche v o i d M i n S c h l e i f e ( c o n s t v e c t o r <double> & RIJ , . . . v e c t o r <double> & MinRichtVec , v e c t o r <double> & Abstand , . . . c o n s t v e c t o r <i n t > & Abmessung , c o n s t i n t d , i n t kk , . . . d o u b l e & MinAbQuad ) { i f ( kk < d−1) { i n t j j = kk +1; f o r ( i n t Richtung=−1; Richtung <2; Richtung++) { Abstand [ kk ] = RIJ [ kk ] + Richtung * Abmessung [ kk ] ; M i n S c h l e i f e ( RIJ , MinRichtVec , Abstand , . . . Abmessung , d , j j , MinAbQuad ) ; } } else { double Ve rgl ei ch ; f o r ( i n t Richtung=−1; Richtung <2; Richtung++) { Vergleich = 0; Abstand [ kk ] = RIJ [ kk ] + Richtung * Abmessung [ kk ] ; f o r ( i n t i =0; i <d ; i ++) { V e r g l e i c h += Abstand [ i ] * Abstand [ i ] ; } i f ( V e r g l e i c h < MinAbQuad ) { MinAbQuad = V e r g l e i c h ; f o r ( i n t i =0; i <d ; i ++) { MinRichtVec [ i ] = Abstand [ i ] ; } } } } } 40 5 5.1 Numerische Lösung der eindimensionalen Schrödingergleichung Beschreibung der Problemstellung In diesem Beispiel betrachten wir die Schrödigergleichung: i~ mit Ĥ = − ∂ ψ(~x, t) = Ĥψ(~x, t) ∂t ~2 M +V (~x); 2m ψ(~x, t) ∈ C i Mit einem Seperationsansatz ψ(~x, t) = e− ~ Et ψ(~x) lässt sich die zeitfreie Schrödingergleichung herleiten: ~2 − M ψ(~x) + V (~x)ψ(~x) = Eψ(~x) 2m wobei E der Energie Eigenwert ist. Mit |ψ(~x, t)|2 = |ψ(~x)|2 ist ein Wahrscheinlichkeitsmaß gegeben, womit eine Normierung der Wellenfunktion folgt: Z dV |ψ(~x)| = 1 V Analog zu 3.1 schreibt sich damit der Erwartungswert für den Ort als: Z Z 2 h~xi = ~x |ψ(~x)| dV = ψ(~x)∗ · ~x · ψ(~x)dV V V Die Gleichung Ĥψ(~x) = Eψ(~x) ist eine Eigenwert Gleichung, damit gilt dass es nur für bestimmte Energie Eigenwerte normierte Lösung gibt. Damit haben die Lösungen deskrete Spektren: Energie EW: En für n = 1, 2, ... Wellenfunktionen: ψn (~x) für n = 1, 2, ... Somit lassen sich die diskreten Lösungen schreiben als: i ψn (~x, t) = e− ~ En ·t ψn (~x) Für diese Lösungen gilt die orthonormalität: Z ψn (~x)∗ · ψm (~x)dV = δn,m V Weiters gilt die Superposition von Lösungen: X X i ψ(~x, t) = cn ψn (~x, t) = cn e− ~ En ·t ψn (~x) n n wobei mit ψ(~x, 0) = ρ(~x) gilt Z cn = ψn (~x)∗ · ρ(~x)dV V 41 5.2 Der unendlich tiefe Potentialtopf In unserem Problem betrachten wir den unendlichtiefen Potentialtopf, also das Potential: 0 für 0 ≤ x ≤ L V (x) = ∞ sonst Wie schon in 4 eliminieren wir die Dimensionen der Gleichung, dafür betrachten wir: ~2 1 · · · hat Dimension Energie m L2 x s = · · · ist dimensionslos L Multiplizieren der Schrödingergleichung mit E1 und mit E= v(s) = √ V (sL) ; ϕE (s) = Lψ(sL) E folgt 1 d2 − + v(s) ϕE (s) = EϕE (s) · · · dimensionslose Schrödinger Gleichung 2 ds2 mit v(s) = für 0 ≤ s ≤ 1 sonst 0 ∞ Referenzresultate zum Testen des Computerprogramms Nun lässt sich in diesem dimensionslosen System die Schrödinger Gleichung lösen, womit man √ 2 sin(nπs) für 0 ≤ s ≤ 1 ϕn (s) = ∞ sonst erhält, und die dimensionslosen erlaubten Energie Eigenwerte sind: En = π2 2 n 2 Observablen sind: Z hsi = 1 Z ∗ ϕ(s) · s · ϕ(s)ds = 2 · 0 1 sin(n · π · s)2 ds = 0 1 2 1 6 h(s − hsi) i = · · · = 1− 2 2 12 n π 2 Lösen der Gleichung mit Runge Kutta 4 Um Runge Kutta 4 anwenden zu können schreiben wir das Gleichungssystem in ein differentialgleichungs System 1.Ordung um: d ϕE (s) ϕ0E (s) = ; 2[v(s) − E]ϕE (s) ds ϕ0E (s) wobei v(s) ein beliebiges Potential sein kann. Weiters führen wir eine Diskretisierung durch: s −→ n · 4; mit n ∈ N0 und 4 = Damit lässt sich nun das Runge Kutta 4 Verfahren anwenden. 42 1 N 5.3 Bestimmung der Korrekten Energie Eigenwerte E Um das Problem zu lösen ist es notwendig die zweite Randbedingung ϕ(1) = 0 zu berücksichtigen. Um dies auszuführen kann man wie folgt vorgehen: 1. Wähle eine Energie E1 und E2 = E1 + ∆E und berechne ϕE1 (1). 2. Berechne ϕE2 (1). 3. Falls ϕE1 (1) · ϕE2 (1) < 0 −→ STOP Sonst: E2 ←− E2 + ∆E und GOTO (2) Damit erhält man ein Energie Intervall E1 , E2 in dem ein E existiert sodass ϕE (1) = 0 gilt, nun bleibt nur noch diese E zu finden, dies lässt sich wie folgt realisieren: 1. Sei Ẽ = 2. E2 −E1 2 . Falls ϕE1 (1) · ϕE (1) < 0 −→ E2 = Ẽ Sonst E1 = Ẽ 3. Falls |E1 − E2 | < δ −→ STOP Sonst Ẽ = E2 −E1 2 und GOTO 2. Die damit gefundene Wellenfunktion ϕẼ erfüllt beide Randbedingungen, nun bleibt nur noch die Normierung durchzuführen. Dafür schreiben wir das Normierungsintegral: Z 1 I= ϕẼ (s)2 ds 0 als eine Summe: N 1 X I≈ ϕẼ (si )2 · |si − si−1 | N i=1 Damit erhalten wir die gesuchte Wellenfunktion als: ϕẼ (s) ϕẼ (s) = √ I 5.4 Auszug aus meinem Code // D i e s e Randbedingungen werden i n d e r Funktion NIE g e n d e r t ! ! ! ! phi1 [ 0 ] [ 0 ] = 0 ; phi1 [ 0 ] [ 1 ] = 1 ; phi2 [ 0 ] [ 0 ] = 0 ; phi2 [ 0 ] [ 1 ] = 1 ; // Bestimmen d e r I n t e r v a l l g r e n z e n int Schritt = 0; EE [ 0 ] = E1 ; w h i l e ( S c h r i t t < AnzEW) { S c h r i t t += 1 ; EE [ S c h r i t t ] = GrenzSuche ( phi1 , phi2 , EE [ S c h r i t t − 1 ] , . . . 43 EnergieSuche , TeilungGrob , d , deltaGrob , MaxIt ) ; } //******************************************************************* // N h e r u n g s s c h l e i f e um d i e e c h t e n E n e r g i e E i g e n w e r t e zu f i n d e n f o r ( i n t j j =0; j j <AnzEW; j j ++) { E1 = EE [ j j ] ; E2 = EE [ j j + 1 ] ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i 1 [ i i +1] = RK4( p h i 1 [ i i ] , d e l t a * i i , d e l t a , d , E1 ) ; p h i 2 [ i i +1] = RK4( p h i 2 [ i i ] , d e l t a * i i , d e l t a , d , E2 ) ; } w h i l e ( abs ( p h i 1 [ T e i l u n g ] [ 0 ] ) > e p s && abs ( p h i 2 [ T e i l u n g ] [ 0 ] ) > e p s ) { E = ( E1+E2 ) / 2 ; phi [ 0 ] = 0 ; phi [ 1 ] = 1 ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i = RK4( phi , d e l t a * i i , d e l t a , d , E ) ; } i f ( phi [ 0 ] * phi1 [ Teilung ] [ 0 ] > 0) { E1 = E ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i 1 [ i i +1] = RK4( p h i 1 [ i i ] , d e l t a * i i , d e l t a , d , E1 ) ; } } else { E2 = E ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i 2 [ i i +1] = RK4( p h i 2 [ i i ] , d e l t a * i i , d e l t a , d , E2 ) ; } } } } //******************************************************************* // Funktion d i e den E ig en we rt E2 zuruck g i b t , s o d a s s . . . s i g n ( p h i ( Teilung , E1 ) ) != s i g n ( p h i 2 ( Teilung , E2 ) ) d o u b l e GrenzSuche ( v e c t o r <v e c t o r <double> > phi1 , . . . v e c t o r <v e c t o r <double> > phi2 , c o n s t d o u b l e & E1 , . . . c o n s t d o u b l e EnergieSuche , c o n s t i n t Teilung , c o n s t i n t d , . . . 44 c o n s t d o u b l e d e l t a , c o n s t i n t MaxIt ) { int Iteration = 0; d o u b l e E2 = E1 + E n e r g i e S u c h e ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i 1 [ i i +1] = RK4( p h i 1 [ i i ] , d e l t a * i i , d e l t a , d , E1 ) ; p h i 2 [ i i +1] = RK4( p h i 2 [ i i ] , d e l t a * i i , d e l t a , d , E2 ) ; } w h i l e ( p h i 1 [ T e i l u n g ] [ 0 ] * p h i 2 [ T e i l u n g ] [ 0 ] >= 0 & & . . . I t e r a t i o n < MaxIt ) { I t e r a t i o n += 1 ; E2 += E n e r g i e S u c h e ; f o r ( i n t i i =0; i i <T e i l u n g ; i i ++) { p h i 2 [ i i +1] = RK4( p h i 2 [ i i ] , d e l t a * i i , d e l t a , d , E2 ) ; } } i f ( I t e r a t i o n == MaxIt ) { c o u t << ” Kein Wechsel d e s V o r z e i c h e n s gefunden ” << e n d l ; } r e t u r n E2 ; } //******************************************************************* // Funktion z u r D i f f e r e n t i a l g l e i c h u n g d e r S c h r d i n g e r g l e i c h u n g v e c t o r <double> Fkt ( c o n s t v e c t o r <double>& yy , c o n s t d o u b l e s s , . . . c o n s t i n t d , c o n s t d o u b l e E) { v e c t o r <double> FF( d ) ; FF [ 0 ] = yy [ 1 ] ; FF [ 1 ] = 2 * ( P o t e n t i a l ( s s ) − E) * yy [ 0 ] ; r e t u r n FF ; } //******************************************************************* 5.5 Auswertung und Graphen Ich habe nun die Simulation für verschiedene Potentiale durchgeführt und die errechneten Wellenfunktionen ausgegeben (wobei die Energie Eigenwerte in der Legende fixiert wurden) 45 46 47 48 49 50 51 52 53 54 6 Lösung der 1-dim. zeitabhängigen Schrödingergleichung 6.1 Beschreibung der Problemstellung und Algorithmus In diesem Beispiel betrachten wir die Zeitabhängige Schrödingergleichung mit natürlichen Einheiten ~ = 0 und 2m = 1. ∂ψ(x, t) ∂2 i = Ĥ(x)ψ(x, t) = − 2 + V (x) ψ(x, t) ∂t ∂t Diese partielle Differentialgleichung zweiter Ordung wird als Anfangswertproblem behandelt, wobei ψ(x, 0) vorgegeben ist und ψ(x, t) für t > 0 berechnet wird. Wie schon in 5 wird |ψ(x, t)|2 als die Aufenthaltswahrscheinlichkeitsdichte interpretiert. Wie bei den anderen Beispielen wird auch hier eine Diskretisierung vorgenommen. Für partielle Differentialgleichungen gibt es kein Standardverfahren wie Runge Kutta 4 für gewöhnliche Differentialgleichungen. Die Diskretisierung: x = j · ∆x · · · 0 ≤ j ≤ N ∈ N t = n · ∆t · · · n ∈ N0 Im folgenden wird folgende Notation verwendet: ψnj = ψ(j · ∆x, n · ∆t) ∈ C Wie auch schon in den letzten Beispielen kann die zweite Ableitung wie folgt approximiert werden: ∂2 ψnj+1 − 2ψnj + ψnj−1 ψ(x, t) = ∂x2 ∆x2 Formal lässt sich die Lösung der Schrödinger Gleichung schreiben als: ψ(x, t) = U (t)ψ(x, 0) wobei U (t) = e−iĤt der unitäre Zeitentwicklungsoperator ist. Nun betrachten wir einen Zeitschritt ∆t. Mithilfe eines symmetrischen Trennungsansatz lässt sich schreiben: ∆t ∆t j 1 + iĤ ψn+1 = 1 − iĤ ψnj + O(∆t2 ) 2 2 Damit folgt mit einigen Umformungen dass: 2∆x2 2∆x2 j+1 j j−1 2 j j+1 2 j ψn+1 + i − ∆x V − 2 ψn+1 +ψn+1 = −ψn + i + ∆x V + 2 ψnj −ψnj−1 := Ωjn ∆t ∆t (3) Mit einem scharfen Blick kann man erkennen dass Ωjn mithilfe einer Dreiband Matrix geschrieben werden kann, sei T diese Matrix dann gilt: ~n+1 = Ω ~n+1 = T −1 Ω ~ n =⇒ ψ ~n Tψ 0 N festgelegt wird lediglich dass Ω0n = ΩN n = 0 und ψn = ψn = 0 gilt. Um diese Gleichungssystem zu lösen wird ein rekusiver Ansatz verwendet: j+1 j ψn+1 = aj · ψn+1 + bjn 55 (4) Mit 3 und einigen Umformungen folgt dass: 1 aj−1 = 2 + ∆x2 V j − i2∆x2 ∆t − aj (5) bj−1 n (6) = + j−1 a Mit den Gleichungen 3,4,5 und 6 ist der Algorighmus zum Implementieren beinah fertig, es fehlt nur noch die Anfangsbedingungen festzulegen: 2∆x2 1 2 1 2 1 Ωn = ψn+1 + i − V ∆x − 2 ψn+1 ∆t 2∆x2 a1 = 2 + ∆x2 V j − i ∆t 1 1 bn = Ωn bj+1 n Ωjn Damit lässt sich mit einem vorgegebenen Potential und einem Anfangswellenpaket die zeitabhängige Schrödingergleichung simulieren. Als Anfangswellenfunktion habe ich ein Wellenpaket der Form ψ(x, 0) = eiqx · e− (x−x0 )2 2σ 2 verwendet. 6.2 Auswertung und Graphen Ich habe den Code mit C++ umgesetzt wobei ich die Klasse complex verwendet habe um die Arithmetik der komplexen Zahlen zu verwenden. // G l o b a l e V a r i a b l e Komplexe E i n h e i t complex<double> i ( 0 , 1 ) ; i n t main ( ) { i n t Teilung = 1000; double d e l t a t = 0 . 1 ; int Schritte = 5000; v e c t o r <complex<double> > p s i ( T e i l u n g ) , omega ( T e i l u n g ) , . . . a ( Teilung ) , b( Teilung ) ; s t r i n g name = ” Welle7 . t x t ” ; o f s t r e a m d a t e i ( name . c s t r ( ) ) ; s t r i n g name1 = ” Pot7 . t x t ” ; o f s t r e a m d a t e i 1 ( name1 . c s t r ( ) ) ; p s i i n i t ( psi , Teilung ) ; // Beginn d e r P a r a m e t e r f e s t l e g u n g omega [ 0 ] = 0 ; f o r ( i n t j =1; j <Teilung −1; j ++) { 56 omega [ j ] = −p s i [ j +1] + ( i * 2 . 0 / d e l t a t + p o t e n t i a l ( j ) . . . + 2. 0 ) * psi [ j ] − psi [ j −1]; } omega [ Teilung −1] = 0 ; a [ 1 ] = 2 + potential (1) − i * 2.0 / deltat ; f o r ( i n t j =1; j <T e i l u n g ; j ++) { a [ j ] = 2 + p o t e n t i a l ( j ) − i *2.0 / d e l t a t − 1.0 / a [ j −1]; } // Beginn d e r S i m u l a t i o n f o r ( i n t k=0; k<S c h r i t t e ; k++) { b [ 1 ] = omega [ 1 ] ; f o r ( i n t j =2; j <T e i l u n g ; j ++) { b [ j ] = omega [ j ] + b [ j −1]/ a [ j − 1 ] ; } p s i [ Teilung −1] = 0 ; f o r ( i n t j=Teilung −2; 0< j ; j −−) { p s i [ j ] = ( p s i [ j +1] − b [ j ] ) / a [ j ] ; } psi [ 0 ] = 0; omega [ 0 ] = 0 ; f o r ( i n t j =1; j <Teilung −2; j ++) { omega [ j ] = −p s i [ j +1] + ( i * 2 . 0 / d e l t a t + . . . p o t e n t i a l ( j ) + 2 . 0) * psi [ j ] − psi [ j −1]; } omega [ Teilung −1] = 0 ; w r i t e w e l l e ( datei , psi , Teilung ) ; } writepot ( datei1 , Teilung ) ; return 0; } Nun habe ich dieses Programm für verschiedene Potentiale ausgeführt, wobei das Startwellenpaket stets das selbe blieb. In der Legende wird angegeben nach wie viele Schritte die Kurve geplottet wurde. 57 58 59 60 61 62 63 64