问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

蒙特卡罗法(随机模拟法)

创作时间:
作者:
@小白创作中心

蒙特卡罗法(随机模拟法)

引用
CSDN
1.
https://m.blog.csdn.net/weixin_46039719/article/details/121457057

蒙特卡罗方法(Monte Carlo method)是一种基于随机数的计算方法,广泛应用于物理学、工程学、金融学等领域。这种方法源于美国在第二次世界大战中研制原子弹的“曼哈顿计划”,由数学家冯·诺依曼命名,以著名的赌城摩纳哥的蒙特卡罗来命名,为这一方法蒙上了一层神秘的面纱。

1. 概述

蒙特卡罗方法的基本思想是通过随机抽样来解决问题。这种方法特别适用于那些难以用传统数学方法解决的问题,例如高维积分、复杂系统的模拟等。蒙特卡罗方法的核心在于利用随机数生成样本,然后通过对这些样本的统计分析来获得问题的近似解。

2. 应用示例

(1)计算圆周率

计算圆周率是蒙特卡罗方法的一个经典应用。基本思路是在一个正方形内随机生成大量点,然后统计落在内切圆内的点的比例。由于正方形的面积是圆面积的4倍,因此可以通过这个比例来估算圆周率的值。

import random

def estimate_pi(n):
    num_point_circle = 0
    num_point_total = 0
    for _ in range(n):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        distance = x**2 + y**2
        if distance <= 1:
            num_point_circle += 1
        num_point_total += 1

    return 4 * num_point_circle / num_point_total

print(estimate_pi(10000))

(2)计算函数积分

蒙特卡罗方法也可以用于计算函数的积分。例如,计算函数sin(x)在区间[0,1]上的积分。基本思路是在该区间内随机生成大量点,然后统计这些点在函数曲线下的比例,从而估算积分的值。

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.sin(x)

x_min, x_max = 0, 1
y_min, y_max = 0, 1

n = 10000
x = np.random.uniform(x_min, x_max, n)
y = np.random.uniform(y_min, y_max, n)

n1 = np.sum(np.where(y < f(x), 1, 0))
r = (y_max - y_min) * (x_max - x_min) * n1 / n

print('蒙特卡罗模拟得到的sin(x)积分值:%f' % r)

xi = np.linspace(x_min, x_max, 100)
yi = f(xi)

plt.fill_between(xi, yi, 0, color='k', alpha=0.5, label='area')
plt.title('蒙特卡罗模拟得到的sin(x)积分值:%f' % r)
plt.legend()
plt.show()

(3)图像

蒙特卡罗方法在图像处理中也有应用,例如在计算机图形学中用于光线追踪,以生成逼真的图像。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号