蒙特卡洛算法

蒙特算法

蒙特卡罗法也称统计模拟法、统计试验法,是把概率现象作为研究对象的数值模拟方法
是按抽样调查法求取统计值来推定未知特性量的计算方法。

 蒙特卡罗是一类随机算法的统称,其主要思想是采样越多,得到的结果越近似于最优解。更多的是从总体中抽一个样本,计算估计量(均值等),作为整体估计。

实例1:蒙塔卡洛方法求圆周率

在图中区域产生足够多的随机数点,然后计算落在圆内的点的个数与总个数的比值再乘以4,就是圆周率

import math
import random
m = 1000
n = 0
for i in range(m):
    x = random.random()
    y = random.random()
    if math.sqrt(x**2 + y**2) < 1:
        n+=1

pi = 4 * n / m
print("pi = {}".format(pi))

输出:

 模拟次数增加至1000000次 输出:

实例2:计算函数 y = x方在[0,1]区间的定积分

import math
import random
m = 1000000
n = 0
for i in range(m):
    x = random.random()
    y = random.random()
    if y >= x**2:
        n += 1
r = n/m
print("r = {}".format(r))

输出:

三门问题: 

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门是否会增加参赛者赢得汽车的几率?如果严格按照上述条件,即主持人清楚地知道,自己打开的那扇门后面是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3,,换门的话,赢得汽车的几率是2/3。

进行100次模拟:

import random

def play(change):
    prize = random.randint(0,2)
    guess = random.randint(0,2)
    if guess == prize:
        if change:
            return False
        else:
            return True
    else:
        if change:
            return True
        else:
            return False
def winRate(change, N):
    win = 0
    for i in range(N):
        if(play(change)):
            win += 1
    print("中奖率为{}".format(win / N))
N = 100
print("每次换门的中奖概率:")
winRate(True,N)
print("每次都不换门的中奖概率:")
winRate(False,N)

输出:

进行1000次模拟:

更改n为1000 输出:

 进行1000000次模拟:

更改n为1000000 输出:

 

可以发现,模拟次数越多,得到的结果越近似于最优解,也体现出蒙塔卡洛的思想,把概率作为研究对象数值模拟方法,采样越多,得到的结果越近似于最优解。从总体中抽一个样本,计算估计量(均值等),作为整体估计。

蒙特卡洛是一种通过随机采样来估计定积分的方。要使用蒙特卡洛来计算定积分 y = ln(x),其中 1 <= x <= 5,可以遵循以下步骤: 1. 确定积分的范围。在这种情况下,我们已经给出了 1 <= x <= 5。 2. 生成随机样本。我们需要在给定的范围内生成大量的随机点,以便进行积分估计。可以使用均匀分布来生成这些随机点。 3. 计算函数值。对于每个生成的随机点 (x, y),计算 y = ln(x) 的函数值。在这种情况下,我们将计算 y = ln(x) 的值。 4. 估计积分。通过统计样本中函数值的平均值,并乘以积分范围的长度,可以得到对定积分的估计。 下面是使用 Python 代码实现蒙特卡洛来计算定积分的示例: ```python import random import math def monte_carlo_integration(func, a, b, num_samples): total_sum = 0 for _ in range(num_samples): x = random.uniform(a, b) y = func(x) total_sum += y average = total_sum / num_samples integral = average * (b - a) return integral def ln(x): return math.log(x) integral = monte_carlo_integration(ln, 1, 5, 100000) print("Estimated integral:", integral) ``` 在上述代码中,我们定义了 `monte_carlo_integration` 函数来执行蒙特卡洛积分。函数接受一个函数 `func`(在这种情况下是 `ln` 函数)、积分范围 a 和 b,以及样本数 `num_samples`。它返回对定积分的估计值。 使用 `ln` 函数作为参数调用 `monte_carlo_integration` 函数来计算 y = ln(x) 的定积分。我们选择了 100,000 个样本点进行估计,并打印出结果。 请注意,蒙特卡洛的精度决于样本数的选择。通过增加样本数,可以获得更准确的积分估计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值