Advertisement
reeps

igor's_montecarlo

Mar 30th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.73 KB | None | 0 0
  1. from ROOT import TF2, gRandom, gROOT, TStopwatch
  2. from math import exp, log, sqrt
  3. import sys
  4.  
  5. def func(xx):
  6.     x = xx[0]
  7.     y = xx[1]
  8.     return exp(x ** 2 + y) / (1 + x * sqrt(y) / 2)
  9.  
  10. def func_g(xx, pp):
  11.     x = xx[0]
  12.     y = xx[1]
  13.     norm = pp[0]
  14.     return exp(y) / 2 * norm
  15.  
  16. def func_fg(xx):
  17.     x = xx[0]
  18.     y = xx[1]
  19.     return func ([x, y]) / func_g([x, y], [norm])
  20.  
  21. def fndirect(x1, x2, y1, y2):
  22.     if x1 < 0 or x2 > 0.5 or y2 > 3 or y1 < 1:
  23.         raise 'Wrong arguments in fndirect'
  24.  
  25.     u = gRandom.Uniform(umin, umax);
  26.    
  27.     ry = log(u)
  28.     rx = gRandom.Uniform(x1, x2)
  29.     return rx, ry
  30.  
  31.  
  32.  
  33. def direct_integrate(fun, left, right, number):
  34.     xmin = left[0] ; xmax = right[0]
  35.     ymin = left[1] ; ymax = right[1]
  36.     sum_f = 0
  37.     sum_fSquared = 0
  38.     for n in range(0,number):
  39.         x = gRandom.Uniform(xmin, xmax)
  40.     y = gRandom.Uniform(ymin, ymax)
  41.         f = fun([x, y])
  42.         sum_f += f
  43.         sum_fSquared += f ** 2
  44.     mean = sum_f * (xmax - xmin) * (ymax - ymin) / number
  45.     disp = sum_fSquared * ((xmax - xmin) * (ymax - ymin)) ** 2 / number
  46.     return mean, disp
  47.  
  48. def signSampl_integrate(fun_f, fun_g, left, right, number):
  49.     xmin = left[0] ; xmax = right[0]
  50.     ymin = left[1] ; ymax = right[1]
  51.     s = 0
  52.     sum_fSquared = 0
  53.     for n in range(0,number):
  54.         x, y = fndirect(xmin, xmax, ymin, ymax)
  55.         f = fun_f([x, y]) / fun_g([x, y], [norm])
  56.         s += f
  57.         sum_fSquared += f ** 2
  58.     mean = s * (x2 - x1) / number
  59.     disp = sum_fSquared * (x2 - x1) ** 2 / number
  60.     return mean, disp
  61.  
  62. x1 = 0
  63. x2 = 0.5
  64. y1 = 1
  65. y2 = 3
  66.  
  67. norm = 2 / (exp(3) - exp(1))
  68. f = TF2("f", func, x1, x2, y1, y2, 0)
  69. f.Draw("surf")
  70. raw_input()
  71.  
  72. fg = TF2("fg", func_fg, x1, x2, y1, y2, 0)
  73. fg.Draw("surf")
  74. raw_input()
  75.  
  76. step = 1000
  77. totalMean = 0
  78. totalDisp = 0
  79. print 'mean method\n'
  80. for i in range(1, 11):
  81.     result = direct_integrate(func, [x1, y1], [x2, y2], step)
  82.     totalMean += result[0]
  83.     totalDisp += result[1]
  84.     print str(i * step) +  '\tmean: ' +  str(result[0]) + '\trms: ' + str(sqrt((result[1] - result[0] ** 2) / step)) + \
  85.        '\ntotal mean: ' +   str(totalMean / i) + '\ttotal rms: ' + str(sqrt((totalDisp / i - (totalMean / i) ** 2) / (step * i)))
  86. totalMean = 0
  87. totalDisp = 0
  88. umin = exp(1)
  89. umax = exp(3)
  90. print '\nsignificant sampling\n'
  91. for i in range(1, 11):
  92.     result = signSampl_integrate(func, func_g, [x1, y1], [x2, y2], step)
  93.     totalMean += result[0]
  94.     totalDisp += result[1]
  95.     print str(i * step) +  '\tmean: ' +  str(result[0]) + '\trms: ' + str(sqrt((result[1] - result[0] ** 2) / step)) + \
  96.        '\ntotal mean: ' +   str(totalMean / i) + '\ttotal rms: ' + str(sqrt((totalDisp / i - (totalMean / i) ** 2) / (step * i)))
  97.  
  98. raw_input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement