前言
在上次生物热仿真(1):无生命材料的热传导简析一文中,针对热传导公式的来源和推导进行了讲解。本来第二章准备写一下生物热传导中的一些具体内容,但是由于实际的工作需求和由易到难的原则,本章将针对蒙特卡洛(MC)方法进行实际编程的相关讲解。
原理
在上文中,一维传导问题的差分化方程为:
设,式(1.1)可以化为:
易见,因此可将系数视作概率处理,按照概率使
等于后三项,然后求取期望计科估算
算法流程描述如下:
进行N次随机投点,每次获得一个0-1间的随机数
根据概率分布选择对应的温度,如:
x = rand()
if ( x <
):
else if ( x <
):
else if ( x <
):
记录N次的结果,求平均值,可得估计结果
代码实现
由于1维的MC意义其实不是很大,精确度反而比FDM低,这里写的是有限差分的代码(逃
double MonteCarlo::iterate()
{
std::vector<double> next_temp_1d(temp_1d.size());
// double lambda = shape->getAlpha(0,0,0)*step/(shape->getStep(0)*shape->getStep(0));
double lambda = shape->getAlpha(0,0,0);//*step/(shape->getStep(0)*shape->getStep(0));
for(int i=1; i<temp_1d.size()-1; ++i) {
next_temp_1d[i] = lambda*temp_1d[i+1]+lambda*temp_1d[i-1]+(1-2*lambda)*temp_1d[i];
}
next_temp_1d[0] = temp_1d[0];
next_temp_1d[next_temp_1d.size()-1] = next_temp_1d[next_temp_1d.size()-2];
temp_1d.assign(next_temp_1d.begin(), next_temp_1d.end());
return 0.0;
}
P.S. 蒙特卡洛一维热仿真的matlab代码可见深雨露的利用蒙特卡罗法求解热传导方程一文。