高中考物理!我用Python计算出的答案是同样的!为啥算我错了?
我表弟是一名理科生,今天他来到我家叫我叫他做题。高三的题!可我都过了好几年了,我哪会啊!然后没办法,只能通过Python来想办法了!然后就有了标题所说的事情,题目明明算对了,但是他的老师给他是错的!
现如今,有很多编程语言可以进行数值计算,例如 MATLAB。但是此处我们使用 Python,因为它简单易学而且还免费。它有很多非常好用的数值计算和数据可视化库,例如 Numpy,Scipy 和 Matplotlib。Python 也提供可以实现并行计算,我们可以在计算机集群上运行 Python 程序。
用下面的语句安装 Matplotlib
注意一点: Ubuntu 14.04 系统自带 Python,你只需要在你的终端输入 Python 然后按回车键即可。
其中 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 循环中对其进行迭代。
完成! 下面给出完整的程序。
程序很短,对吧。 好的,下面我们将程序复制粘贴到名为 findif.py 的文件中。然后打开终端,进入源代码所在目录,使用下面的语句运行程序。
运行后,我们会得到下面的结果图。
我们可以改变边界条件,例如将右侧边界的值设置为 30 摄氏度,即 Tright = 30,会得到下面的结果图。
领取专属 10元无门槛券
私享最新 技术干货