蒙德卡罗方法python ---小白的整理

                      **蒙特卡罗方法python**

蒙德卡罗方法是一种通过概率来得到近似解的方法

一 .蒙德卡罗方法来计算圆周率

1.算法思路解释如下:

  1. 圆形面积和正方形面积比例*4即等于圆周率
  2. 假设有一块边长为2的正方形木板,上面画一个单位圆,随意往木板上扔飞镖,落点(x,y)必定在木板上。
  3. 在扔得足够多的情况下,落在单位圆和落在木板上飞镖的次数的比例就等于单位圆和木板的面积之比。综上我们很容易理解随着投掷次数的增加,这个数值*4会无线接近于圆周率。

根据算法原理,我们使用pycharm编写程序利用蒙德卡罗方法来计算圆周率
参考代码块如下

from random import random

times =int(input('请输入投掷飞镖次数:'))
hits = 0
for i in range(times):
     x = random()
     y = random()
     if x*x + y*y<= 1:
         hits += 1
print(4.0 *hits/times)

由于我是新手,下面便是我对代码块的逐条解析

  • from random import random从random库中引入random模块,random模块时python自带的模块,用于生成随机数
  • times =int(input('请输入投掷飞镖次数:'))int()函数用于将一个字符串或数字转换成整型

#默认返回0,如果没有参数传递
int()
0
#如果转换的是float函数,那么转换的结果是向0的方向靠近,而不是四舍五入
int(3.6)
3
#负数取大
int(-3.6)
-3
#如果指定了base参数,那么第一个参数必须是字符类型
int(‘11’,base=2)
3 base=2为 二进制
#如果不指定,则认为字符是十进制数据
int(‘101’)
101

2我们进一步使用matplotlib画图

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle

# 投点次数
n = int(input('请输入投点次数:'))
# 在正方形区域内随机投点,均匀分布
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
# 计算 点到圆心的距离
d = np.sqrt(x**2 + y**2)
# 统计 落在圆内的点的数目
hits = sum(np.where(d < 1, 1, 0))
# 计算 pi 的近似值(蒙特卡罗方法:用概率统计值去近似真实值)
pi = 4 * hits / n
print('圆周率: ', pi)

"""
画图
"""
#变量fig表示整张图片,ax表示图片中的各个图表
#创建自定义图像
fig = plt.figure()
# 其中,参数111的意思是:将画布分割成1行1列,图像画在从左到右从上到下的第1块
ax = fig.add_subplot(111)
ax.plot(x, y,'ro',markersize = 1)
plt.axis('equal') # 防止图像变形
circle = Circle(xy=(0,0), radius=1, alpha=0.5)
ax.add_patch(circle)
plt.show()

在这里插入图片描述
在这里插入图片描述

二.使用蒙特卡罗计算定积分

  • 求函数 y=x^2 在[0,1]内的定积分
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x**2
# 投点次数
n = int(input('任意输入投点次数:'))
# 在矩形区域内随机投点
x = np.random.uniform(0, 1, n)
y = np.random.uniform(0, 1, n)
# 统计落在函数 y=x^2图像下方的点的数目
hits = sum(np.where(y < f(x), 1, 0))
# 计算定积分的近似值(蒙特卡罗方法:用统计的概率比值去近似真实值)
integral = hits / n
print('x^2在[0,1]的定积分: ', integral)
"""
画图
"""
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(x, y,'ro',markersize = 1)
# 防止图像变形
plt.axis('equal')
axes.plot(np.linspace(0, 1, 10), f(np.linspace(0, 1, 10)), 'b-')
plt.show()

在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值