Python实现蒙特卡罗方法

本文介绍了蒙特卡罗方法的基本原理,并通过两个实例演示其应用:一是通过随机投点求圆周率π的近似值;二是利用该方法求解特定函数在一区间内的定积分近似值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、蒙特卡罗方法简介

蒙特卡罗(Monte Carlo)方法:简单来说,蒙特卡洛的基本原理简单描述是先大量模拟,然后计算一个事件发生的次数,再通过这个发生次数除以总模拟次数,得到想要的结果,精髓就是:用统计结果去计算频率,从而得到真实值的近似值。蒙特卡洛方法可以应用在很多场合,但求的是近似解,在模拟样本数越大的情况下,越接近与真实值,但样本数增加会带来计算量的大幅上升。

二、实例

1.求圆周率pi的近似值:
(1)正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生10000个点,计算它们与中心点的距离,从而判断是否落在圆的内部,若这些点均匀分布,则圆周率 pi=res/npi=res/n
其中res:表示落到圆内投点数 n:表示总的投点数
(2)代码

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()

(3)运行结果:

这里写图片描述
pi的值是:
这里写图片描述
可以看出存在一定误差,模拟样本越大,误差也会随之减小。
2.求定积分的近似值
(1)在一个1×1的正方形区域里,使用蒙特卡洛方法,随机在这个正方形里面产生大量随机点(数量为n),计算有多少点(数量为res)落在函数下方区域内,res/n就是所要求的积分值,也即红色区域的面积。
(2)代码

n = 30000
#矩形边界区域
x_min, x_max = 0.0, 1.0
y_min, y_max = 0.0, 1.0
#在矩形区域内随机投点x
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))
#计算定积分的近似值
integral = res / n
print('integeral: ', 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()

(3)运行结果
这里写图片描述
积分值:
这里写图片描述

Python蒙特卡罗是一种数值模拟方法,也称为蒙特卡罗法或统计模拟法。它是按抽样调查法求取统计值来推定未知特性量的计算方法蒙特卡罗方法的名字来源于摩纳哥的著名赌城,以表明它的随机抽样本质。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。 在Python中,蒙特卡罗方法可以通过生成随机数来进行模拟。首先,我们需要设定抛投的次数,也就是抛投的点数。然后,我们可以利用random模块的random()方法生成一个0到1之间的随机数,代表点的位置。接着,我们计算每个点到原点的距离,如果距离小于等于1,则认为该点在单位圆内,否则在单位圆外。最后,我们统计落在单位圆内的点的数量,并通过计算得到圆周率的近似值。下面是一个Python蒙特卡罗方法的示例代码: ```python from random import random from time import perf_counter DARTS = 1000000 hits = 0.0 start = perf_counter() for i in range(1, DARTS + 1): x, y = random(), random() dist = pow(x ** 2 + y ** 2, 0.5) if dist <= 1.0: hits += 1 pi = 4 * (hits / DARTS) print("圆周率值是:{}".format(pi)) print("运行时间是:{:.5f}s".format(perf_counter() - start)) ``` 以上代码通过抛投1000000个点来估算圆周率的值。每个点的横纵坐标都是由随机数生成的,然后根据点到原点的距离是否小于等于1来判断点是否在单位圆内。最后,根据落在单位圆内的点的数量和总点数的比例,计算得到圆周率的近似值。运行结果会输出圆周率的近似值和程序的运行时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python笔记 | 蒙特卡罗方法](https://blog.youkuaiyun.com/m0_51191308/article/details/126844660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值