Przygotowany uprzednio program do obliczania energii stanu podstawowego atomu wodoru z wykorzystaniem metody Monte Carlo i algorytmu Metropolisa zaadaptowałem do obliczenia energii stanu podstawowego cząsteczki H2+. Funkcja falowa, którą wybrałem do obliczeń była kombinacją liniową orbitali 1s atomów wodoru 1:
Parametrem obliczeniowym - odległość między protonami Rj w układzie. Rysunek poniżej przedstawia sytuację geometryczną użytą do obliczeń:
W wyniku przeprowadzonych obliczeń otrzymałem zbiór danych, które są przedstawione na poniższym wykresie:
Wartość minimalna energii wynosi około -0.567 j.at. przy odległości między protonami wynoszącej 2.5 angstrema.
Tekst programu, który wygenerował zbiór wyników jest przytoczony poniżej:
Parametrem obliczeniowym - odległość między protonami Rj w układzie. Rysunek poniżej przedstawia sytuację geometryczną użytą do obliczeń:
W wyniku przeprowadzonych obliczeń otrzymałem zbiór danych, które są przedstawione na poniższym wykresie:
Wartość minimalna energii wynosi około -0.567 j.at. przy odległości między protonami wynoszącej 2.5 angstrema.
Tekst programu, który wygenerował zbiór wyników jest przytoczony poniżej:
DECLARE FUNCTION fufal! (x!, y!, z!)
DECLARE FUNCTION GRNF! () 'gaussowski generator pseudolosowy
'jednostki atomowe
llos = 500000 'liczba losowan
h = .01 'krok rozniczkowania
h2 = h * h 'kwadrat kroku rozniczkowania
DIM SHARED Rj 'odl. miedzy protonami
OPEN "H2plus.txt" FOR APPEND AS #1
FOR Rj = .9 TO 6 STEP .1 'obl. energi w zal. od Rj
En = 0 'zerowanie energii do sumowania
x = 0: y = 1.2: z = 0 'poczatkowy punkt lancucha Markowa
FOR i = 1 TO llos
xzapas = x 'zabezpieczenie starych wspolrzednych
yzapas = y
zzapas = z
psi = fufal(x, y, z) 'wartosc psi w punkcie (x,y,z)
psikw = psi * psi 'kwadrat psi
'Losowanie nowego punktu (xn,yn,zn)
xn = 2 * RND - 1 'zakres (-1, 1)
yn = 2 * RND - 1
zn = 2 * RND - 1
pr = SQR(xn*xn + yn*yn + zn*zn) 'promien punktu (xn,yn,zn)
skok = .6 * GRNF 'skok przypadkowy wg rozkladu Gaussa
x = x + xn * skok / pr 'poprawione wspolrzedne nowego punktu
y = y + yn * skok / pr
z = z + zn * skok / pr
psinowa = fufal(x, y, z) 'wartsc psi w nowym punkcie
psinowakw = psinowa * psinowa
'obliczanie warunku przejscia lancucha do nowego punktu
rel = psinowakw / psikw 'stosunek nowej i starej psi
IF rel < 1 THEN 'przejscie bezwarunkowe gdy rel >= 1
IF RND > rel THEN 'przejscie odrzucone
x = xzapas
y = yzapas
z = zzapas
psinowa = fufal(x, y, z)
END IF
END IF
'obliczanie calki z energii lokalnych
'obliczanie pochodnej w punkcie (x,y,z)
fufal2 = 2 * fufal(x, y, z)
d1 = (fufal(x - h, y, z) - fufal2 + fufal(x + h, y, z)) / h2
d2 = (fufal(x, y - h, z) - fufal2 + fufal(x, y + h, z)) / h2
d3 = (fufal(x, y, z - h) - fufal2 + fufal(x, y, z + h)) / h2
Lappsi = -(d1 + d2 + d3) / 2'druga poch. psi w punkcie (x,y,z)
V1 = -1/(SQR((x - Rj/2)^2 + y*y + z*z))'potencjal psi/psi=1
V2 = -1/(SQR((x + Rj/2)^2 + y*y + z*z))
En = En + Lappsi/psinowa+V1+V2+1/Rj 'suma energii lok.
NEXT i
PRINT #1, Rj, En / llos 'druk zm. wariacyjnej i en. calk.
NEXT Rj
CLOSE #1
END
FUNCTION fufal (x, y, z)
x1 = x - Rj / 2
x2 = x + Rj / 2
r1 = SQR(x1 * x1 + y * y + z * z)
r2 = SQR(x2 * x2 + y * y + z * z)
fufal = EXP(-r1) + EXP(-r2)
END FUNCTION
FUNCTION GRNF
r1 = SQR(-LOG(1 - RND))
GRNF = r1 * SIN(2 * 3.14159265# * RND)
END FUNCTION
















