蒙特卡罗方法 python 实现

蒙特卡罗(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()
效果图

时间: 2024-08-31 00:56:00

蒙特卡罗方法 python 实现的相关文章

蒙特卡罗方法 python 实现2

如果不考虑作图,这里的两个例子可以改写成下面的样子: 求圆周率 import random ''' 蒙特卡罗模拟 投点法计算圆周率 ''' # 投点游戏 def play_game(): # 圆 r = 1.0 # 半径 a, b = (0., 0.) # 圆心 # 正方形区域边界 x_min, x_max = a-r, a+r y_min, y_max = b-r, b+r # 在 正方形 区域内随机投点 x = random.uniform(x_min, x_max) # 均匀分布 y =

蒙特卡罗方法入门

本文通过五个例子,介绍蒙特卡罗方法(Monte Carlo Method). 一.概述 蒙特卡罗方法是一种计算方法.原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值. 它非常强大和灵活,又相当简单易懂,很容易实现.对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法. 它诞生于上个世纪40年代美国的"曼哈顿计划",名字来源于赌城蒙特卡罗,象征概率. 二.π的计算 第一个例子是,如何用蒙特卡罗方法计算圆周率π. 正方形内部有一个相切的圆,它们的面积之比是π/4

《深度学习导论及案例分析》一2.12马尔可夫链蒙特卡罗方法

2.12马尔可夫链蒙特卡罗方法 在统计学中,马尔可夫链蒙特卡罗方法是一类根据概率分布进行采样的方法,起源于物理学科[133].这类方法以构造一个马尔可夫链为基础,其期望分布(desired distribution)就是平衡分布(equilibrium distribution).极限分布(limiting distribution)或稳态分布(stationary disrtibution).经过若干步骤之后,马尔可夫链的状态便被用作期望分布的一个样本.样本的质量随着步骤数目的增加而不断提高,

蒙特卡罗方法验证凯利公式

说明 本文受知乎陈小米启发而写.有兴趣的朋友可以移步这里. 本文的代码完全是本人所撸. 问题描述 假想一个游戏.赢的概率是60%,输的概率40%.入场费随意交.如果赢了获得2倍的入场费金额(1赔1),输则输掉入场费.小米有1000元做本金,请问小米每次给多少入场费,理论上100次游戏后几何期望收益能最大? [本人的疑问]为何这里考虑几何期望,而不是数学期望?[已解决,见代码注释!] 凯利公式 \[f=p-\frac{q}{b}\] 不多说,上代码. 完整代码 import pandas as p

方法-python中的类型怎么对应java中的byte[]

问题描述 python中的类型怎么对应java中的byte[] 场景是这个样子的我这边要实现一个接口 服务器端是java做的客户端是python做的服务器端向客户端提供了一个login的接口需要客户端实现login需要给服务器返回一个byte[] 的值 但是python中貌似没有byte这个类型我该怎么处理?bytearray 这个方法试过了 貌似不行 在线等好心人 求大神给我点一下啊 卡到这里很长时间了很紧 啊 解决方案 https://gist.github.com/igniteflow/1

方法-Python 调用sqlserve数据库存储过程,有谁知道怎么用吗?

问题描述 Python 调用sqlserve数据库存储过程,有谁知道怎么用吗? 在网上找的例子比较少?有没有详细的使用方法,请大神帮帮忙,急用,谢谢! 解决方案 http://stackoverflow.com/questions/28635671/using-stored-procedurespython-ms-sql#

方法-python继承的一个简单问题

问题描述 python继承的一个简单问题 python为什么我继承了Threading的Thread方法, class myThread(threading.Thread): def __init__(self,threadname): threading.Thread.__init__(self,name=threadname) 这就是问题为什么还要 调用初始化一下?. 初始化,能达到什么效果,就是这句话有什么用途?或者 我不初始化有什么差别? java里面 不需要这样呀?python这样写是

方法-Python如何调用C++dllku库。

问题描述 Python如何调用C++dllku库. 现在是报着错,但不知道怎么处理,百度网上的说方法1是调用方式,2是参数类型 但不知道怎么搞,求高手指教 我改成这样了就可以运行了,请问这个和我原来写的有什么区别呢? 解决方案 首先谢谢你的提示,我在修改后报出这个错误,百度未得,还请您指教 解决方案二: 用ctypes方式调用动态库,然后注意参数类型 Python调用windows下DLL详解 - ctypes库的使用

判断网页编码的方法python版_python

在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题,那今天我们来看一下如何判断网页的编码: 网上很多网页的编码格式都不一样,大体上是GBK,GB2312,UTF-8等. 我们在获取网页的的数据后,先要对网页的编码进行判断,才能把抓取的内容的编码统一转换为我们能够处理的编码,避免乱码问题的出现. 下面介绍两种判断网页编码的方法: 总结:第二个方法很准