初识蒙特卡罗算法
Posted wheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识蒙特卡罗算法相关的知识,希望对你有一定的参考价值。
蒙特卡罗算法,在我看来,是一个很神奇的算法,它可以模拟出很多场景,并且模拟出来的数据,可能与真实的数据相差无几,但模拟的成本远远低于真实数据的获取。
今天,我就用蒙特卡罗算法,做两个简单的模拟。一个是π值计算,另外一个求积分。
一、π值
π值是一个无理数,无限不循环,公元480年左右,南北朝时期的数学家祖之冲进得出精确到小数点后7位的结果,今天,我们用计算机来模拟一把,我模拟的结果如何。
首先来说明模拟的思路,如下图所示,通过推导出正方形和内切圆面积存在比例关系,只要计算出它俩的面积比值,我们就可以求出π。
那怎么在不使用π的情况下,计算内切圆的面积。我们可以用打点的方式,在正方形区域随机打点n个,如果在内切圆的区域内有x个,则它俩的面积比就是n/x。如果这个n很大,则结果也是十分准确的。
具体代码如下
list_p=[] list_p_x=[] max_count = 100000000 first_count =10 rate = 2 count_s = 0 j=0 while first_count < max_count: print(first_count) while j < first_count: x = random.uniform(-1, 1) y = random.uniform(0, 1) if x**2 + y**2 < 1: count_s = count_s + 1 j = j + 1 list_p_x.append(first_count) list_p.append(count_s/first_count*4) j=0 count_s=0 first_count =first_count * rate plt.xlim(0,first_count/2) plt.ylim(3,3.3) plt.plot(list_p_x,list_p) plt.hlines(y=np.pi,xmin= first_count,xmax=list_p_x, colors = "c", linestyles = "dashed")
模拟出来的结果如下,在模拟超过1w次后,结果已经趋于稳定,基本等于3.14,这已经基本我们大部分使用场景。
二、积分
积分实际也可以理解是计算面试,比如下图,是y = -x^2+1 的函数图形,现在用蒙特卡罗求一下该函数的积分。
思路和求π得方法一致,也是通过随机打点的方式,根据在积分区域的散点数与矩形区域内散点数之比,乘以矩形面积,就是该积分区域面积。
分析模拟结果如下图,可以看到模拟3w到多次时,准确率很高了,与1.33不断接近,在9w次之后,基本保持重叠。
通过蒙特卡罗模拟,生成一系列符合预期要求的随机数,就可以模拟出一个十分接近实际值得近似值,十分适应于对数值计算精度要求不是很高的场景,比如,我们在计算圆面积的是,通常都会取3.14,而不会取3.1415926.....等。
注:
公众号:数据志(原:跟着菜鸟一起学R语言)
原文链接:https://www.cnblogs.com/wheng/articles/11832476.html
以上是关于初识蒙特卡罗算法的主要内容,如果未能解决你的问题,请参考以下文章
通信仿真基于matlab蒙特卡罗算法2FSK系统抗噪声性能仿真含Matlab源码 1632期
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
时序差分学习(temporary learning, TD)