跳到主要内容

蒙特卡洛模拟

一、直观理解:用大量随机试验逼近答案​

蒙特卡洛(Monte Carlo,MC)模拟的核心思想是:当某个量很难用解析公式直接算出来时,就设计一种随机试验,让这个量等于试验输出的期望;再通过大量独立重复,用样本均值去逼近期望。

最经典的例子是用“撒豆子”估计圆周率。在边长为 2 的正方形中内接单位圆,向正方形内均匀投点。落入圆内的比例乘以正方形面积,就得到 π\pi 的估计。投点越多,估计通常越稳。

在数学建模中,蒙特卡洛常见于:

  • 估计复杂积分、概率或期望;
  • 对成本、收益、损失做风险分析(均值、分位数、VaR);
  • 在排队、库存、可靠性问题中生成随机情景;
  • 对解析模型难以处理的非线性系统做数值实验。

蒙特卡洛给出的是带误差的数值近似,不是精确解。因此,报告结果时必须同时给出重复次数、标准误或置信区间,而不能只写一个点估计。

二、适用场景与优缺点​

类型说明
适用场景目标量可写成随机变量函数的期望或概率;能从相关分布中抽样;需要评估风险分布而非单点预测;解析积分或组合爆炸导致直接计算不可行。
核心优点实现直观、对维数升高往往比网格法更稳健;易于并行;便于估计完整输出分布;容易与敏感性分析结合。
局限与缺点误差通常按 O(1/R)O(1/\sqrt{R}) 下降,要提高一位精度约需百倍样本;罕见事件下普通 MC 效率极低;输入分布设错会产生系统性偏差;单次运行没有代表性。

使用前应确认:

  1. 目标量是否确实可表示为期望、概率或分位数;
  2. 输入随机变量的分布与依赖结构是否有数据或理论依据;
  3. 是否需要方差缩减(重要性采样、对偶变量、控制变量等);
  4. 计算预算允许的最大重复次数 RR;
  5. 是否有解析特例可用于校准程序正确性。

三、核心原理:用样本均值估计期望​

设目标是估计

μ=E[g(X)]=∫g(x) f(x) dx\mu=\mathbb{E}[g(X)]=\int g(x)\,f(x)\,\mathrm{d}x

其中 XX 服从密度 ff,gg 为可测函数(例如损失、指示函数、效用)。

1. 独立抽样与点估计​

独立抽取 X1,…,XR∼fX_1,\ldots,X_R\sim f,定义

μ^R=1R∑r=1Rg(Xr)\hat\mu_R=\frac{1}{R}\sum_{r=1}^{R}g(X_r)

由大数定律,在较弱条件下 μ^R→μ\hat\mu_R\to\mu(几乎必然)。

2. 标准误与置信区间​

若 σ2=Var(g(X))<∞\sigma^2=\mathrm{Var}(g(X))<\infty,则中心极限定理给出

μ^R≈N ⁣(μ,σ2R)\hat\mu_R\approx\mathcal{N}\!\left(\mu,\frac{\sigma^2}{R}\right)

样本标准差为 ss,蒙特卡洛标准误(MCSE)为

SE=sR\mathrm{SE}=\frac{s}{\sqrt{R}}

近似 95%95\% 置信区间为 μ^R±1.96 SE\hat\mu_R\pm 1.96\,\mathrm{SE}。

3. 概率估计的特例​

若估计 p=P(A)p=\mathbb{P}(A),取 g(X)=1A(X)g(X)=\mathbf{1}_A(X),则 p^\hat p 为命中频率,

SE≈p^(1−p^)R\mathrm{SE}\approx\sqrt{\frac{\hat p(1-\hat p)}{R}}

当 pp 极小时,需要极大的 RR 才能看到足够多次事件,此时应考虑重要性采样。

四、如何确定重复次数与抽样方案​

常见决策包括:

  • 重复次数 RR:先用较小 R0R_0 估计 ss,再按目标精度 ε\varepsilon 取 R≈(1.96s/ε)2R\approx(1.96 s/\varepsilon)^2;
  • 分布来源:参数应由数据拟合、文献或情景假设明确给出,并做敏感性分析;
  • 依赖结构:多变量时不能默认独立,可用协方差、Copula 或条件分布建模;
  • 随机种子:固定 rng 以保证可复现,同时用多个种子检查稳定性;
  • 输出指标:除均值外,报告分位数、直方图或经验分布函数。

这些选择应在观察最终结论前尽量确定,并在论文中说明依据。

五、MATLAB 示例​

下面用单位圆面积法估计 π\pi,并给出标准误与收敛曲线。代码完整可运行。

%% 蒙特卡洛估计圆周率,并报告标准误
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);

六、如何解释结果​

完整报告通常应包括:

  1. 目标量的数学定义(期望、概率、分位数);
  2. 输入随机变量的分布、参数与依赖假设;
  3. 重复次数 RR 与随机种子;
  4. 点估计、标准误与置信区间;
  5. 必要时给出直方图、收敛图或多种子对比;
  6. 与解析解、极限情形或历史数据的对照;
  7. 主要误差来源:抽样误差、模型设定误差、数值实现错误。

解释时要把数值翻译回问题语言。例如“ mon 特卡罗给出日均排队长度约 3.2,95% 区间为 [3.0, 3.4]”,并说明在何种到达率与服务率假设下成立。

七、常见误区​

1. 只报告一次运行的点估计​

没有标准误的蒙特卡洛结果无法判断精度。至少应报告 RR 与 SE 或置信区间。

2. 把抽样误差当成模型结论的稳健性​

SE 变小只说明重复够多,不能证明输入分布或系统规则正确。

3. 在罕见事件上硬用朴素 MC​

若事件概率为 10−610^{-6},即使用 10610^{6} 次试验也可能几乎看不到事件。应改用重要性采样等方差缩减技术。

4. 默认多变量独立​

相关性会显著改变尾部风险。忽略依赖结构常导致风险被低估或高估。

5. 不固定种子且无法复现​

竞赛与论文都要求结果可复现。应记录 rng 种子、MATLAB 版本与关键参数。

八、小结​

蒙特卡洛模拟用“大量随机试验的平均”逼近期望与概率。它实现简单、适用范围广,但精度受 1/R1/\sqrt{R} 规律约束,且严重依赖输入分布的合理性。

使用蒙特卡洛时,应同时抓住三件事:正确的随机模型、足够的重复次数、完整的误差报告。在此基础上,它才能成为风险分析、积分估计与复杂系统数值实验的可靠工具。