Gaussian sampling
This commit is contained in:
parent
8594cdfa39
commit
45bdaf2d41
@ -1,23 +1,23 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from hydrogen import e_loc, psi
|
from hydrogen import e_loc, psi
|
||||||
|
|
||||||
interval = np.linspace(-5,5,num=50)
|
interval = np.linspace(-5,5,num=50)
|
||||||
delta = (interval[1]-interval[0])**3
|
delta = (interval[1]-interval[0])**3
|
||||||
|
|
||||||
r = np.array([0.,0.,0.])
|
r = np.array([0.,0.,0.])
|
||||||
|
|
||||||
for a in [0.1, 0.2, 0.5, 0.9, 1., 1.5, 2.]:
|
for a in [0.1, 0.2, 0.5, 0.9, 1., 1.5, 2.]:
|
||||||
E = 0.
|
E = 0.
|
||||||
norm = 0.
|
norm = 0.
|
||||||
for x in interval:
|
for x in interval:
|
||||||
r[0] = x
|
r[0] = x
|
||||||
for y in interval:
|
for y in interval:
|
||||||
r[1] = y
|
r[1] = y
|
||||||
for z in interval:
|
for z in interval:
|
||||||
r[2] = z
|
r[2] = z
|
||||||
w = psi(a,r)
|
w = psi(a,r)
|
||||||
w = w * w * delta
|
w = w * w * delta
|
||||||
E += w * e_loc(a,r)
|
E += w * e_loc(a,r)
|
||||||
norm += w
|
norm += w
|
||||||
E = E / norm
|
E = E / norm
|
||||||
print(f"a = {a} \t E = {E}")
|
print(f"a = {a} \t E = {E}")
|
||||||
|
@ -13,3 +13,31 @@ subroutine ave_error(x,n,ave,err)
|
|||||||
err = dsqrt(variance/dble(n))
|
err = dsqrt(variance/dble(n))
|
||||||
endif
|
endif
|
||||||
end subroutine ave_error
|
end subroutine ave_error
|
||||||
|
|
||||||
|
subroutine random_gauss(z,n)
|
||||||
|
implicit none
|
||||||
|
integer, intent(in) :: n
|
||||||
|
double precision, intent(out) :: z(n)
|
||||||
|
double precision :: u(n+1)
|
||||||
|
double precision, parameter :: two_pi = 2.d0*dacos(-1.d0)
|
||||||
|
integer :: i
|
||||||
|
|
||||||
|
call random_number(u)
|
||||||
|
if (iand(n,1) == 0) then
|
||||||
|
! n is even
|
||||||
|
do i=1,n,2
|
||||||
|
z(i) = dsqrt(-2.d0*dlog(u(i)))
|
||||||
|
z(i+1) = z(i) + dsin( two_pi*u(i+1) )
|
||||||
|
z(i) = z(i) + dcos( two_pi*u(i+1) )
|
||||||
|
end do
|
||||||
|
else
|
||||||
|
! n is odd
|
||||||
|
do i=1,n-1,2
|
||||||
|
z(i) = dsqrt(-2.d0*dlog(u(i)))
|
||||||
|
z(i+1) = z(i) + dsin( two_pi*u(i+1) )
|
||||||
|
z(i) = z(i) + dcos( two_pi*u(i+1) )
|
||||||
|
end do
|
||||||
|
z(n) = dsqrt(-2.d0*dlog(u(n)))
|
||||||
|
z(n) = z(n) + dcos( two_pi*u(n+1) )
|
||||||
|
end if
|
||||||
|
end subroutine random_gauss
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
from hydrogen import *
|
from hydrogen import *
|
||||||
from qmc_stats import *
|
from qmc_stats import *
|
||||||
|
|
||||||
def MonteCarlo(a, nmax):
|
def MonteCarlo(a, nmax):
|
||||||
E = 0.
|
E = 0.
|
||||||
N = 0.
|
N = 0.
|
||||||
for istep in range(nmax):
|
for istep in range(nmax):
|
||||||
r = np.random.uniform(-5., 5., (3))
|
r = np.random.uniform(-5., 5., (3))
|
||||||
w = psi(a,r)
|
w = psi(a,r)
|
||||||
w = w*w
|
w = w*w
|
||||||
N += w
|
N += w
|
||||||
E += w * e_loc(a,r)
|
E += w * e_loc(a,r)
|
||||||
return E/N
|
return E/N
|
||||||
|
|
||||||
a = 0.9
|
a = 0.9
|
||||||
nmax = 100000
|
nmax = 100000
|
||||||
X = [MonteCarlo(a,nmax) for i in range(30)]
|
X = [MonteCarlo(a,nmax) for i in range(30)]
|
||||||
E, deltaE = ave_error(X)
|
E, deltaE = ave_error(X)
|
||||||
print(f"E = {E} +/- {deltaE}")
|
print(f"E = {E} +/- {deltaE}")
|
||||||
|
@ -20,8 +20,8 @@ for a in [0.1, 0.2, 0.5, 0.9, 1., 1.5, 2.]:
|
|||||||
El = e_loc(a, r)
|
El = e_loc(a, r)
|
||||||
E += w * El
|
E += w * El
|
||||||
norm += w
|
norm += w
|
||||||
E = E / norm
|
E = E / norm
|
||||||
s2 = 0.
|
s2 = 0.
|
||||||
for x in interval:
|
for x in interval:
|
||||||
r[0] = x
|
r[0] = x
|
||||||
for y in interval:
|
for y in interval:
|
||||||
@ -32,5 +32,5 @@ for a in [0.1, 0.2, 0.5, 0.9, 1., 1.5, 2.]:
|
|||||||
w = w * w * delta
|
w = w * w * delta
|
||||||
El = e_loc(a, r)
|
El = e_loc(a, r)
|
||||||
s2 += w * (El - E)**2
|
s2 += w * (El - E)**2
|
||||||
s2 = s2 / norm
|
s2 = s2 / norm
|
||||||
print(f"a = {a} \t E = {E:10.8f} \t \sigma^2 = {s2:10.8f}")
|
print(f"a = {a} \t E = {E:10.8f} \t \sigma^2 = {s2:10.8f}")
|
||||||
|
Loading…
Reference in New Issue
Block a user