sábado, 31 de agosto de 2013

càlculo PI.py - MonteCarlo - Canals (30204)

import random; import sobol_lib;
import sys   
if sys.version_info >= (3,):
    xrange = range     
def calc_PI_sobol(n_points):       
    hits = 0
    sout = random.randint(1,10000)
    for i in range(1, n_points):
        # x, y = random.uniform(0.0, 1.0), random.uniform(0.0, 1.0)
        p, sout = sobol_lib.i4_sobol ( 2, sout )   
        if (p[0]**2 + p[1]**2) <= 1.0:
            hits += 1 
    return 4.0 * float(hits) / n_points
  def calc_PI_uniform(n_points):
      hits = 0
    for i in range(1, n_points):
        x,y = random.uniform(0.0, 1.0), random.uniform(0.0, 1.0)
                  if (x**2 + y**2) <= 1.0:
            hits += 1
                  return 4.0 * float(hits) / n_points
  def print_XY_Uniform(n_points):
    for i in range(1, n_points):
        print("{0:4f}   {1:4f}".format(random.uniform(0.0, 1.0), random.uniform(0.0, 1.0)))
  def print_XY_Sobol (n_points):
    sout = random.randint(1,10000)
    for i in range(1, n_points):
        # x, y = random.uniform(0.0, 1.0), random.uniform(0.0, 1.0)
        p, sout = sobol_lib.i4_sobol ( 2, sout )
        print("{0:4f}   {1:4f}".format(p[0],p[1]))
  if len(sys.argv)<2: o:p="">
    print("Uso de la herramienta ")
else:
    if (sys.argv[1]=="1"):
        print_XY_Uniform(1000)
    elif(sys.argv[1]=="2"):
        print_XY_Sobol (1000)
    elif(sys.argv[1]=="3"):
        for i in range(0,50):
            n = 1000 + i*2000
            print ("{0:1d}  {1:5f}  {2:5f}".format(n,calc_PI_uniform(n),calc_PI_sobol(n)))
    elif(sys.argv[1]=="4"):
        for i in range(3,7):
            n = 10**i
            print ("{0:1d}  {1:5f}  {2:5f}".format(n,calc_PI_uniform(n),calc_PI_sobol(n)))