主成分分析实在是有点难啊,萌新看不懂,过两天研究一下再说
蒙特卡罗法的基本概念
蒙特卡罗法(Monte Carlo Method)是一种基于随机采样的数值计算方法,通过重复随机抽样来近似求解数学、物理或工程问题。其核心思想是利用概率统计理论,通过大量实验结果的统计平均来逼近目标值。
核心是:用大量随机数或者统计大量数据来实现某一个目标,原理就是大数定理,当样本容量足够大时发生频率即为其概率
数学建模没有专门的蒙特卡罗算法,要根据实际需求写代码
常见的蒙特卡罗算法:
示例:
1.计算圆周率π
- 在单位正方形内随机投点,坐标为
。
- 统计落在单位圆内的点数量 (M)(满足
)。
- 圆周率估计值为:
其中 (N) 为总投点数。 - 代码
clc; clear; % 参数初始化:投放10000个点,圆半径为1,圆心坐标(1,1) % 初始时还未投放点,有0个点在圆内 p = 10000; r = 1; x0 = 1; y0 = 1; n = 0; hold on; % 保持绘图窗口,多次绘图 for i = 1:p % 对于要投放的总共p个点 % rand函数产生在(0,1)之间的随机数 px = rand * 2; % 随机生成该点的横坐标 py = rand * 2; % 随机生成该点的纵坐标 % 若该点在圆内,则颜色设为蓝色,变量n加一;在圆外则设为红色 if (px - 1)^2 + (py - 1)^2 < 1 % 横纵坐标的平方和小于半径,则在圆内 plot(px, py, '.', 'Color', 'b'); n = n + 1; else plot(px, py, '.', 'Color', 'r'); end end axis equal; % 绘图时横纵坐标单位长度相同,便于观察圆 s = (n / p) * 4; pi0 = s;
这里补充一个为什么用hold on以及随机数生成
1. hold on
在 MATLAB 中,hold on
用于保留当前图形窗口中的已有图形内容,使后续绘图命令不会覆盖已有图形。默认情况下,每次调用绘图函数(如 plot
、scatter
)会清除之前的图形并重新绘制。
使用场景
- 叠加绘图:在同一坐标系中绘制多条曲线或图形时,避免覆盖之前的内容。
- 对比数据:将多组数据绘制在同一图中,便于直观对比趋势或分布。
2. 随机数生成
生成均匀分布的随机数
使用 rand
函数生成 [0, 1)
区间内均匀分布的随机数。
- 生成单个随机数:
r = rand
- 生成
m×n
矩阵随机数:R = rand(m, n)
- 生成指定区间
[a, b]
的均匀随机数:R = a + (b-a)*rand(m, n)
生成正态分布的随机数
使用 randn
函数生成标准正态分布(均值为0,标准差为1)的随机数。
- 生成单个随机数:
r = randn
- 生成
m×n
矩阵随机数:R = randn(m, n)
- 生成自定义参数的正态随机数(均值
mu
,标准差sigma
):
R = mu + sigma*randn(m, n)
生成随机整数
使用 randi
函数生成指定范围内的随机整数。
- 生成
[1, k]
的随机整数:r = randi(k)
- 生成
[a, b]
的随机整数矩阵:R = randi([a, b], m, n)
2.投针实验
投针实验(Buffon's Needle Experiment)是18世纪法国数学家布丰(Georges-Louis Leclerc, Comte de Buffon)提出的概率问题,用于通过物理实验估算圆周率π的值。其核心思想是通过随机投掷针到平行线平面上,利用几何概率计算针与线相交的概率,进而推导π的近似值。
假设平面上有一组间距为d的平行线,针的长度为l(要求l ≤ d)。随机投掷针时,针与任一条平行线相交的概率P与π相关,公式为:
通过大量实验统计相交次数N与总投掷次数T的比值(即频率),可近似概率P ≈ N/T,从而反推π的估计值:
3.三门问题
三门问题(Monty Hall Problem)源自美国电视节目《Let's Make a Deal》,由主持人Monty Hall命名。问题描述如下:
- 参与者面前有三扇关闭的门,背后分别是一辆车和两只山羊。
- 参与者选择一扇门(如门1),主持人(知道门后情况)会打开另一扇有山羊的门(如门3),并询问是否改选门2。
- 问题的核心是:坚持原选择或改选,哪种策略赢得汽车的概率更高?
经典解答
改选策略的胜率为2/3,坚持原选择的胜率为1/3。
- 初始选择正确的概率为1/3,此时坚持获胜,改选失败。
- 初始选择错误的概率为2/3(车在其他两扇门后),主持人会排除错误选项,改选必然获胜。
n = 100000; % n 代表蒙特卡罗模拟重复次数
a = 0; % a 表示不改变主意时能赢得汽车的次数
b = 0; % b 表示改变主意时能赢得汽车的次数
c = 0; % c 表示没有获奖的次数
for i = 1:n % 开始模拟 n 次
x = randi([1,3]); % 汽车在门 x 后
y = randi([1,3]); % 参赛者最初选的 y
change = randi([0,1]); % 0 不改变,1 改变
if x == y
% 初始门就是汽车门
if change == 0
a = a + 1; % 不改变则赢
else
c = c + 1; % 改变则输
end
else
% 初始门不是汽车门
if change == 1
b = b + 1; % 改变则赢
else
c = c + 1; % 不改变则输
end
end
end
disp(['不改变主意时的获奖概率:', num2str(a/n)]);
disp(['改变主意时的获奖概率:', num2str(b/n)]);
disp(['未获奖的概率:', num2str(c/n)]);