蒙特卡洛方法模拟小例子
风险定量分析工具龙卷风图决策树形图蒙特卡洛模拟

风险定量分析⼯具龙卷风图决策树形图蒙特卡洛模拟龙卷风图:是项⽬管理中⽤于在风险识别和定性分析之后,进⾏定量风险分析的技术----敏感性分析技术中最常⽤的⼀种图表技术。
敏感性分析:敏感性分析有助于确定哪些风险对项⽬具有最⼤的潜在影响。
它把所有其他不确定因素保持在基准值的条件下,考察项⽬的每项要素的不确定性对⽬标产⽣多⼤程度的影响。
敏感性分析最常⽤的显⽰⽅式是龙卷风图。
龙卷风图有助于⽐较具有较⾼不确定性的变量与相对稳定的变量之间的相对重要程度。
它因其显⽰形式像龙卷风⼀样⽽得名。
图例请见图⽚。
___________________________________________________________________________________________风险定量分析⼯具之龙卷风图https:///rongwenbin/article/details/9301091龙卷风图(TornadoDiagram)是在风险定量分析中采⽤的⼀种对单因素敏感性分析的⼯具。
因其图形状像龙卷风,因此⽽得名。
主要⽤来分析在其它因素单个较⾼不确定性因素和其它相对稳定因素之间的相对重要程度。
⼀个标准的龙卷风图如下图所⽰。
图中,X轴表⽰各因素对结果的影响的取值范围。
Y轴表⽰各不确定性因素的名称,它们对结果的影响值和它们本⾝的取值。
对每⼀个不确定的决定因素,该图都包含了⼀个横杆和两组数字(分别在横杆的左边和右边)。
每组数字对应着该因素对结果的影响值(上⾯的数字,负数⽤括号括住了)和该因素本⾝的值(下⾯的数字,花括号内)。
_________________________________________________________________________________________决策树形图:按照当前数据集的不同属性特征将其划分为不同分⽀节点(数据⼦集),直到每⼀个节点的所有样本数据都属于同⼀类别分⽀属性停⽌划分,最终形成“树状”分⽀结构图形。
蒙特卡罗算法举例

蒙特卡罗算法举例
蒙特卡罗算法(Monte Carlo algorithm)是一种基于随机样本的计算方法,它通过模拟大量的随机数据来获得问题的概率性结果。
这种算法可以用于估计数学问题、物理问题、金融问题以及其他实际应用中的复杂问题的解。
下面将以几个实际例子来说明蒙特卡罗算法的应用。
例1:估计圆周率π的值
具体步骤:
1.在正方形内生成大量均匀分布的随机点。
2.统计落入圆形内的点的数量。
3.通过落入圆形的点的数量与总点数的比例来估计π的值。
例2:绘制希腊国旗
具体步骤:
1.建立一个正方形区域。
2.在正方形区域内随机生成大量的点。
3.统计每个小正方形内的点的数量。
4.将每个小正方形的点的数量转化为绘制像素点的比例。
例3:计算投资回报率的概率分布
具体步骤:
1.建立资产的收益率分布模型,可使用历史数据进行参数估计。
2.随机生成资产的未来收益率。
3.根据资产的权重计算投资组合的回报率。
4.迭代多次,统计投资组合回报率的概率分布。
例4:模拟森林火灾蔓延的概率
具体步骤:
1.建立一个森林地区的模型,包括地形、植被分布等信息。
2.随机生成火源的起始位置。
3.模拟火势的蔓延规律,考虑风向、植被密度等因素。
4.统计火灾烧毁的面积。
以上是几个蒙特卡罗算法的应用示例。
蒙特卡罗算法的优点是可以解决复杂问题,并提供概率性结果。
但需要注意的是,结果的准确性受到样本数量的影响,样本数量越大,结果越接近真值。
此外,算法的运行效率也是一个需要考虑的因素。
MonteCarlo模拟

