提示:以下是本篇文章正文内容,下面案例可供参考,案例函数为x^3
一、code
import random
import numpy as np
import matplotlib.pyplot as plt
class Monte_Carlo:
def __init__(self,all_num,num_down,num_up):
# 一共有多少个大米粒
self.m = all_num
# 落在函数区间里的大米粒
self.n =0
# 区间下限
self.down=num_down
# 区间上限
self.up=num_up
#定义原函数
def func(self,x):
return x**3
#随机点
def Monte(self):
self.x_inside = []
self.y_inside = []
self.x_outside = []
self.y_outside = []
for i in range(self.m):
x = random.uniform(self.down,self.up)
y = random.uniform(self.down,Monte_Carlo.func(self.up))
if y <= Monte_Carlo.func(x):
self.n = self.n + 1
self.x_inside.append(x)
self.y_inside.append(y)
else:
self.x_outside.append(x)
self.y_outside.append(y)
return self.n,self.m
#画图函数
def draw(self):
x = np.linspace(self.down,self.up, 1000)
y = Monte_Carlo.func(x)
fig, ax = plt.subplots()
ax.plot(x, y, 'r-', label='Function')
ax.set_title("Monte_Carlo")
ax.scatter(self.x_inside, self.y_inside, s=2, color='b', label='Inside Points')
ax.scatter(self.x_outside, self.y_outside, s=2, color='g', label='Outside Points')
ax.legend(loc="upper left")#左上
plt.show()
if __name__ == '__main__':
all_num=eval(input("你有多少个大米粒:"))
num_down=eval(input("区间下限:"))
num_up = eval(input("区间上限:"))
Monte_Carlo=Monte_Carlo(all_num,num_down,num_up)
n,m=Monte_Carlo.Monte()
#求得面积
P = n / m
S_ju=abs(num_up-num_down)*abs(Monte_Carlo.func(num_up)-0)#仅限于区间为单调函数
print(P*S_ju)
#绘图
Monte_Carlo.draw()