蒙特卡罗方法简介
蒙特卡罗(Monte Carlo, abbr. MC)方法是利用独立重复的统计实验来对物理及数学问题求解的方法。一个简单的关于MC方法的应用即求解图形的面积。
例:求解的面积?
%投点次数
M = 1000;
A = rand(M,2);
r = sqrt((A(:,1) - 0.5).^2 + (A(:,2) - 0.5).^2);
total = sum(r < 0.5);
pr = total / M;
disp(pr)
%绘图
xt = @(t) 0.5*cos(t) +0.5;
yt = @(t) 0.5*sin(t) + 0.5;
fplot(xt,yt)
hold on
plot(A(:,1),A(:,2),'.');
grid on
axis equal
axis([0,1,0,1])
计算结果:0.7630
计算结果
MC求解面积的数学原理便是弱大数定理的方法
设相互独立,服从同一分布的随机变量序列,且具有数学期望,作前个变量的算术平均,则对任意的,有
可以简单的理解为若统计的数据足够大,则事物的频率可无限接近于其期望。
利用MC方法求解一维热传导方程的边值问题
下面以2018年数学建模国赛A题为例,利用MC方法进行求解其第一问。
题目:热防护服的设计
人们在温度较高的环境下工作时,通常都要穿上专门的服装来避免灼伤。一般的避免灼伤专用服装是由三层的织物材料构成,分布标记为 I、II、III 层,而其中的 I 层与外界环境接触,III 层与皮肤之间还存在着空隙,所以我们将此空隙标记为 IV 层。为了降低研发专用服装成本、缩短研发设计专用服装的周期,首先把体内温度控制在 37ºC 的假人放置在实验室的高温环境中,然后建立数学模型来测量假人皮肤外侧的温度,并且解决下列问题:
(1)附件1给出了专用服装材料的一些参数值,附件 2 给出了在环境温度为 75 ℃、II 层的厚度为 6 毫米、IV 层的厚度为 5 毫米、工作时间为 90 分钟的条件下假人皮肤外侧的温度的变化情况。请建立适当的数学模型来计算温度的分布,最后把计算好的温度生成为 Excel 文件。
附件1. 专用服装材料的参数值
分层 | 密度() | 比热 (ºC)) | 热传导率 (W/(m·℃)) | 厚度 () |
---|---|---|---|---|
I层 | 300 | 1377 | 0.082 | 0.6 |
II层 | 862 | 2100 | 0.37 | 0.6-25 |
III层 | 74.2 | 1726 | 0.045 | 3.6 |
IV层 | 1.18 | 1005 | 0.028 | 0.6-6.4 |
附件2. 假人皮肤外侧的测量温度
时间 (s) | 温度 (℃) | 时间 (s) | 温度 (℃) |
---|---|---|---|
0 | 37.00 | 5396 | 48.08 |
1 | 37.00 | 5397 | 48.08 |
2 | 37.00 | 5398 | 48.08 |
3 | 37.00 | 5399 | 48.08 |
4 | 37.00 | 5400 | 48.08 |
解析题目
对于这种方法能量传递类问题,一般应考虑利用热传导方程来进行求解
其中是热传导系数。对于如题的一维问题,可简化上述方程为
其中代表不同层次的热传导系数(如第 I 层的热传导系数)。
完善初始条件和边界条件
初始条件
边界条件
至于在两层的界面之间的联系则依据热流量密度连续的原理进行定义
下面使用MC方法求解热传导方程。取差分距离点:对距离进行差分
对时间进行差分
利用六点半隐式差分方法对原方程差分化
其中拉布拉斯算子采用层和层的中央差分和的平均
层
层
合并两层
令 得
考虑
其中 .
依据上式可以得知,的求得与这五项及其相应对的贡献权重/比例(即)密切相关。
那么我们可设想人随机走动的模式:位于处的人分别以概率向临近点移动。确定待移位置后,人到达待移位置,继续以类似的形式移动,直到人到达边界处(或者边界点).将其赋值为.
原理图对一个的子样重复次掷点,从而得到。那么可认为的无偏估计为
依据上面的思路,即可求解出整个的热量传输过程的温度变化
计算机实现步骤
为加快求解速度,采用MATLAB中MATLAB Coder应用生成mex文件后(使用JIT编译器)进行生成。上述应用只能对函数进行编译,因而下文均在函数——MC_PDE中进行书写。下文以第IV层计算为例予以说明。
运行实现
定义函数的参数和返回值
function u = MC_PDE(temp_90,M)
% temp_90 :90分钟外界边界条件
% M = 10:投点次数
初始条件设置
%热传导方程系数
k = 0.028;
%内层边界条件(皮肤)
edge_first = repmat(37,1,5401);
%长度维起始行
edge_location = 1;
edge_location = int32(edge_location);
% 长度维终止点
l_end = 50;
l_end = int32(l_end);
%% x方向
% x方向划分间隔
h = 0.1;
% x方向:值域,x ∈ ( 0, x_max)
x_max = 15.2;
%x_initial = 0 : h :1;
% x方向迭代次数
x_times = x_max / h - 1;
x_times = int32(x_times);
%% t方向
% t方向划分间隔
tau =1;
% 时间值域:t ∈ ( 1, t_max)
t_max = 5401;
% 时间迭代次数
t_tims = t_max / tau;
t_tims = int32(t_tims);
temp_total = 0;
%系数求解
r = k * ( tau / (h^2) );
coef = 1 / (1 + r);
%%u初始化
u = zeros(x_times+1,t_tims) * nan;
% 初值条件
u(:,1) = 37;
% 边值条件
u(edge_location,:) = edge_first;
u(x_times+1, :) = temp_90(:,2)';
随机走动部分
for j_value = (edge_location + 1) : l_end
disp(j_value)
for n = 2:5401
% 投掷点
temp = zeros(1,M);
for point_num = 1 : M
t = int32(n);
l = int32(j_value);
while(1)
xi = rand();
if xi > 0 && xi < coef * (1/2 * r)
l = l + 1;
%检验函数
if l == 152
basicvalue = u(152,t);
temp(point_num) = basicvalue;
signal = 1;
elseif l == 1
basicvalue = u(1,t);
temp(point_num) = basicvalue;
signal = 1;
elseif t == 1
basicvalue = u(l,1);
temp(point_num) = basicvalue;
signal = 1;
else
temp(point_num) = nan;
signal = 0;
end
if signal == 1
break
end
elseif xi >= coef * (1/2 * r) && xi < coef * ( r)
l = l - 1;
%检验函数
if l == 152 || l == 1 || t == 1
basicvalue = u(l,t);
temp(point_num) = basicvalue;
signal = 1;
else
temp(point_num) = nan;
signal = 0;
end
if signal == 1
break
end
elseif xi >= coef * ( r) && xi < coef
t = t - 1;
%检验函数
if l == 152 || l == 1 || t == 1
basicvalue = u(l,t);
temp(point_num) = basicvalue;
signal = 1;
else
temp(point_num) = nan;
signal = 0;
end
if signal == 1
break
end
elseif xi >= coef && xi < coef * (1 + (1/2)*r)
l = l + 1;
t = t - 1;
%检验函数
if l == 152 || l == 1 || t == 1
basicvalue = u(l,t);
temp(point_num) = basicvalue;
signal = 1;
else
temp(point_num) = nan;
signal = 0;
end
if signal == 1
break
end
elseif xi >= coef * (1 + (1/2)*r) && xi < 1
t = t - 1;
%检验函数
if l == 152 || l == 1 || t == 1
basicvalue = u(l,t);
temp(point_num) = basicvalue;
signal = 1;
else
temp(point_num) = nan;
signal = 0;
end
if signal == 1
break
end
end
end
end
%期望计算部分
temp_total = sum(temp);
u(j_value, n) = temp_total / M;
end
end
运行结果分析
下面结论依据掷点数为1000的条件得到。运行时间为10803.82s(约3h)。
三维图不可否认,由于MC方法求解的特殊性,温度随着时间和厚度的变化并不均匀。这一点可以从上图不断凸起的低矮“小山”这一现象中可知。
二维热图二维热图可清楚可见三道明显的分界线,进热源点随时间温度变高,符合构建模型预期。
总结
- 从计算复杂度看,复杂度略显偏大。求解速度呈现出求解区域靠近边界附近运算速度快,中间较为慢的特点,这个特点与这个算法的机制密切相关(因为中间的点难以足够快的速度移动到边界)。
- 从求解方法看,MC法相比隐式求解求解而言,对某个多维点而言,不必求解出各个层次的值,只需对这个多维点取足够多的子样即可求解。
刘春光. 偏微分方程边值问题的蒙特卡罗解法[D]. 吉林大学, 2004.
网友评论