Lewis算法既通过了直方图检验,又通过了相关性检验。
13
三、按概率分布抽样
模 拟
模拟次数k:如1000次。
19
五、Monte Carlo模拟结果的分析
描述n的概率分布情况:
平均值、标准方差、分布密度、分布函数
✓ 期望,用所有的n的和除以n的个数,则得n的平均值。 类似的方法可求得方差。
✓ 分布密度和分布函数可由直方图得到。
✓ 直方图:分成若干个小区间,如100~109,110~119,
落入不规则图形内的飞镖数与落入正方形内的总飞镖数的比 值就越接近μ。
8
Monte Carlo模拟依靠计算机产生的随机数来模拟实际系统。
产生[0,1]区间内均匀分布的随机数。用两个随机数表示一 个点在正方形上的具体位置,判断该点是否落在不规则图形 内。记录落在不规则图形内部的点数和试验的总次数,两者 比值就是μ。
6
什么是Monte Carlo模拟? 随机数生成器 按概率分布抽样 Monte Carlo模拟的流程 Monte Carlo模拟结果的分析 编程模拟
7
一、什么是Monte Carlo模拟?
例 计算一个正方形中的不规则图形的面积。
模型:Ai = μAs = μs2,其中0≤μ≤1。 Monte Carlo方法的本质:在随机情况下,如果投的足够多,
采用Monte Carlo模拟,获得n的概率密度函数和分布函 数,并计算n的平均值和标准方差。
比较这三种方法的结果,并比较每种方法的精度及 其能够提供的信息。
Monte-Carlo模拟教程

举例
例1 在我方某前沿防守地域,敌人以一个炮排(含两门火炮) 为单位对我方进行干扰和破坏.为躲避我方打击,敌方对其阵地 进行了伪装并经常变换射击地点.
经过长期观察发现,我方指挥所对敌方目标的指示有50%是准 确的,而我方火力单位,在指示正确时,有1/3的射击效果能毁 伤敌人一门火炮,有1/6的射击效果能全部毁伤敌人火炮.
蒙特卡罗方法的关键步骤在于随机数的产生, 计算机产生的随机数都不是真正的随机数(由算 法确定的缘故),如果伪随机数能够通过一系列 统计检验,我们也可以将其当作真正的随机数 使用。
rand('seed',0.1);
rand(1) %每次运ra行nd程('s序tat产e',s生um的(1值00*是clo相ck同)*r的and);
E = P(A0) = P(j=0)P(A0∣j=0) + P(j=1)P(A0∣j=1)
= 1 0 1 1 0.25 2 22
P(A1) = P(j=0)P(A1∣j=0) + P(j=1)P(A1∣j=1)
= 10 11 1 2 23 6
P(A2) = P(j=0)P(A2∣j=0) + P(j=1)P(A2∣j=1)
非常见分布的随机数的产生
• 逆变换方法
由定理 1 ,要产生来自 F(x) 的随机数,只要先 产生来自U (0,1) 随机数 u ,然后计算 F 1(u) 即 可。具体步骤如下:
(1) 生成 (0,1)上 均匀分布的随机数U。
(2) 计算 X F -1(U ) ,则 X 为来自 F(x) 分布的随机数.
蒙特卡罗方法的基本思想很早以前就被人们所发现和 利用。早在17世纪,人们就知道用事件发生的“频率” 来决定事件的“概率”。19世纪人们用蒲丰投针的方法 来计算圆周率π,上世纪40年代电子计算机的出现,特别 是近年来高速电子计算机的出现,使得用数学方法在计算 机上大量、快速地模拟这样的试验成为可能。
马尔科夫计算例题

