Calculating area under the curve using Monte Carlo method for any given function.
Python, 38 lines
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
# Calculating area under the curve using Monte Carlo method # FB - 201006137 import math import random # define any function here! def f(x): return math.sqrt(1.0 - x * x) # define any xmin-xmax interval here! (xmin < xmax) xmin = -1.0 xmax = 1.0 # find ymin-ymax numSteps = 1000000 # bigger the better but slower! ymin = f(xmin) ymax = ymin for i in range(numSteps): x = xmin + (xmax - xmin) * float(i) / numSteps y = f(x) if y < ymin: ymin = y if y > ymax: ymax = y # Monte Carlo rectArea = (xmax - xmin) * (ymax - ymin) numPoints = 1000000 # bigger the better but slower! ctr = 0 for j in range(numPoints): x = xmin + (xmax - xmin) * random.random() y = ymin + (ymax - ymin) * random.random() if f(x) > 0 and y > 0 and y <= f(x): ctr += 1 if f(x) < 0 and y < 0 and y >= f(x): ctr += 1 fnArea = rectArea * float(ctr) / numPoints print "Area under the curve = " + str(fnArea)
In the given example, it would calculate pi/2 because the given function defines a half-circle.
Given that the code is already evaluating the function at a huge number of points (lines 19--23), conventional numerical integration would be far better. Also, the kind of rejection sampling proposed here is very inefficient, and requires knowing the minimum and maximum of the function.
I certainly did not write this code for any practical purpose. Monte Carlo is probably the most inefficient solution method for almost any problem. I only put it here thinking some people may find it interesting, that's all.