蒙特卡罗方法 python 实现
2024-10-16 19:39:06
蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值。
一、求圆周率的近似值,采用 投点法
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
# 投点次数
n = 10000
# 圆的信息
r = 1.0 # 半径
a, b = (0., 0.) # 圆心
# 正方形区域边界
x_min, x_max = a-r, a+r
y_min, y_max = b-r, b+r
# 在正方形区域内随机投点
x = np.random.uniform(x_min, x_max, n) # 均匀分布
y = np.random.uniform(y_min, y_max, n)
# 计算 点到圆心的距离
d = np.sqrt((x-a)**2 + (y-b)**2)
# 统计 落在圆内的点的数目
res = sum(np.where(d < r, 1, 0))
# 计算 pi 的近似值(Monte Carlo方法的精髓:用统计值去近似真实值)
pi = 4 * res / n
print('pi: ', pi)
# 画个图看看
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(x, y,'ro',markersize = 1)
plt.axis('equal') # 防止图像变形
circle = Circle(xy=(a,b), radius=r, alpha=0.5)
axes.add_patch(circle)
plt.show()
效果图
二、求定积分(definite integral)的近似值,采用 投点法
import numpy as np
import matplotlib.pyplot as plt
'''蒙特卡罗方法求函数 y=x^2 在[0,1]内的定积分(值)'''
def f(x):
return x**2
# 投点次数
n = 10000
# 矩形区域边界
x_min, x_max = 0.0, 1.0
y_min, y_max = 0.0, 1.0
# 在矩形区域内随机投点
x = np.random.uniform(x_min, x_max, n) # 均匀分布
y = np.random.uniform(y_min, y_max, n)
# 统计 落在函数 y=x^2图像下方的点的数目
res = sum(np.where(y < f(x), 1, 0))
# 计算 定积分的近似值(Monte Carlo方法的精髓:用统计值去近似真实值)
integral = res / n
print('integral: ', integral)
# 画个图看看
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(x, y,'ro',markersize = 1)
plt.axis('equal') # 防止图像变形
axes.plot(np.linspace(x_min, x_max, 10), f(np.linspace(x_min, x_max, 10)), 'b-') # 函数图像
#plt.xlim(x_min, x_max)
plt.show()
效果图
最新文章
- markdown博文测试
- 什么是SQL注入
- 一行代码如何控制ipunt框里面值的长度
- 安装 vue.js和第一个hello world
- Android 实现闪屏页和右上角的倒计时跳转
- SQL设置SQLServer最大连接数查询语句
- hdu 1045 Fire Net(最小覆盖点+构图(缩点))
- [原创]SQL SERVER 2008R2 技术总结专题目录索引
- UVA 315 315 - Network(求割点个数)
- MongoDB 的创建、查询、更新、删除
- iOS题
- Light OJ 1027 - A Dangerous Maze(概率)
- WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
- Java 去除 ArrayList 集合中的重复元素
- YII缓存依赖的应用
- 全站 HTTPS 没你想象的那么简单
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
- js new一个函数和直接调用函数的区别
- python----常用功能
- matplotlib各图形绘制
热门文章
- Java标识符
- WordCount系统分析与设计作业
- .Net core 下的ConfigurationManager类正确引用方法
- SQLSERVER 分区表实战
- __MySQL 5.7 Replication 相关新功能说明
- Quick and Easy Installation of Oracle Database 12c on Oracle Linux in Oracle VM VirtualBox
- Huawei vlan 配置及vlan 间通讯
- 利用MSF的MS08_067模块攻击windows server 2003 SP2中文版系统
- phpstudy绑定项目(dist文件)域名--陈远波
- 【10】python窗口控制[隐藏,移动]