马尔科夫计算例题
马尔科夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)是一种统计模拟方法,用于从复杂的分布中抽样。
以下是一个简单的马尔科夫链蒙特卡洛计算例题:
假设我们有一个随机变量 \(X\),其分布是 \(P(X)\)。
我们的目标是计算
\(P(X)\) 的期望值,也就是:
\(\text{E}[X] = \int x P(x) dx\)
但是,直接计算这个积分是非常困难的。
因此,我们使用马尔科夫链蒙特卡洛方法来近似这个积分。
步骤如下:
1. 初始化一个随机数 \(x_0\) 作为当前状态。
2. 生成一个随机数 \(r\) 服从均匀分布 \(U(0,1)\)。
3. 计算接受率 \(A = \min(1, \frac{P(x_i)}{P(x_j)})\),其中 \(j\) 是 \(r\) 落入的区间中的状态。
4. 以概率 \(A\) 接受 \(x_j\) 作为新的状态 \(x_{i+1}\)。
5. 如果接受,回到步骤 2;否则,令 \(i = i+1\) 并回到步骤 2。
6. 重复步骤 2-5,直到达到足够的样本数量。
然后,我们可以用这些样本的平均值来近似期望值。
这是一个简单的例子,实际上马尔科夫链蒙特卡洛方法可以用于更复杂的问题,如高维积分、优化问题等。
蒙特卡洛算法

引言最近在和同学讨论研究Six Sigma(六西格玛)软件开发方法及CMMI相关问题时,遇到了需要使用Monte-Carlo算法模拟分布未知的多元一次概率密度分布问题。
于是花了几天时间,通过查询相关文献资料,深入研究了一下Monte-Carl o算法,并以实际应用为背景进行了一些实验。
在研究和实验过程中,发现Monte-Carlo算法是一个非常有用的算法,在许多实际问题中,都有用武之地。
目前,这个算法已经在金融学、经济学、工程学、物理学、计算科学及计算机科学等多个领域广泛应用。
而且这个算法本身并不复杂,只要掌握概率论及数理统计的基本知识,就可以学会并加以应用。
由于这种算法与传统的确定性算法在解决问题的思路方面截然不同,作为计算机科学与技术相关人员以及程序员,掌握此算法,可以开阔思维,为解决问题增加一条新的思路。
基于以上原因,我有了写这篇文章的打算,一是回顾总结这几天的研究和实验,加深印象,二是和朋友们分享此算法以及我的一些经验。
这篇文章将首先从直观的角度,介绍Monte-Carlo算法,然后介绍算法基本原理及数理基础,最后将会和大家分享几个基于Monte-Carlo方法的有意思的实验。
所以程序将使用C#实现。
阅读本文需要有一些概率论、数理统计、微积分和计算复杂性的基本知识,不过不用太担心,我将尽量避免过多的数学描述,并在适当的地方对于用到的数学知识进行简要的说明。
Monte-Carlo算法引导首先,我们来看一个有意思的问题:在一个1平方米的正方形木板上,随意画一个圈,求这个圈的面积。
我们知道,如果圆圈是标准的,我们可以通过测量半径r,然后用S = pi * r^2 来求出面积。
可是,我们画的圈一般是不标准的,有时还特别不规则,如下图是我画的巨难看的圆圈。
图1、不规则圆圈显然,这个图形不太可能有面积公式可以套用,也不太可能用解析的方法给出准确解。
不过,我们可以用如下方法求这个图形的面积:假设我手里有一支飞镖,我将飞镖掷向木板。
蒙特卡洛方法模拟小例子

例在我方某前沿防守地域,敌人以一个炮排(含两门火炮)为单位对我方进行干扰和破坏.为躲避我方打击,敌方对其阵地进行了伪装并经常变换射击地点.经过长期观察发现,我方指挥所对敌方目标的指示有50%是准确的,而我方火力单位,在指示正确时,有1/3的射击效果能毁伤敌人一门火炮,有1/6的射击效果能全部毁伤敌人火炮.现在希望能用某种方式把我方将要对敌人实施的20次打击结果显现出来,确定有效射击的比率及毁伤敌方火炮的平均值。
使用蒙特卡洛方法模拟50次打击结果:function [out1 out2 out3 out4]=Msc(N)% N开炮次数% out1射中概率% out2平均每次击中次数% out3击中敌人一门火炮的射击总数% out4击中敌人2门火炮的射击总数k1=0;k2=0;k3=0;for i=1:Nx0=randperm(2)-1;y0=x0(1);if y0==1fprintf('第%d次:指示正确||',i);x1=randperm(6);y1=x1(1);if y1==1|y1==2|y1==3fprintf('第%d次:击中0炮||',i);k1=k1+1;elseif y1==4|y1==5fprintf('第%d次:击中1炮||',i);k2=k2+1;elsefprintf('第%d次:击中2炮||',i);k3=k3+1;endelsefprintf('第%d次:指示错误,击中0炮||',i);k1+1;endfprintf('\n');endout1=(k2+k3)/N;out2=(0*k1+k2+2*k3)/20;out3=k2/N;out4=k3/N;运行:1.[out1 out2 out3 out4]=Msc(50)结果:1.第1次:指示正确||第1次:击中2炮||2.第2次:指示错误,击中0炮||3.第3次:指示错误,击中0炮||4.第4次:指示正确||第4次:击中0炮||5.第5次:指示错误,击中0炮||6.第6次:指示正确||第6次:击中1炮||7.第7次:指示正确||第7次:击中0炮||8.第8次:指示错误,击中0炮||9.第9次:指示正确||第9次:击中2炮||10.第10次:指示正确||第10次:击中1炮||11.第11次:指示正确||第11次:击中1炮||12.第12次:指示正确||第12次:击中2炮||13.第13次:指示错误,击中0炮||14.第14次:指示正确||第14次:击中1炮||15.第15次:指示错误,击中0炮||16.第16次:指示错误,击中0炮||17.第17次:指示正确||第17次:击中0炮||18.第18次:指示错误,击中0炮||19.第19次:指示正确||第19次:击中1炮||20.第20次:指示错误,击中0炮||21.第21次:指示正确||第21次:击中0炮||22.第22次:指示正确||第22次:击中1炮||23.第23次:指示正确||第23次:击中0炮||24.第24次:指示错误,击中0炮||25.第25次:指示正确||第25次:击中1炮||26.第26次:指示错误,击中0炮||27.第27次:指示正确||第27次:击中1炮||28.第28次:指示正确||第28次:击中0炮||29.第29次:指示正确||第29次:击中0炮||30.第30次:指示正确||第30次:击中0炮||31.第31次:指示错误,击中0炮||32.第32次:指示错误,击中0炮||33.第33次:指示正确||第33次:击中0炮||34.第34次:指示错误,击中0炮||35.第35次:指示正确||第35次:击中0炮||36.第36次:指示正确||第36次:击中0炮||37.第37次:指示错误,击中0炮||38.第38次:指示正确||第38次:击中0炮||39.第39次:指示错误,击中0炮||40.第40次:指示正确||第40次:击中0炮||41.第41次:指示正确||第41次:击中1炮||42.第42次:指示正确||第42次:击中0炮||43.第43次:指示错误,击中0炮||44.第44次:指示正确||第44次:击中1炮||45.第45次:指示正确||第45次:击中0炮||46.第46次:指示错误,击中0炮||47.第47次:指示错误,击中0炮||48.第48次:指示错误,击中0炮||49.第49次:指示正确||第49次:击中0炮||50.第50次:指示正确||第50次:击中1炮||51.52.out1 =53.54. 0.280055.56.57.out2 =58.59. 0.850060.61.62.out3 =63.64. 0.220065.66.67.out4 =68.69. 0.0600一位朋友说要贴出Monte Carlo计算积分的源程序,我就随便做一个简单的吧,复杂的程序完全可以从这个来演化,我想Monte Carlo积分的最大优势就在于高维积分,以及不规则区域,可以节约很多计算机时。
蒙特卡洛方法例题

蒙特卡洛方法例题
蒙特卡洛方法是一种基于随机抽样的数值计算方法,它通过大量模拟实验来近似求解问题。
这种方法在20世纪40年代由美国物理学家蒙特卡洛提出,如今已经在各个领域得到了广泛的应用。
蒙特卡洛方法的原理很简单,关键是确定概率模型。
首先,我们需要建立一个与问题相关的概率模型,然后生成一系列随机数,根据这些随机数计算出对应的数值结果,最后对结果进行统计分析,以得到问题的近似解。
下面我们通过一个例子来说明蒙特卡洛方法的具体应用。
例题:设随机变量X服从正态分布,即X ~ N(μ, σ^2),求X的期望值和方差。
解:我们可以使用蒙特卡洛方法来求解这个问题。
1.确定概率模型:我们已经知道随机变量X服从正态分布,所以概率模型为X = μ + σZ,其中Z ~ N(0, 1)。
2.生成随机数:生成一个标准正态分布的随机数Z1。
3.计算累积概率:根据正态分布表,查找Z1对应的概率值。
4.计算X的期望值和方差:根据概率模型,计算X的期望值μ"和方差σ"。
通过大量的蒙特卡洛模拟实验,我们可以得到X的期望值和方差的近似值。
蒙特卡洛方法在实际应用中具有广泛的应用价值,例如求解复杂数学问题、线性方程组、非线性方程或方程组、进行参数估计和假设检验等。
然而,
它也存在一定的局限性,如计算速度较慢、对采样点的数量要求较高等。
总之,蒙特卡洛方法是一种实用且高效的数值计算方法,在各个领域都取得了显著的成果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例在我方某前沿防守地域,敌人以一个炮排(含两门火炮)为单位对我方进行干扰和破坏.为躲避我方打击,敌方对其阵地进行了伪装并经常变换射击地点.
经过长期观察发现,我方指挥所对敌方目标的指示有50%是准确的,而我方火力单位,在指示正确时,有1/3的射击效果能毁伤敌人一门火炮,有1/6的射击效果能全部毁伤敌人火炮.
现在希望能用某种方式把我方将要对敌人实施的20次打击结果显现出来,确定有效射击的比率及毁伤敌方火炮的平均值。
使用蒙特卡洛方法模拟50次打击结果:
function [out1 out2 out3 out4]=Msc(N)
% N开炮次数
% out1射中概率
% out2平均每次击中次数
% out3击中敌人一门火炮的射击总数
% out4击中敌人2门火炮的射击总数
k1=0;
k2=0;
k3=0;
for i=1:N
x0=randperm(2)-1;
y0=x0(1);
if y0==1
fprintf('第%d次:指示正确||',i);
x1=randperm(6);
y1=x1(1);
if y1==1|y1==2|y1==3
fprintf('第%d次:击中0炮||',i);
k1=k1+1;
elseif y1==4|y1==5
fprintf('第%d次:击中1炮||',i);
k2=k2+1;
else
fprintf('第%d次:击中2炮||',i);
k3=k3+1;
end
else
fprintf('第%d次:指示错误,击中0炮||',i);
k1+1;
end
fprintf('\n');
end
out1=(k2+k3)/N;
out2=(0*k1+k2+2*k3)/20;
out3=k2/N;
out4=k3/N;
运行:
1.[out1 out2 out3 out4]=Msc(50)
结果:
1.第1次:指示正确||第1次:击中2炮||
2.第2次:指示错误,击中0炮||
3.第3次:指示错误,击中0炮||
4.第4次:指示正确||第4次:击中0炮||
5.第5次:指示错误,击中0炮||
6.第6次:指示正确||第6次:击中1炮||
7.第7次:指示正确||第7次:击中0炮||
8.第8次:指示错误,击中0炮||
9.第9次:指示正确||第9次:击中2炮||
10.第10次:指示正确||第10次:击中1炮||
11.第11次:指示正确||第11次:击中1炮||
12.第12次:指示正确||第12次:击中2炮||
13.第13次:指示错误,击中0炮||
14.第14次:指示正确||第14次:击中1炮||
15.第15次:指示错误,击中0炮||
16.第16次:指示错误,击中0炮||
17.第17次:指示正确||第17次:击中0炮||
18.第18次:指示错误,击中0炮||
19.第19次:指示正确||第19次:击中1炮||
20.第20次:指示错误,击中0炮||
21.第21次:指示正确||第21次:击中0炮||
22.第22次:指示正确||第22次:击中1炮||
23.第23次:指示正确||第23次:击中0炮||
24.第24次:指示错误,击中0炮||
25.第25次:指示正确||第25次:击中1炮||
26.第26次:指示错误,击中0炮||
27.第27次:指示正确||第27次:击中1炮||
28.第28次:指示正确||第28次:击中0炮||
29.第29次:指示正确||第29次:击中0炮||
30.第30次:指示正确||第30次:击中0炮||
31.第31次:指示错误,击中0炮||
32.第32次:指示错误,击中0炮||
33.第33次:指示正确||第33次:击中0炮||
34.第34次:指示错误,击中0炮||
35.第35次:指示正确||第35次:击中0炮||
36.第36次:指示正确||第36次:击中0炮||
37.第37次:指示错误,击中0炮||
38.第38次:指示正确||第38次:击中0炮||
39.第39次:指示错误,击中0炮||
40.第40次:指示正确||第40次:击中0炮||
41.第41次:指示正确||第41次:击中1炮||
42.第42次:指示正确||第42次:击中0炮||
43.第43次:指示错误,击中0炮||
44.第44次:指示正确||第44次:击中1炮||
45.第45次:指示正确||第45次:击中0炮||
46.第46次:指示错误,击中0炮||
47.第47次:指示错误,击中0炮||
48.第48次:指示错误,击中0炮||
49.第49次:指示正确||第49次:击中0炮||
50.第50次:指示正确||第50次:击中1炮||
51.
52.out1 =
53.
54. 0.2800
55.
56.
57.out2 =
58.
59. 0.8500
60.
61.
62.out3 =
63.
64. 0.2200
65.
66.
67.out4 =
68.
69. 0.0600
一位朋友说要贴出Monte Carlo计算积分的源程序,我就随便做一个简单的吧,复杂的程序完全可以从这个来演化,我想Monte Carlo积分的最大优势就在于高维积分,以及不规则区域,可以节约很多计算机时。
下面只是演示一个2重积分,可以扩展到20维的只要添加相应的loop项。
被积函数: exp(sqrt(x^2+y^2));
x 上下限:x^2 < sin(y)
y 上下限: y^2<cos(x)
1.% MONTE CARLO INT
2.% by caoer
3.clear all
4.N =100000;
5.
6.x = 2*rand(N,1)-1;
7.y = rand(N,1);
8. f = 0;
9.fsq = 0;
10.n = 0;
11.for i=1:N
12. if x(i)^2 < sin(y(i)) & y(i)^2<cos(x(i))
13.n=n+1;
14.f=f+exp(sqrt(x(i)^2+y(i)^2));
15.x_plot(n) = x(i);
16.y_plot(n) = y(i);
17. end
18.end
19.f = f/N;
20.p=n/N;
21.a = 2*1;
22.I1 = f*a; %
23.I2 = a*p; %interesting area
24.I = I1/I2
25.
26.plot(x_plot,y_plot,'o')
复制代码
蒙特卡洛法用于求积分时,与积分重数无关,这点非常重要。
虽然四维以下的积分用蒙特卡洛法效率可能不如传统的一些数值积分方法,但是维数高的时候,蒙特卡洛法比传统方法要有效的多,而且实现起来也非常容易。
可以说,计算高维积分是蒙特卡洛方法最成功和典型的应用。
基本的蒙特卡洛法具有计算不可重复性的缺点。
这里共享采用等序列分布的蒙特卡洛法等分布序列Monte Carlo积分.doc(92.5 KB, 下载次数: 24)
,具有计算可重复性,误差阶比采用基本蒙特卡洛法好的优点。
就基本的蒙特卡洛法求积分来说,不管积分重数多少,基本上是计算规模增加100倍,精度提高10倍。