本文要實現一個簡單的功能,在直角坐標系中,求解任意一個函數與x軸之間構成的面積。
用數學表達式表示出來就是:
也就是求解任意一個函數的絕對值與x軸之間構成的面積,我們以函數sin(x)為例(因為函數sin(x)便於對計算結果進行檢驗),如圖所示:
我們用積分的定義來計算,積分就是將函數分成無數的小段,然後對每一小段進行求和處理。
如上圖所示:我們將函數的定義域分為很多小份,然後對每一小份進行求和,可以看出當橫坐標劃分的越多時,計算的精度就越高。
基於這種思想,我們來考慮如何計算[0,2*pi]之間,sin(x)與x軸之間包裹的面積。
方案一
直接上代碼:
運行的結果為:
分析代碼,首先我們需要引入python的標準庫math,因為後續的圓周率pi以及函數abs和sin等都需要該模塊的支持。
代碼中的n表示x坐標軸被分為了多少份,可以理解為計算結果的精度,當n越大時,計算結果越大。
從計算結果我們可以看到,很接近正確答案4,當我們增大n到10000時,計算結果為:
可以看出,計算結果有了顯著的提高。
方案二
編程一個很重要的特性是可移植性,而上面的代碼不具備可移植性,換句話講,當我們計算sin函數的[0,3.5*pi]區間的面積時,我們需要再一次編寫代碼。所以我們給出第二種方案:
該案例中,我們將代碼分裝為函數sumSin,其中參數end表示積分的終止值,start表示開始值,默認值為0,n表示計算精度,默認值為10000,這樣我們就完成了函數的分裝。
方案三
雖然方案二已經對函數進行了封裝,但是還不夠獨立,還有耦合,如果我們要計算任意一個函數與x軸之間的距離怎麼辦?我們給出代碼方案三:
與方案二類似,讀者只需要知道在python中,函數名也可以作為參數傳入。
方案四
前面幾個方案已經實現了計算功能的封裝,下面我們通過numpy模塊實現代碼效率的提升,直接給出代碼:
可以看出代碼中,取消了for循環,在解釋性語句中最大的忌諱就是循環,而numpy可以不用循環。直接通過矩陣運算。
可能,這時候讀者會問,numpy底層代碼是不是用的循環實現的矩陣的計算?如果這樣的話,計算效率從本質上並沒有改變啊?
不是這樣,Numpy底層是使用C語言編寫,內部解除了全局解釋器鎖,其對數組的操作不是由Python解釋器完成的,效率遠高於純Python代碼。
總結
本文利用python代碼完成任意函數與x軸之間的面積,由淺入深,先後完成函數的封裝和代碼運行效率的優化。希望對你的學習有所幫助,謝謝。