Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

介绍

拉普拉斯方程是一种最简单的二阶偏微分方程,同样也是一种最简单的椭圆形偏微分方程。此方程在科学界,尤其是物理学上具有举足轻重的地位,因为它能够描述电势能和热传导问题。在热力学(热传导)中,我们将拉普拉斯方程称为稳态热方程或者热传导方程。

在这篇文章中,我们将用数值求解代替积分求解,来求解拉普拉斯方程。当我们一提到数值方法,就意味着离散化。离散化就是将连续形式的微分方程转化为离散形式,同时它意味着我们将积分问题转化为线性代数问题,以便使用程序解决。

在这篇文章中,我们使用有限差分法来求解简单的热传导问题。我们的编程语言是 Python,使用的库有:Numpy(numerical library for Python) 和 matplotlib(library for plotting and visualizing data using Python)。下面将看到,我们可以使用很少的 Python 代码来实现丰富的功能。

背景

在计算物理中,我们经常编程来解决问题,因为计算机程序可以进行大型且复杂的计算。计算物理领域就像下图所展示的一样:

现如今,有很多编程语言可以进行数值计算,例如 MATLAB。但是此处我们使用 Python,因为它简单易学而且还免费。它有很多非常好用的数值计算和数据可视化库,例如 Numpy,Scipy 和 Matplotlib。Python 也提供可以实现并行计算,我们可以在计算机集群上运行 Python 程序。

让我们回到拉普拉斯方程上,下一节我们将使用 Python 来计算简单的二维热传导方程。首先我们默认读者们已经了解了关于有限差分法的基本理论知识,此处我不再详细介绍有限差分法的内容,离散化带来的误差问题,稳定性问题,一致性问题,收敛问题以及测试优化问题等我也不详细说明。同样,我们也将会跳过很多计算公式。

此处我们关注的只是如何使用 Python,Numpy 和 Matplotlib 来解决问题,当然也捎带的讲述一点计算的物理意义,但是我们不会过多的关注数值分析验证问题。所以下面给出的源代码对那些不懂计算物理学的读者来说是有价值的。

准备工作

我们的实验环境:

系统 OS: Linux Ubuntu 14.04 LTS

Python: Python 2.7

Numpy: Numpy 1.10.4

Matplotlib: Matplotlib 1.5.1

如果你使用的是 Ubuntu 系统,你可以使用 pip 来安装 Numpy 和 Matplotlib,或者在你的终端上运行下面的语句:

用下面的语句安装 Matplotlib

注意一点: Ubuntu 14.04 系统自带 Python,你只需要在你的终端输入 Python 然后按回车键即可。

当然我们可以在 Windows 操作系统上使用 Python,Numpy 和 Matplotlib,但是我更喜欢 Ubuntu。

编写代码

下式即为二维热传导问题的拉普拉斯方程

其中 T 代表了温度,x 代表 x 轴,y 代表了 y 轴。x 和 y分别是位置坐标的函数。如果你想看这个方程的积分解,可以点击这里。

此处我们仅仅求解二维的拉普拉斯方程。求解过程如下:

我们求解的问题是:在给定边界温度的情况下,求出二维平面内每点的稳定温度(即为拉普拉斯方程的解)。下面,我们将离散化整个二维平面,使用方格将其分割,然后使用有限差分法将拉普拉斯方程进行离散化。下图展示了离散化后的平面区域。

我们设置 Δx = Δy = 1 cm,得到如下的方格图。

其中,绿色的节点代表了我们想求解的节点,白色的节点是边界条件,我们已知其温度。下面给出离散化的拉普拉斯方程形式。

将上式整理后,可以得到最终的离散方程如下所示。

下面让我求解这个方程。为了求解这个方程,首先使用为所有的绿色节点假设一个猜测值,此处的猜测值是 30 摄氏度,当然你也可以设置为 35 摄氏度,因为我们并不知道其具体是多少度,这只是一个假设值。我们将迭代这个方程,直到迭代前后值的误差非常小为止,我们称之为收敛。在迭代的过程中,节点的温度值会自动的调整,所以当我们的猜测值越接近真实值,求解的速度就越快。

下面让我们正式开始写代码。为了使用 Numpy,我们需要将其载入,同样的过程适用于 Matplotlib。 我们使用 pyplot 模块来画最后的结果。所以,第一步是载入必要的模块。

然后,我们为程序设置变量初始值。

然后就是设置画图窗口,并将其分割。

np.meshgrid() 函数可以产生网格,用这个可以画出最后的结果,其中第一个参数代表 x 轴,第二个参数代表了 y 轴。我们使用 np.arange() 来产生一个一维数组,其起始于某一个值,终止于某一个值,在本例中,起始于 0 终止于 lenX,另一个起始于 0 终止于 lenY。接下来,我们生成一个二维数组,定义其形状,并使用猜测值对其进行初始化,然后我们设置边界条件,使用前面给出的边界条件进行初始化。

然后我们使用 Python 来实现方程,并在 for 循环中对其进行迭代。

注意代码的缩进格式,Python 代码使用的是空格或者缩进,而不使用大括号。截止此处,我们的主程序部分已经完成了,接下来,我们使用 Matplotlib 来画出最后的结果。

完成! 下面给出完整的程序。

程序很短,对吧。 好的,下面我们将程序复制粘贴到名为 findif.py 的文件中。然后打开终端,进入源代码所在目录,使用下面的语句运行程序。

运行后,我们会得到下面的结果图。

