python做微積分

我們最開始使用python基本都是做數值計算的,而在處理數學問題時常常也需要進行一些符號運算,python能否勝任這種需求呢?當然是可以的,我們就以微積分為例,來見識一下python處理符號運算和數值運算的雙重能力。需要安裝一款python的第三方庫sympy,可以直接使用pip3 install sympy來進行安裝,也可以通過其他方式安裝。本文無意於讓大學生完成高等數學作業時投機取巧,不過作為驗證自己計算是否正確的工具倒是不錯。sympy更有意義的用途是用於科學計算模擬系統運行狀況。

1. 變量定義

數學問題中,我們常常需要定義一些自變量,然後使用一組映射作用在這些自變量上構成數學方程。sympy提供了數學符號相關的數據結構Symbol,在進行符號運算之前需要先定義一些自變量符號。單個符號直接使用sympy.Symbol(),多個符號就可以使用sympy.symbols()來進行定義。

python做微積分

符號變量的定義

從以上演示可以看出,sympy中定義了一個sympy.core.symbol.Symbol類,這個類就是sympy進行符號運算最基礎的數據結構。

2. 微積分基礎

事實上,sympy可以完成高等數學中幾乎所有的操作,當然也包括一些基礎的運算。而計算微積分的時候我們常常需要具備一些數學運算的基礎,比如極限、表達式展開和合並等等,這裡順便演示使用sympy一下。

python做微積分

微積分基礎

從以上演示看出,sympy在處理極限、表達式展開和化簡等數學基礎運算時非常直觀,基本與人工手動計算的形式一致。如果你有一個很複雜的帶有同類項的表達式,可以使用sympy.simplify函數試試。

3. 一元微積分

我們先來看看一元微積分,即只有一個自變量的微積分。由於普通的python庫基本都是進行數值計算的,因此在構建符號函數時不能直接使用,比如numpy;而應該使用sympy中提供的基礎符號函數來構建複雜的符號函數,比如sympy.sin(), sympy.exp()等等。計算符號函數導數的方法也很簡單,直接使用sympy.diff(),而計算積分可以直接調用sympy.integrate()函數。

python做微積分

一元微積分

一元微積分的符號運算以及對應的數值運算如上圖演示。大家可以發現,在計算不定積分時,省略了一個常數項。通常在未給定初值的情況下,我沒也不關心這個常數項,與日常計算微積分的情形基本一致。

4. 多元微積分

瞭解了一元微積分的計算,自然就更想見識一下多元微積分的計算,sympy在這方面也是非常地強大。所使用的接口仍然是diff和integrate這兩個函數。通過變量與基礎函數的拼接所形成的複雜函數在sumpy中是一個sympy.core.add.Add對象,使用這個對象直接調用diff函數並指定自變量就可以求解對應的偏導數。多重積分的計算與一元積分是相似的,只是需要傳入想要進行積分運算的符號自變量。

python做微積分

多元微積分

5. 微分方程

基本的微積分運算都瞭解了,但是微積分中一類非常常見的問題還是有必要演示一下,即微分方程的求解。sympy可以求解普通的方程或者方程組是理所當然的,那麼對於微分方程的求解是否也那麼順利呢?sympy對方程組的求解函數與matlab是一致的,這對於從matlab遷移到python的朋友來說是個很不錯的消息。手動解算過微分方程的朋友都應該知道,微分方程的基礎是建立在一個未知函數的導數之上的,那麼這個未知的函數該如何表示這是個問題。在sympy中,使用sympy.Function()接口創建這個未知的函數,然後利用這個函數構建微分方程,使用dsolve求解。

python做微積分

微分方程

到此,使用sympy模塊進行微積分符號和數值計算的演示完畢。最開始我們處理這類問題的首選是matplab,等到掌握sympy之後,就沒有再使用matlab的動力了。sympy不僅是免費的,而且輕量級,使用過程與matlab一樣方便。本文的notebook版文件在github上的cnbluegeek/notebook倉庫中共享,歡迎感興趣的朋友下載。


分享到:


相關文章: