这部分主要得会写代码
引例
蒲丰投针问题:
18世纪,法国数学家布丰提出的“投针问题”,记载于布丰1777年出版的著作中:“在平面上画有一组间距为a的平行线,将一根长度为l(l≤a)的针任意掷在这个平面上,求此针与平行线中任一条相交的概率。”
1) 取一张白纸,在上面画上许多条间距为a的平行线。
2) 取一根长度为l(l≤a) 的针,随机地向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m。
3)计算针与直线相交的概率。
布丰本人证明了,这个概率是:(其中π为圆周率)
证明:当时,才符合题意,其中x为直线的中点到最近的平行线的距离 为直线与最近平行线的夹角,由几何概率的定义可以求得P,由于大数定理,当n足够大的时候,频率趋近于概率,以此来得到的值。
用matlab模拟:
1 | % rand(m,n)可以生成一个m行n列的矩阵,每个元素值在[0,1]之间 |
可以重复多次求平均值
概述
定义
蒙特卡罗⽅法⼜称统计模拟法,是⼀种随机模拟⽅法,以概率和统计理论⽅法为基础的⼀种计算⽅法,是使⽤随机数(或更常⻅的伪随机数)来解决很多计算问题的⽅法。将所求解的问题同⼀定的概率模型相联系,⽤电⼦计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这⼀⽅法的概率统计特征,故借⽤赌城蒙特卡罗命名。
原理
大数定理 当样本容量足够大时,事件的发生频率即为其概率。
蒙特卡罗模拟不是一个通用的代码,而是一种思想。
问题
问题一:三门问题
问题的提出:你参加一档节目,节目有ABC三扇门,其中一扇门后面有汽车,另外两扇门后是空的。假设你选择了B门,这时C门被打开了,C门后面什么都没有,那么要不要改选A门?
结论:如果换了A得奖的概率是三分之二,不换门概率是三分之一。(好神奇啊)
蒙特卡罗模拟:
在赢的条件下,没考虑输的,条件概率:
1 | % randi([a,b],m,n)函数可在指定区间[a,b]内随机取出大小为m*n的整数矩阵 |
有输的情况,无条件概率:
1 | n = 100000; % n代表蒙特卡罗模拟重复次数 |
问题二:模拟排队问题
问题的提出:假设某银⾏⼯作时间只有⼀个服务窗⼝,⼯作⼈员只能逐个的接待顾客。当来的顾客较多时,⼀部分顾客就需要排队等待。
有以下假设:
- 顾客到来的间隔时间服从参数为0.1的指数分布
- 每个顾客的服务时间服从均值为10,⽅差为4的正态分布(单位为分钟,若服务时间⼩于1分钟,则按1分钟计算)
- 排队按先到先服务的规则,且不限制队伍的⻓度,每天⼯作时⻓为8⼩时。
试回答下⾯的问题:
- 模拟⼀个⼯作⽇,在这个⼯作⽇共接待了多少客户,客户平均等待的时间为多少?
- 模拟100个⼯作⽇,计算出平均每⽇接待客户的个数以及每⽇客户的平均等待时⻓。
建立模型:
x(i)表示第i-1个客户和第i个客户到达的间隔时间,服从参数为0.1的指数分布
y(i)表示第i个客户的服务持续时间,服从均值为10方差为4(标准差为2)的正态分布 (若小于1则按1计算)
c(i)表示第i个客户的到达时间,那么c(i) = c(i-1) + x(i),初始值c0=0
b(i)表示第i个客户开始服务的时间
e(i)表示第i个客户结束服务的时间,初始值e0=0
第i个客户结束服务的时间 = 第i个客户开始服务的时间 + 第i个客户的服务持续时间
即:e(i) = b(i) + y(i)
第i个客户开始服务的时间取决于该客户的到达时间和上一个客户结束服务的时间
即:b(i) = max(c(i),e(i-1)),初始值b1=c1;
第i个客户等待的时间 = 第i个客户开始服务的时间 - 第i个客户到达银行的时间
即:wait(i) = b(i) - c(i)
w表示所有客户等待时间的总和
假设一天内银行最终服务了n个顾客,那么客户的平均等待时间t = w/n
预备知识
1 | % normrnd(MU,SIGMA):生成一个服从正态分布(MU参数代表均值,SIGMA参数代表标准差,方差开根号是标准差)的随机数 |
问题1的代码
1 | tic %计算tic和toc中间部分的代码的运行时间 |
问题2的代码
1 | tic %计算tic和toc中间部分的代码的运行时间 |
matlab代码汇总
还有一些经典的问题这里不再赘述,题目很多,蒙特卡洛模拟主要是用其随机生成的思想来模拟问题的情况,用频率估计概率。遇到具体问题还要具体分析,这里汇总一些常用的matlab语句。
1 | rand(m,n) %可以生成一个m行n列的矩阵,每个元素值在[0,1]之间 |