生物热仿真(2):蒙特卡洛一维仿真

前言

在上次生物热仿真(1):无生命材料的热传导简析一文中,针对热传导公式的来源和推导进行了讲解。本来第二章准备写一下生物热传导中的一些具体内容,但是由于实际的工作需求和由易到难的原则,本章将针对蒙特卡洛(MC)方法进行实际编程的相关讲解。

原理

在上文中,一维传导问题的差分化方程为:
T(x_i,t_{j+1}) = \alpha \Delta t \frac{T(x_{i+1},t_j)+T(x_{i-1},t_j)-2T(x_{i},t_j)}{(\Delta x)^2} + T(x_i,t_{j}) \tag{1.1}
\lambda = \frac{\alpha \Delta t}{(\Delta x)^2},式(1.1)可以化为:
T(x_i,t_{j+1}) = \lambda T(x_{i+1},t_j) + \lambda T(x_{i-1},t_j) + (1-2\lambda) T(x_i,t_{j}) \tag{1.2}
易见\lambda+\lambda+(1-2\lambda)=1,因此可将系数视作概率处理,按照概率使T(x_i,t_{j+1})等于后三项,然后求取期望计科估算T(x_i,t_{j+1})

算法流程描述如下:

进行N次随机投点,每次获得一个0-1间的随机数

根据概率分布选择对应的温度,如:

x = rand()

if ( x < \lambda ): T(x_i,t_{j+1}) = T(x_{i+1},t_j)

else if ( x < 2\lambda ): T(x_i,t_{j+1}) = T(x_{i-1},t_j)

else if ( x < 1 ): T(x_i,t_{j+1}) = T(x_{i},t_j)

记录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代码可见深雨露的利用蒙特卡罗法求解热传导方程一文。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容