用 Python 做导热问题的数值计算

浏览: 2431

阅读本文大概需要3.5 分钟

本篇作者:小匡同学

    作为科研 go,MATLAB 一直是做数值计算的标配。然而目前 Python 的火爆程度、 丰富的第三方库、灵活便捷的编程方式,也让科研 go 们垂涎不已。本篇文章从NHT(数值传热学)的基本原理与 Python 代码实现两个方面带领 NHT 小白入坑, 老司机自动略过

要点:

  • 工具 Pycharm 

  • 第三方库为 Numpy 和 matplotlib 

  • Py3

01开发环境准备

1).Python 用于科学计算

要先安装第三方的科学计算库,这里我们主要做数值计算,Numpy就可以啦。数值计算结果需要以图形曲线的形式输出,在 Python中 matplotlib 库可用于绘制类似于 MATLAB 的图表

2).对于习惯了 MATLAB 编程的人员来说

MATLAB 安装的时候直接安装了 所有库,非常便捷。然而Python 的所有库都需要自己安装

3).可以安装 Anaconda

它基本包括了市面上所有常用库,然后将 pycharm的解释器修改为 anaconda 的解释器,相当于MATLAB 了。由于安装的库多,相 应的软件的启动运行都非常慢,想想 MATLAB 启动就知道了

4).第三方库的安装

对于新手比较麻烦。这里推荐一种简单的方法。 在 File→Settings→Project Interpreter 中,可以看到已安装的库 

image.png


右边红框中,减号表示卸载选中的库,箭头表示升级库,如果要安装新库,

则选择加号

image.png


在上方可以在线搜索所需要的库,右下角可以选择版本,点击安装就可以在 线安装库。全程傻瓜式操作,方便快捷!

02导热问题分析

1).金属导热问题

假设一根等截面的直金属棒,长度 2m,受到内热源加热,线热流密度为1000W/m,金属棒两端为定壁温边界,温度 300K。稳态导热下,温度分布满足 如下的控制方程。

image.png

2).如果将坐标原点选择在金属棒的中心,则本问题的解析解为:

image.png

3).在数值传热学的计算中

需要在金属棒上划分网格节点,本例中我们在金属 棒上均匀布置 n 个节点,考虑到两端各需要一个节点,因此金属棒实际被分成了n-1 段微元。这 n 各节点上的温度值组成了一个一维数组,因此可以用一个一维 数组保存各节点的温度信息

image.png


  • 有了这个离散方程,基本就可以开始进行数值计算中最常用的迭代计算了。 然而还需要一个判断迭代结束的条件,在 CFD/NHT 中,叫做收敛准则

  • 事实上 数值计算的基本原理就是通过设计好的算法不断迭代,从而构建一个柯西列,如 果这个数列依范数收敛了,则可以认为它收敛于真实解。

  • 依范数收敛可以简单的 认为就是相邻两次迭代之差的范数(1,2,无穷范数都可)趋于 0,就可以认为 收敛。

因此内存中要始终保持两个一维数组,一个保存当前迭代得到的温度值, 一个是上一次迭代得到的温度值。最后,完整的程序代码如下:

 

image.png

迭代结果如下 :

image.png


  • 多次迭代结果都是在 300K 附近,迭代似乎没有进行就结束了。事实上,观 察第 14 行,是将当前的温度数组赋值给上一步的温度数组,然后迭代计算更新 当前的温度数组

  • 这个过程中,出现了数组的拷贝操作,不同于 MATLAB,在Python 中数组的拷贝并不是创建一个新数组,而只是将新的数组名指向原数组在 内存中的地址

  • 这样做的结果就是 temp 和 temp_up 在内存中其实是存储了相同的数据,二者同步改变,二者之差的范数因此始终是 0,程序认为迭代已收敛, 直接跳出了 

4).多次迭代的结果

迭代10次

image.png

数值结果在不断趋近于解析结果


迭代 200次

image.png

数值结果与解析结果已经完全重合,计算完成。
熟悉 MATLAB 的同学可能发现,Python 绘图与 MATLAB 十分类似,不仅是操作代码近似,图片风格也一样。这是因为 matplotlib 库的开发初衷就是为了 像 MATLAB 那样方便快捷的绘制图形曲线

03关于Pycharm断点调试

1).首先设置断点

然后 alt+shift+F9,进入调试模式。注意这里需要键盘操作。直接点击 pycharm界面的 debug 按钮,无法进行下一步的操作。 进入调试后,从下面的 debugger进入 console 界面 

image.png

2).点击那个“show Python prompt”按钮 

image.png


3).就可以在 console 中输入想要查看的变量的数值了

比如本例中的 xxline 存储的 是所有网格节点的 x 坐标,是个一维数组 

image.png


欢迎大家关注 菜鸟学Python",更多好玩有趣的Python原创教程,趣味算法,经验技巧,行业动态,尽在菜鸟学Python,一起来学python吧


 长按二维码,关注【菜鸟学python】


image.png

推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册