Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. import ROOT
  2. import math
  3.  
  4.  
  5. class Generator():
  6. def __init__(self):
  7. self.rand = ROOT.TRandom()
  8.  
  9. def get_rv(self):
  10. x = (x_up - x_down) * self.rand.Uniform() + x_down
  11. y = (y_up - y_down) * self.rand.Uniform() + y_down
  12. return x, y
  13.  
  14.  
  15. class Integrator():
  16. def __init__(self, func, rv_gen):
  17. self.func = func
  18. self.rv_gen = rv_gen
  19. self.series_count = 0
  20. self.n_Eval = 0.0
  21. self.n_Eval2 = 0.0
  22.  
  23. def iterate(self, num_iterations):
  24. self.series_count += 1
  25.  
  26. n_Ef = 0.0
  27. n_Ef2 = 0.0
  28. for i in range(num_iterations):
  29. x, y = self.rv_gen.get_rv()
  30. #print x, y
  31. func_val = self.func.Eval(x, y)
  32. n_Ef += func_val
  33. n_Ef2 += func_val**2
  34.  
  35. Ef = n_Ef / num_iterations
  36. self.n_Eval += Ef
  37. self.n_Eval2 += Ef**2
  38. Ef2 = n_Ef2 / num_iterations
  39. sd = ( Ef2 - Ef**2 )**0.5
  40. return Ef, sd
  41.  
  42. def get_ev_sd(self):
  43. Eval = self.n_Eval / self.series_count
  44. Eval2 = self.n_Eval2 / self.series_count
  45. sd = ( Eval2 - Eval**2 )**0.5
  46. return Eval, sd
  47.  
  48.  
  49. x_down = 0.0
  50. x_up = 0.5
  51. y_down = 1.0
  52. y_up = 3.0
  53. num_series = 10
  54. num_iterations_per_series = 1000
  55. func = ROOT.TF2("func", "exp( x^2 + y^2 ) / ( 1 + x * y**0.5 / 2 )", x_down, x_up, y_down, y_up)
  56.  
  57.  
  58. rvgen = Generator()
  59. integrator = Integrator(func, rvgen)
  60. for series in range(num_series):
  61. val, sd = integrator.iterate(num_iterations_per_series)
  62. accval, accsd = integrator.get_ev_sd()
  63. print "series:", series, "\tval:", val, "\tsd:", sd, "\taccval:", accval, "\taccsd:", accsd
  64.  
  65.  
  66. raw_input("Press ENTER to exit.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement