蒙特卡洛模拟
一、直观理解:用大量随机试验逼近答案
蒙特卡洛(Monte Carlo,MC)模拟的核心思想是:当某个量很难用解析公式直接算出来时,就设计一种随机试验,让这个量等于试验输出的期望;再通过大量独立重复,用样本均值去逼近期望。
最经典的例子是用“撒豆子”估计圆周率。在边长为 2 的正方形中内接单位圆,向正方形内均匀投点。落入圆内的比例乘以正方形面积,就得到 的估计。投点越多,估计通常越稳。
在数学建模中,蒙特卡洛常见于:
- 估计复杂积分、概率或期望;
- 对成本、收益、损失做风险分析(均值、分位数、VaR);
- 在排队、库存、可靠性问题中生成随机情景;
- 对解析模型难以处理的非线性系统做数值实验。
蒙特卡洛给出的是带误差的数值近似,不是精确解。因此,报告结果时必须同时给出重复次数、标准误或置信区间,而不能只写一个点估计。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 目标量可写成随机变量函数的期望或概率;能从相关分布中抽样;需要评估风险分布而非单点预测;解析积分或组合爆炸导致直接计算不可行。 |
| 核心优点 | 实现直观、对维数升高往往比网格法更稳健;易于并行;便于估计完整输出分布;容易与敏感性分析结合。 |
| 局限与缺点 | 误差通常按 下降,要提高一位精度约需百倍样本;罕见事件下普通 MC 效率极低;输入分布设错会产生系统性偏差;单次运行没有代表性。 |
使用前应确认:
- 目标量是否确实可表示为期望、概率或分位数;
- 输入随机变量的分布与依赖结构是否有数据或理论依据;
- 是否需要方差缩减(重要性采样、对偶变量、控制变量等);
- 计算预算允许的最大重复次数 ;
- 是否有解析特例可用于校准程序正确性。
三、核心原理:用样本均值估计期望
设目标是估计
其中 服从密度 , 为可测函数(例如损失、指示函数、效用)。
1. 独立抽样与点估计
独立抽取 ,定义
由大数定律,在较弱条件下 (几乎必然)。
2. 标准误与置信区间
若 ,则中心极限定理给出
样本标准差为 ,蒙特卡洛标准误(MCSE)为
近似 置信区间为 。
3. 概率估计的特例
若估计 ,取 ,则 为命中频率,
当 极小时,需要极大的 才能看到足够多次事件,此时应考虑重要性采样。
四、如何确定重复次数与抽样方案
常见决策包括:
- 重复次数 :先用较小 估计 ,再按目标精度 取 ;
- 分布来源:参数应由数据拟合、文献或情景假设明确给出,并做敏感性分析;
- 依赖结构:多变量时不能默认独立,可用协方差、Copula 或条件分布建模;
- 随机种子:固定
rng以保证可复现,同时用多个种子检查稳定性; - 输出指标:除均值外,报告分位数、直方图或经验分布函数。
这些选择应在观察最终结论前尽量确定,并在论文中说明依据。
五、MATLAB 示例
下面用单位圆面积法估计 ,并给出标准误与收敛曲线。代码完整可运行。
%% 蒙特卡洛估计圆周率,并报告标准误
rng(42); % 固定种子,保证可复现
R = 1e5; % 投点次数
% 在正方形 [-1,1]^2 内均匀抽样
xy = 2 * rand(R, 2) - 1;
inside = sum(xy.^2, 2) <= 1; % 是否落入单位圆
% 面积估计:正方形面积 4 乘以落入比例
g = 4 * inside; % 每次试验的输出
piHat = mean(g);
se = std(g) / sqrt(R);
ci = piHat + [-1.96, 1.96] * se;
fprintf("估计值 piHat = %.6f\n", piHat);
fprintf("MC 标准误 SE = %.6f\n", se);
fprintf("近似 95%% 置信区间 = [%.6f, %.6f]\n", ci(1), ci(2));
fprintf("与真值误差 = %.6f\n", abs(piHat - pi));
%% 观察估计随样本量的收敛
Rs = round(logspace(2, 5, 40));
est = zeros(size(Rs));
ses = zeros(size(Rs));
for i = 1:numel(Rs)
r = Rs(i);
gi = g(1:r);
est(i) = mean(gi);
ses(i) = std(gi) / sqrt(r);
end
figure;
errorbar(Rs, est, 1.96*ses, "LineWidth", 1);
hold on;
yline(pi, "--r", "真值 \pi");
set(gca, "XScale", "log");
xlabel("重复次数 R");
ylabel("\pi 的估计");
title("蒙特卡洛估计的收敛与置信带");
grid on;
legend("估计\pm1.96SE", "真值", "Location", "best");
第二个小例子:估计正态随机变量平方超过阈值的概率。
rng(7);
R = 2e5;
X = randn(R, 1);
thresh = 2.5;
pHat = mean(X.^2 > thresh);
seP = sqrt(pHat * (1 - pHat) / R);
fprintf("P(X^2 > %.1f) ≈ %.6f, SE = %.6f\n", thresh, pHat, seP);
六、如何解释结果
完整报告通常应包括:
- 目标量的数学定义(期望、概率、分位数);
- 输入随机变量的分布、参数与依赖假设;
- 重复次数 与随机种子;
- 点估计、标准误与置信区间;
- 必要时给出直方图、收敛图或多种子对比;
- 与解析解、极限情形或历史数据的对照;
- 主要误差来源:抽样误差、模型设定误差、数值实现错误。
解释时要把数值翻译回问题语言。例如“ mon 特卡罗给出日均排队长度约 3.2,95% 区间为 [3.0, 3.4]”,并说明在何种到达率与服务率假设下成立。
七、常见误区
1. 只报告一次运行的点估计
没有标准误的蒙特卡洛结果无法判断精度。至少应报告 与 SE 或置信区间。
2. 把抽样误差当成模型结论的稳健性
SE 变小只说明重复够多,不能证明输入分布或系统规则正确。
3. 在罕见事件上硬用朴素 MC
若事件概率为 ,即使用 次试验也可能几乎看不到事件。应改用重要性采样等方差缩减技术。
4. 默认多变量独立
相关性会显著改变尾部风险。忽略依赖结构常导致风险被低估或高估。
5. 不固定种子且无法复现
竞赛与论文都要求结果可复现。应记录 rng 种子、MATLAB 版本与关键参数。
八、小结
蒙特卡洛模拟用“大量随机试验的平均”逼近期望与概率。它实现简单、适用范围广,但精度受 规律约束,且严重依赖输入分布的合理性。
使用蒙特卡洛时,应同时抓住三件事:正确的随机模型、足够的重复次数、完整的误差报告。在此基础上,它才能成为风险分析、积分估计与复杂系统数值实验的可靠工具。