Python – Monte Carlo methods are used in python

Monte Carlo methods are used in python… here is a solution to the problem.

Monte Carlo methods are used in python

I am working on the first version of the problem written in the image below. I generated a random point using the rand command and tested if the point was inside the circle. Does my code accept the number of Monte Carlo functions as an input value? I believe I chose N, the credits are small enough so that I don’t run out of memory. Also, when I run this code, it runs without any errors, but the chart doesn’t show up. Ask for help where I might be going wrong.

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from random import random

xinside = []
yinside = []
xoutside = []
youtside = []

insidecircle = 0
totalpoints = 10**3

for _ in range(totalpoints):
    x = random()
    y = random()
    if x**2+y**2 <= 1:
        insidecircle += 1
        xinside.append(x)
        yinside.append(y)
    else:
        xoutside.append(x)
        youtside.append(y)

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.scatter(xinside, yinside, color='g', marker='s')
ax.scatter(xoutside, youtside, color='r', marker='s')
fig.show()

Solution

The chart that is not shown is mysterious, maybe try plt.show(). Alternatively, you can save the drawing using savefig. This is the working function of the first part of the code (just modify the code posted in the issue) and the desired output graph.

import numpy as np
import matplotlib.pyplot as plt
from random import random

def monte_carlo(n_points):
    xin, yin, xout, yout = [[] for _ in range(4)] # Defining all 4 lists together
    insidecircle = 0

for _ in range(n_points):
        x = random()
        y = random()
        if x**2+y**2 <= 1:
            insidecircle += 1
            xin.append(x)
            yin.append(y)
        else:
            xout.append(x)
            yout.append(y)

print ("The estimated value of Pi for N = %d is %.4f" %(n_points, 4*insidecircle/n_points))

fig, ax = plt.subplots()
    ax.set_aspect('equal')
    ax.scatter(xin, yin, color='g', marker='o', s=4)
    ax.scatter(xout, yout, color='r', marker='o', s=4)
    plt.savefig('monte_carlo.png')

n_points = 10**4
monte_carlo(n_points)

> The estimated value of Pi for N = 10000 is 3.1380

enter image description here

Vectorization method If you exclude print statements from your function, you can refer to them as single-line code. I’ll leave the time analysis for your homework

import numpy as np
import matplotlib.pyplot as plt

def monte_carlo(n_points, x, y):
    pi_vec = 4*(x**2 + y**2 <= 1).sum()/n_points
    print ("The estimated value of Pi for N = %d is %.4f" %(n_points, pi_vec))

# Generate points
n_points = 10**4
x = np.random.random(n_points)
y = np.random.random(n_points)
# x = [random() for _ in range(n_points)] # alternative way to define x
# y = [random() for _ in range(n_points)] # alternative way to define y

# Call function
monte_carlo(n_points, x, y)

> The estimated value of Pi for N = 10000 is 3.1284

Alternatively, you can get rid of the two variables, x and y, by using a single x and y point array, as follows:

pts = np.random.uniform(0, 1, 2*n_points).reshape((n_points, 2))
monte_carlo(n_points, pts) # Function will be def monte_carlo(n_points, pts):

and used in functions

pi_vec = 4*(pts[:,0]**2 + pts[:,1]**2 <= 1).sum()/n_points

Related Problems and Solutions