python在物理中怎么用_使用 Python 解决计算物理问题
拉普拉斯方程是一種最簡單的二階偏微分方程,同樣也是一種最簡單的橢圓形偏微分方程。此方程在科學界,尤其是物理學上具有舉足輕重的地位,因為它能夠描述電勢能和熱傳導問題。在熱力學(熱傳導)中,我們將拉普拉斯方程稱為穩態熱方程或者熱傳導方程。
在這篇文章中,我們將用數值求解代替積分求解,來求解拉普拉斯方程。當我們一提到數值方法,就意味著離散化。離散化就是將連續形式的微分方程轉化為離散形式,同時它意味著我們將積分問題轉化為線性代數問題,以便使用程序解決。
在這篇文章中,我們使用有限差分法來求解簡單的熱傳導問題。我們的編程語言是 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 軸。我們使用
p.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。
總結
以上是生活随笔為你收集整理的python在物理中怎么用_使用 Python 解决计算物理问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces 1278 B.A
- 下一篇: nexus5 android 7.0,A