我们可以改变边界条件,例如将右侧边界的值设置为 30 摄氏度,即 Tright = 30,会得到下面的结果图。

兴趣点

Python 是一种简单易学的动态编程语言,在计算物理和别的学科里,它有很多有用的库。因为 Python 是一种解释型的语言,和 C 、 C++ 相比,它可能运行的比较慢,但是必须强调的是,它很好学。我们同样可以使用较少的 Python 代码来实现更多的工作。这样一来,我们不必纠结于如何编程,只需将精力放在想要解决的问题上面。

在计算物理中,使用 Numpy 和 Scipy(numeric and scientific library for Python)我们可以解决很多复杂的问题,因为这些库为我们提供了矩阵运算,线性代数操作以及信号处理,傅里叶变化,统计分析,优化等等现成的函数。

另外,不仅在计算物理领域, Python 还广泛的应用于机器学习,甚至谷歌的 tensorflow 也用的是 Python。

英文原文:https://www.codeproject.com/Articles/1087025/Using-Python-to-Solve-Computational-Physics-Proble

译者:无

计算物理作业python代码_使用 Python 解决计算物理问题相关推荐

  1. python代码_自学Python之后不想去公司上班,教你如何月入10000+,听过来人说

    小编我在it行业也待了11年了,做python也有4年,至于如何自己一个人可以通过python挣钱,我分享一下我的看法! 1.爬虫 很多人入门Python的必修课之一一定是Web开发和爬虫,但这两项要 ...

  2. 熊猫人表情包python 代码_用Python爬取斗图网表情包

    一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...

  3. 圣诞老人python代码_用Python给头像加上圣诞帽或圣诞老人小徽章

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章: https://zhuanlan.zh ...

  4. 我的世界python代码_用Python在“我的世界”里建一个既能看时间又能当地标的大钟...

    在"我的世界"的天空里创建一个大表,来显示真实世界的时间.这样不仅可以使天空更加多彩,而且还能作为一个地标.当你浪的离家太远找不到归家的路了,只要在天空中看见它,你就会知道离家不远 ...

  5. 浪漫的python代码_十行Python代码让你秒变撩妹达人,程序员浪漫起来就没有你们啥事了!...

    做微信聊天机器人,实现步骤: 1.获取微信的使用权,即python脚本能控制微信收发信息. 2.python脚本收到聊天信息后,要对该信息进行处理,返回机器人的回应信息.我这里有一套Python从入门 ...

  6. 波士顿房价预测python代码_使用Python和Numpy构建神经网络模型——波士顿房价预测案例...

    原标题:使用Python和Numpy构建神经网络模型--波士顿房价预测案例

  7. 第k大的数python代码_【Python】【输出前m大的数】

    问题: 给定一个数组包含n个元素,统计前m个大的数,并把这m大的数从大到小排列给出 输入 第一行为一个整数,表述要输出的前m个数 第二行为n个整数,给出需要排序的数组 输出 从大到小的m大的数 例子 ...

  8. 猴子摘桃python代码_阿尔法python练习(4-6答案)

    文章目录4.基本数据类型判断奇偶数公倍数判断平闰年天天向上的力量第一问天天向上的力量第二问天天向上的力量第三问天天向上的力量第四问拼接最大字符删除字符插入字符回文字符串统计词量你中无我时间格式化文本进 ...

  9. knn算法python代码_在python中使用KNN算法处理缺失的数据

    处理缺失的数据并不是一件容易的事. 方法的范围从简单的均值插补和观察值的完全删除到像MICE这样的更高级的技术. 解决问题的挑战性是选择使用哪种方法. 今天,我们将探索一种简单但高效的填补缺失数据的方 ...

最新文章

  1. 使用Python,OpenCV进行Tesseract-OCR绑定及识别
  2. bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳
  3. 1121:计算矩阵边缘元素之和
  4. 开发自定义控件的笔记 (2)
  5. Opportunity的chance of success的赋值逻辑
  6. c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例
  7. 前端学习(2017)vue之电商管理系统电商系统实现表单的预先认证
  8. 第17课 欧耶欧耶 《小学生C++趣味编程》
  9. vue中v-html指令的使用之Vue知识点归纳(三)
  10. PHP+MySql+PDO实现简单登录、注册
  11. SolarWinds 攻击者再次发动供应链攻击
  12. python二级考试程序题批改_python开发一个自动批改本地Word作业的程序
  13. box-shadow属性详解
  14. 126. Word Ladder II \ 507. Perfect Number
  15. mysql查询各专业人数_查询各专业的学生数。
  16. C++ 游戏服务器开发有什么推荐的学习资料或者书籍?
  17. Android 知识点 108 —— PowerManagerService
  18. 计算机毕业设计开题报告怎么写?【详细说明】
  19. 记录Springboot+Mybatis_Plus进行CRUD与分页的注意点
  20. Python爬虫实战——下载小说

热门文章

  1. 电脑操作最忌讳的小动作
  2. vue-lazyload 简单使用
  3. 餐饮店实现扫码点餐、语音播报、自动打印厨房单结账单
  4. DX9.0 SDK下载
  5. U盘格式化不了怎么办?
  6. java接口防止XSS攻击
  7. 公众号如何快速涨粉?教你公众号截流技术快速获取粉丝
  8. xp 本地计算机策略组,Windows XP组策略应用
  9. 广东移动爱家TV牌照UNT402H_MV310/MV300原厂分区全量备份包
  10. 网络嗅探器的设计(1)