#!/usr/bin/env python
"""
Computation of the integral,
I = int (dx dy dz)/(2pi)^3 1/(1-cos(x)cos(y)cos(z))
over (-pi,-pi,-pi) to (+pi, +pi, +pi). The exact answer
is Gamma(1/4)^4/(4 pi^3). This example is taken from
C.Itzykson, J.M.Drouffe, "Statistical Field Theory -
Volume 1", Section 1.1, p21, which cites the original
paper M.L.Glasser, I.J.Zucker, Proc.Natl.Acad.Sci.USA 74
1800 (1977)
For simplicity we compute the integral over the region
(0,0,0) -> (pi,pi,pi) and multiply by 8
"""
import exceptions
import sys
sys.stdout = sys.stderr
import pygsl._numobj as Numeric
import pygsl
import pygsl.rng
import pygsl.monte as monte
exact = 1.3932039296856768591842462603255
calls = 50000
r = pygsl.rng.mt19937_1999()
xl = [ 0, 0, 0 ]
M_PI = Numeric.pi
xu = [ M_PI, M_PI, M_PI ]
A = 1.0 / Numeric.pi**3
def g(k, params):
Numeric.cos(k,k)
return A / (1.0 - Numeric.multiply.reduce(k))
G = monte.gsl_monte_function(g, None, 3)
def display_results (title, result, error):
print "%s ==================" % title
print "result = % .6f" % result
print "sigma = % .6f" % error
print "exact = % .6f" % exact
t = (result - exact, Numeric.absolute(result - exact) / error)
print "error = % .6f = %.1g sigma" % t
def run_plain():
s = monte.plain(3)
s.init()
res, err = s.integrate(G, xl, xu, calls, r)
display_results ("plain", res, err)
def run_miser():
s = monte.miser(3)
s.init()
res, err = s.integrate(G, xl, xu, calls, r)
display_results ("miser", res, err)
def run_vegas():
s = monte.vegas(3)
s.init()
res, err = s.integrate(G, xl, xu, 10000, r)
display_results ("vegas warm-up", res, err)
print "converging..."
while 1:
res, err = s.integrate(G, xl, xu, calls/5, r)
chisq = s.get_chisq()
print "result = % .6f sigma = % .6f chisq/dof = %.1f" % (res, err, chisq);
if (Numeric.absolute(chisq - 1.0) <= 0.5):
display_results("vegas final", res, err)
break
def run():
run_plain()
run_miser()
run_vegas()
if __name__ == '__main__':
run()
syntax highlighted by Code2HTML, v. 0.9.1