蒙特卡洛法

蒙特卡洛法

简介

蒙特卡洛方法的名字来源于摩纳哥的一个城市蒙特卡洛,该城市以赌博业闻名,而蒙特卡洛方法正是以概率为基础的方法。 蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

计算圆周率

蒙特卡洛法计算圆周率,主要使用概率的方法逼近圆周率。做法如下:
1. 在边长为1的正方形做半径为1的1/4圆;
2. 随机多次向正方形内投递针(计算机使用随机数模拟),并且统计出落在半圆内部的针个数。
3. 计算圆周率

$$
\frac{圆的面积}{正方形的面积} = \frac{落在圆内针数}{总的投递次数}
$$

$$ \frac{\pi / 4}{1} = \frac{n}{N} $$

$$ \pi = \frac{4n}{N} $$

编写python程序求圆周率

from random import random
from math import sqrt

print("输入投针次数:")
DARTS = int(input()) # 转化为整数
hits = 0

for i in range(DARTS):
    x, y = random(), random();
    dist = sqrt(x**2 + y**2)
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits / DARTS)
print('Pi的值是 %s' % pi)

通过增加投递针的总次数得到以下数据

总投递次数 100 1000 10000 100000 1000000
圆周率 3.24 3.14 3.1372 3.144 3.140676

注意:蒙特卡洛法为概率模拟的方法,使用相同的程序,投递相同次数,得到的结果也不一定会相同。

计算简单定积分

使用蒙特卡洛法计算定积分:
$$
\int_0^1 x^2 \mathbb d x = \frac{1}{3}
$$
与以上计算方法基本相同,做边长为1的正方形,做出抛物线,图形如下

编程求解积分

from random import random

# 模拟次数
nums = [100, 500, 1000, 5000, 10000, 50000, 100000]

def get_area(n):
    """
    输入n次数,返回模拟结果
    """
    # 判读n为整数,否则抛出异常
    if not isinstance(n, int):
        raise ValueError("n need int")

    ret = 0
    for _ in range(n):
        x, y = random(), random()
        if y < x ** 2:
            ret += 1
    return ret / n

if __name__ == '__main__':
    s = []
    for num in nums:
        s.append((num, get_area(num)))
    print(s)

输出结果为:
[(100, 0.32), (500, 0.308), (1000, 0.318), (5000, 0.3434), (10000, 0.3335), (50000, 0.3363), (100000, 0.33325)]

总投递次数 100 500 1000 5000 10000 50000 100000
定积分值 0.332 0.308 0.318 0.3434 0.3335 0.3363 0.33325

总结

蒙特卡洛法是一种计算机模拟法解决数学问题,可以看到由于计算的发明,对数学发展产生了很大影响。学习编程其实也是很有意思的事情。后续会讲Python的学习课程,希望大家关注。


蒙特卡洛法_第1张图片
关注一下

你可能感兴趣的:(蒙特卡洛法)