1D zeitunabhängige Schrödinergl. mit Numerov Methode lösen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
SIto
User
Beiträge: 8
Registriert: Donnerstag 13. April 2017, 15:36

Guten Abend zusammen

ich versuche gerade die eindimensionale, zeitunabhängige Schrödingergleichung mit dem Nuermov Verfahren zu lösen. Die Herleitung des Verfahrens habe ich nun schon auf diversen Seiten nachgelesen und zumindest die Mathe scheint mir soweit klar. Das Problem ist aber nun das implementieren des Algoritmus...

Mein Code im Moment:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
from scipy.constants import hbar

m= 1e-27
E= 0.5

def numerov_step(psi_1,psi_2,k1,k2,k3,h):
    #k1=k_(n-1), k2=k_n, k3=k_(n+1)
    #psi_1 = psi_(n-1) and psi_2=psi_n
    m = 2*(1-5/12. * h**2 * k2**2)*psi_2
    n = (1+1/12.*h**2*k1**2)*psi_1
    o = 1 + 1/12. *h**2 *k3**2
    return (m-n)/o

def numerov(N,x0,xE,a):
    x,dx = np.linspace(x0,xE,N+1,retstep=True)

    def V(x,a):
        if (np.abs(x)<a):
            return 1
        else:
            return 0
    
    k = np.zeros(N+1)
    for i in range(len(k)):
        k[i] = 2*m*(E-V(x[i],a))/hbar**2

    #Anfangswerte
    psi= np.zeros(N+1)
    psi[0]=0
    psi[1]=0.1    

    for j in np.arange(2,N):
        psi[j+1]= numerov_step(psi[j],psi[j+1],k[j-1],k[j],k[j+1],dx)

    return psi

x0 =-10
xE = 10
N =1000

psi=numerov(N,x0,xE,3)

x = np.linspace(x0,xE,N+1)

plt.figure()
plt.plot(x,psi)
plt.show()
Wie man sehen kann ist die Idee relativ schlicht. Ich definiere eine Funktion die mir genau einen Schritt nach dem Nuerov-Verfahren macht und somit den (n+1) Wert der Wavefunction berechnet. Die Funktion Numerov soll also das gesamte Verfahren sein, wobei V(x,a) das Potential ist (in diesem Fall der square-well). k(x,a) ist hierbei eine Funktion, die man erhält wenn man die zeitunabhängige Schrödingergleichung in die Form y''(x)+k(x)y(x)=0 bringt.
Da der Numerov-Algorithmus zwei Werte braucht um loszulaufen habe ich hier einfach geraten, leider kenne ich nicht wirklich eine exakte Lösung bzw. Approx. um diese Werte zu erhalten. Die Idee war: Da die Wavefunction für x gegen Plus/Minus Unendlich gegen Null gehen muss die Anfangswerte relativ klein zu wählen...

Das Problem ist nun, dass der Code eigentlich nichts sinnvolles produziert, ich aber im Moment noch nicht wirklich versteh wieso... Ich mache offensichtlich etwas falsch (ich habe ein ähnliches Problem bereits mit einer anderen Methode lösen dürfen und weiss daher was ungefähr rauskommen sollte), aber ich sehe leider nicht was.

Hoffe auf etwas Hilfe.

Gruss Sito
consuli
User
Beiträge: 52
Registriert: Sonntag 26. Juli 2015, 22:10

Wie sollen wir (als Nicht-Jeden-Tag-Schrödergleichung-Optimierer) Dir (als Ich-bin-mit-dem-Gesamtergebnis-unzufrieden-Poster) dabei helfen?

Meistens kommt eine Forenlösung dadurch zustande, dass der Fragende das Problem auf ein einschlägiges Kern-Problem reduziert, dass im (zu erwartenden) Wissensbereich des Forums des Forums liegt.

Z.B. wäre es hilfreich,
  • die Klasse Deines Optimierungsproblems zu nennen
  • den Fehler zu nennen (z.B. errechnete Lösung liegt nicht im Lösungsraum, ist nicht plausibel
  • die Lösungssicherheit des verwendeten Algorithmus zu recherchieren
Consuli
Who controls the British crown? Who keeps the metric system down? We do! We do!
Who leaves Atlantis off the maps? Who keeps the Marsians under wraps? We do! We do!
consuli
User
Beiträge: 52
Registriert: Sonntag 26. Juli 2015, 22:10

Mir ist noch was eingefallen. Ein Editieren der alten Antwort war nicht möglich (obwohl zwischenzeitlich noch niemand geantwortet hat).

Dein Problem kann mathematischer Natur sein oder auch programmiertechnischer Natur sein. Je nachdem würde die Lösung in ganz andere Richtungen gehen. Aus Deinem Posting ist aber unmöglich zu ersehen, ob es ein mathematisches oder Programmierproblem ist.

Damit wir Dir helfen können, solltest Du zunächst mal das mathematische Optimierungsproblem vorstellen. Z.B.:
  • Zu mininimierende (zu maximierende) Zielfunktion f mit Parametern alpha, beta, gamma
  • Es gibt eine Nebenbedingung g
  • Die Nebenbedingung g wird über den Lagrange-Operator lambda abgebildet.
  • ...


Gruß
Consuli
Who controls the British crown? Who keeps the metric system down? We do! We do!
Who leaves Atlantis off the maps? Who keeps the Marsians under wraps? We do! We do!
Antworten