Gaussian sampling
This commit is contained in:
parent
8594cdfa39
commit
45bdaf2d41
@ -1,23 +1,23 @@
|
||||
import numpy as np
|
||||
from hydrogen import e_loc, psi
|
||||
|
||||
interval = np.linspace(-5,5,num=50)
|
||||
delta = (interval[1]-interval[0])**3
|
||||
interval = np.linspace(-5,5,num=50)
|
||||
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.]:
|
||||
E = 0.
|
||||
norm = 0.
|
||||
for x in interval:
|
||||
r[0] = x
|
||||
for y in interval:
|
||||
r[1] = y
|
||||
for z in interval:
|
||||
r[2] = z
|
||||
w = psi(a,r)
|
||||
w = w * w * delta
|
||||
E += w * e_loc(a,r)
|
||||
norm += w
|
||||
E = E / norm
|
||||
print(f"a = {a} \t E = {E}")
|
||||
for a in [0.1, 0.2, 0.5, 0.9, 1., 1.5, 2.]:
|
||||
E = 0.
|
||||
norm = 0.
|
||||
for x in interval:
|
||||
r[0] = x
|
||||
for y in interval:
|
||||
r[1] = y
|
||||
for z in interval:
|
||||
r[2] = z
|
||||
w = psi(a,r)
|
||||
w = w * w * delta
|
||||
E += w * e_loc(a,r)
|
||||
norm += w
|
||||
E = E / norm
|
||||
print(f"a = {a} \t E = {E}")
|
||||
|
@ -13,3 +13,31 @@ subroutine ave_error(x,n,ave,err)
|
||||
err = dsqrt(variance/dble(n))
|
||||
endif
|
||||
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 qmc_stats import *
|
||||
|
||||
def MonteCarlo(a, nmax):
|
||||
E = 0.
|
||||
N = 0.
|
||||
for istep in range(nmax):
|
||||
r = np.random.uniform(-5., 5., (3))
|
||||
w = psi(a,r)
|
||||
w = w*w
|
||||
N += w
|
||||
E += w * e_loc(a,r)
|
||||
return E/N
|
||||
def MonteCarlo(a, nmax):
|
||||
E = 0.
|
||||
N = 0.
|
||||
for istep in range(nmax):
|
||||
r = np.random.uniform(-5., 5., (3))
|
||||
w = psi(a,r)
|
||||
w = w*w
|
||||
N += w
|
||||
E += w * e_loc(a,r)
|
||||
return E/N
|
||||
|
||||
a = 0.9
|
||||
nmax = 100000
|
||||
X = [MonteCarlo(a,nmax) for i in range(30)]
|
||||
E, deltaE = ave_error(X)
|
||||
print(f"E = {E} +/- {deltaE}")
|
||||
a = 0.9
|
||||
nmax = 100000
|
||||
X = [MonteCarlo(a,nmax) for i in range(30)]
|
||||
E, deltaE = ave_error(X)
|
||||
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)
|
||||
E += w * El
|
||||
norm += w
|
||||
E = E / norm
|
||||
s2 = 0.
|
||||
E = E / norm
|
||||
s2 = 0.
|
||||
for x in interval:
|
||||
r[0] = x
|
||||
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
|
||||
El = e_loc(a, r)
|
||||
s2 += w * (El - E)**2
|
||||
s2 = s2 / norm
|
||||
print(f"a = {a} \t E = {E:10.8f} \t \sigma^2 = {s2:10.8f}")
|
||||
s2 = s2 / norm
|
||||
print(f"a = {a} \t E = {E:10.8f} \t \sigma^2 = {s2:10.8f}")
|
||||
|
Loading…
Reference in New Issue
Block a user