Python科學計算與數(shù)據(jù)處理—數(shù)值計算庫_第1頁
Python科學計算與數(shù)據(jù)處理—數(shù)值計算庫_第2頁
Python科學計算與數(shù)據(jù)處理—數(shù)值計算庫_第3頁
Python科學計算與數(shù)據(jù)處理—數(shù)值計算庫_第4頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Python 科學計算與數(shù)據(jù)處理數(shù)值計算庫SciPy 數(shù)值計算庫目錄常數(shù)和特殊函數(shù)優(yōu)化最小二乘擬合函數(shù)最小非線性方程求解插值樣條曲線插值外推和樣條擬合2D 插值目錄數(shù)值積分球體體積解常微分方程統(tǒng)計量連續(xù)和離散概率分布二項、泊松、伽瑪分布 SciPy 在此基礎上,增加了數(shù)學、科學和工程計算中常用的許多模塊,如線性代數(shù)、常微分方程數(shù)值解、信號處理、圖像處理、稀疏矩陣等。在本節(jié)中,將通過示例介紹SciPy 中常用的一些模塊。Matplotlib 和 Mayavi 將用于在實例程序中繪制2D 和三維圖表。這些圖形庫將在以下章節(jié)中詳細描述。常量和特殊函數(shù)SciPy 的常量模塊包含許多物理常量:在物理常量

2、字典中,對應于物理常量名稱作為關鍵字的值是一個包含三個元素的元組,常量值分別為0+單位和錯誤。例如,下面的程序可以檢查電子質量 :光速 Ch# Planck 常量 Cgram 常量電子傳遞 (E,rsquokg#,E)常量和特殊函數(shù)除物理常量外,常量模塊還包括許多單位信息,如:Cmile# miles 等于多少米 Cinch # inches等于多少米 Cgram # grams等于多少千克 Cpound#磅等于多少千克常量,特殊函數(shù)SciPy 的特殊模塊是一個非常完整的函數(shù)庫,其中包含基本數(shù)學函數(shù)、 特殊數(shù)學函數(shù)和所有出現(xiàn)的函數(shù)由于函數(shù)數(shù)量眾多,本節(jié)僅簡要介紹它們。請參考 SciPy 的幫助

3、文檔,了解具體包括的功能列表。伽瑪函數(shù)是概率統(tǒng)計中經常出現(xiàn)的一種特殊函數(shù)。它的計算公式如下 :常數(shù)和特殊函數(shù)顯然,用這個公式計算函數(shù)值是很麻煩的。特殊模塊中的 gamma()可用于 計算 :importscipyspecialassgamma()sgamma()s gamma(j)# gamma 函數(shù)支持復數(shù) (j)Sgamma()INF 常量和特殊函數(shù)函數(shù)是實數(shù)和復數(shù)范圍內階乘函數(shù)的擴展。 它的增長速度非常快,因為的階乘已經超出了雙精度浮點數(shù)的表示范圍, 所以結果是無限的。為了計算更大的范圍,可以使用sgammaln (): sgammaln (x)來計算 ln 的值(|)。它使用一種特殊的

4、算法來直接計算函數(shù)的對數(shù)值,因此它可以代表一個更大的范圍。Sgammaln()常數(shù)和特殊函數(shù)的特殊模中的一些函數(shù)在數(shù)學意義上不是特殊函數(shù),如計算log(x)值的 logp(x)。這是由于浮點數(shù)的精度有限,無法準確表示非常接近的實數(shù)。例如, e 的值不能用浮點數(shù)表示,所以 log(e)的值是,而當使用 logp()時,它可以非常精確地計算出來 :當 x 很小時, logp(x) 近似等于 x。Elog(e)Slogp(e)e 優(yōu)化最小二乘擬合假設有一組實驗數(shù)據(jù)(伊稀),它應該預先滿足一定的函數(shù)關系 yi=f(xi) 。通過這些已知信息,需要確定函數(shù) f 的一些參數(shù)。例如,如果函數(shù) f 是線性函數(shù)

5、 f(x)=kxb ,則參數(shù) k 和 b 是要確定的值。優(yōu)化如果用 P 來表示函數(shù)中要確定的參數(shù), 那么目標就是找到一組 P,從而優(yōu)化下面函數(shù)S 的值 :這個算法叫做最小二乘優(yōu)化。可在優(yōu)化模塊中使用Leastsq()對數(shù)據(jù)進行最小二乘擬合計算。leastsq()的用法很簡單,只需把計算誤差的函數(shù)和要確定的參數(shù)的初始值傳給它。以下是用最小二乘法擬合線性函數(shù)的過程()。優(yōu)化使用最小二乘法擬合直線,并顯示誤差曲面(scipylesshsquarelinpy)importnumpyasfrommschhopizeimporttastesqx =NP array(,Defresiduals):計算以 P

6、 為參數(shù)的直線與原始數(shù)據(jù)之間的誤差 K,B = PRETURNY(K * XB)# MISTANT SQ ,使參數(shù)的初始值為殘差輸出數(shù)組的最小平方和(),R =最小二乘(殘差), 函數(shù)的作用是 :傳遞一個誤差計算函數(shù)和一個初始值。 初始值作為誤差計算函數(shù)的第一參數(shù)傳入計算結果 r。第一個元素是包含兩個元素的元組。 第一個元素是表示擬合參數(shù) k 、b 的數(shù)組,如果第二個元素等于整數(shù)之一、 、,則擬合成功。否則,將返回mesg程序的輸出 :殘差的參數(shù) p()是擬合直線的參數(shù)函數(shù), 它返回原始數(shù)據(jù)和擬合直線之間的誤差。K=Sb= 優(yōu)化讓我們看另一個擬合正弦波數(shù)據(jù)的例子:使用最小二乘法擬合有噪聲的正復

7、數(shù)波數(shù)據(jù)(scipyleastsquaresinpy),使用最小二乘法擬合有噪聲的正弦波數(shù)據(jù)。盡管通過擬合獲得的參數(shù)可能與實際參數(shù)完全不同,但是由于正弦函數(shù)的周期性,擬合結果與實際函數(shù)一致。importnumpyasnpfromsicoptimizeimportlestsqdeffunc(x,p):用于數(shù)據(jù)擬合的函數(shù) :a * sin (* pi * k * xta) a,k,Theta = preturna *npsin(* nppi * k * xta) 優(yōu)化函數(shù) (p,y,x y ,x):實驗數(shù)據(jù) x,y 和擬合函數(shù)之間的差值 p 是系數(shù) returnnyfunc (x , p)x =

8、nplinspice(* nppi、)a,k, Theta =函數(shù) theta) #真實數(shù)據(jù) #實驗數(shù)據(jù) y = y *nprandomrand (len (x) p =,#函數(shù)擬合參數(shù)optimize#對于第一個猜測調用 leastsq進行數(shù)據(jù)擬合,殘差是函數(shù)#p 對于計算誤差是擬合參數(shù)的初始值。#args是實驗數(shù)據(jù) PLSQ =最小平方 (住宅, P,args = (Y,X) # 除初始值外,還調用 args 參數(shù)來指定殘差中使用的其他參數(shù)(X ,Y 的全局變量直接用于線擬合 ),元組的第一個元素也作為擬合參數(shù)數(shù)組 printu 的實參數(shù)返回。 Label = U 實數(shù) )plplplot

9、(x ,y,label=u 有噪聲的實驗數(shù)據(jù) )plplplot(x ,func(x,plsq),優(yōu)化程序中要擬合的 func()是一個正弦函數(shù),其參數(shù) p 是一個包含三個決定正弦波的參數(shù)的數(shù)組:A 、k 、,分別對應于正弦函數(shù)的振幅、頻率和相角。一組包含噪聲的數(shù)據(jù) :(x ,y),其中數(shù)組 y 將隨機噪聲加到標準正弦波數(shù)據(jù) y 上。通過用最小二乘法擬合有噪聲的實驗數(shù)據(jù) (x,y),它可以找到陣列 x 和真實數(shù)據(jù) y 之間的正弦關系,即確定參數(shù),例如 A 、k 、。這里, (y,x)被傳遞給 args參數(shù)。Leastsq()將這兩個附加參數(shù)傳遞給殘差()。因此,殘差 ()有三個參數(shù) p 作為正

10、弦函數(shù)參數(shù)y,x 作為表示實驗數(shù)據(jù)的數(shù)組。程序輸出如下 :雖然擬合參數(shù)與實際參數(shù)完全不同,但由于正弦函數(shù)的周期性, 擬合參數(shù)得到的函數(shù)與實際參數(shù)對應的函數(shù)是一致的。實參數(shù) :,擬合參數(shù)優(yōu)化優(yōu)化函數(shù)最小優(yōu)化模塊還提供了許多算法來尋找函數(shù)最小值:fmin 、fmin powerwell 、fmin CG 、fminBG 等。以下是觀察這些fmin *(1) 如何找到函數(shù)最小值的一個例子。在這個例子中,函數(shù) f(x ,y)計算的最小值是 :f(x ,y)=(x)(yx) 。為了提高運算速度和精度, 一些 fmin() 有一個 fprime 參數(shù),它是一個計算目標函數(shù) f 對每個自變量的偏導數(shù)的函數(shù)。

11、優(yōu)化函數(shù)對變量 x 和 y 的偏導數(shù)是 :這個函數(shù)叫做羅森布魯克(Rosenbrock)函數(shù),它通常用來測試最小化算法的收斂速度。它有一個非常平坦的山谷地區(qū)。 收斂到這個山谷區(qū)域相對容易,但是在山谷區(qū)域中尋找最小的點相對困難。根據(jù)函數(shù)的計算公式,不難看出函數(shù)的最小值在(,)。以下程序計算 f(x ,y)的最小值,并在搜索最小值時繪制由f表示的曲面和搜索路徑。當 fmin* 函數(shù)計算最小值 (scipyfmindemopy)時,優(yōu)化觀察路徑。使用 fmin() 計算函數(shù)的最小值,并繪制路徑以使用 matplotlib 搜索最小值。importscipyoptizeasoptimportnumpy

12、anmportsyspoints =deff(p):x ,Y = pz =(x)* * *(yx * *)* * pointappend(x,Y,z)returnzoptizedfprime(p):x,Y = pdx = * x * x *(yx * *)dy = * Y * x * * returnnparay(dx,dy) initpoint =( ,)try:method = sysargvexcept:method = fminfgs optimizafminfunc = opdictFMIN POWELL: RESULT = FMIN FUNC (F, initpoint) # 參數(shù)

13、是目標函數(shù)和初始值 Elifmethiodinfmincg ,F(xiàn)MINLBFGSB ,F(xiàn)MINTNC: RESULT = FMIN FUNC (F ,initpoint ,The FP prime)# 參 數(shù) 是 目 標 函 數(shù) 、 初 始 值 和 導 數(shù) 函 數(shù) Elifmethodincobyla:RESULT = fminfunc(F , initpoint) , 否則:printfimplicationnotfoundsys exit()optimize ef F() 計算 f(x,y)的函數(shù)值。為了記錄最小化過程中的計算軌跡,每個計算點都被添加到f()中的全局列表點中。Fprime(

14、)計算兩個獨立變量的f(x ,y)在 p 處的偏導數(shù)函數(shù)值。最小初始值設置為 (,),該程序從優(yōu)化模塊的字典中獲取命令行參數(shù)指定的最小值函數(shù)。不同的fmin *(1) 參數(shù)是不同的,例如,有些算法不需要fprime()。通過求解卷積的逆運算,優(yōu)化下面的程序來演示fmin 的功能,并比較 FMIN 、FMINPowell 、FMINCG 、FMINBFGS 。對于離散線性時不變系統(tǒng)h,如果它的輸入是x,它的輸出y 可以用 x 和 h 的卷積表示 :y=x(*)h 已知系統(tǒng)的輸入 x 和輸出 y 計算已知系統(tǒng)的傳遞函數(shù) h 或傳遞函數(shù) h,輸出 y 計算系統(tǒng)的輸入 x。這個操作叫做反卷積。Fmin

15、 計算反卷積方法只能用于極少數(shù)的序列,但評價fmin函數(shù)的性能仍然是好的。(scipytestfminpy)OptimizeimiportscipyOptimizeasoptimportnumpYasnpDedminconvolve(fmin func ,X, h,y,yn,x): # x (*) h = y ,(*) 表示卷積, yn 是在 y 的基礎上添加一些干擾噪聲的結果, X 是求解 X 的初始值 defconvolfunc(h):#計算 ynx(*)h 的冪,fmin 將使該冪最小化返回 npsum(ynn 卷積 (X ,h) * *) # 調用 fmin 函數(shù) x)print fm

16、infuncname print optimize # the # output x(*)h 和 y printerrorfy 之間的相對誤差 :, Np sum(Np 卷積 (x,h)y)* *)Np sum(y * *)# h 和 h printerrorofh 之間的相對誤差 :,Np sum(hh)* *)Np sum(h * *)print defest n(m ,n,nscale):隨機生成 x,h,y,yn,x 系列,并調用各種 fmin 函數(shù)來求解 x 長度的 bm 和 h 長度的 n。 Nscale 是干擾的強度 x = nprandomrand(m)H =nprandomr

17、and(n)y =npconvolve(x , H)yn=ynprandland(len(y)*NScalex = nprandomrand(n)優(yōu)化以下是程序的輸出:testminconvolve(optfmin ,x,H,y,yn,x) testminconvolve (optfminpower,x,H,y,yn,x)testfminconvolve(optfmincg ,x,H,y,yn, yn)它的參數(shù)x 是一個數(shù)組,它的值是方程的一組可能的解。Func 返回一組初始值,其中通過將x 代入方程得到的每個方程的誤差 x 是一個未知數(shù)。假設要求解以下方程 :f(u ,U,u)=,f(u ,

18、U,u)=, f(u,U,u)= 優(yōu)化,那么函數(shù)可以定義如下: 使用下列函數(shù)求解非線性方程:(scipyfsolvepy) deffunc (x): u, U,u = xruenf (u,U,U),f (u,U,U),f(u,U,U),U,U)optizefromschoptimizeimportfsolvefromthimportindeff(x) 這 是 未 知結果的初始值 =fsolve(f,printtresultprintf(result) 優(yōu)化的輸出是 : 由于調用函數(shù) f 時 fsolve 函數(shù)傳遞的參數(shù)是數(shù)組,如果數(shù)組中的元素直接用于計算,計算速度將會降低。 因此,在 Pyth

19、on 中,float 函數(shù)用于將數(shù)組中的元素轉換為標準浮點數(shù),然后調用標準數(shù)學庫中的函數(shù)進行計算。當求解方程時, fsolve 將自動計算方程的雅可比矩陣。如果方程中有許多未知量, 但與每個方程相關的未知量很少, 即雅可比矩陣是稀疏的,則傳遞函數(shù)來計算雅可比矩陣將大大提高運算速度。在仿真程序中,需要求解大量的近似未知的非線性方程。每個方程平均與一個未知數(shù)相關, 通過傳遞雅可比矩陣的計算函數(shù),計算速度成倍提高。優(yōu)化雅可比矩陣的雅可比矩陣是一階偏導數(shù)以某種方式排列的矩陣。它給出了微分方程和給定點之間的最佳線性近似, 因此它類似于多元函數(shù)的導數(shù)。例如,前面的函數(shù)F,F(xiàn),F(xiàn) 和未知數(shù) u,u,u 的雅

20、可比矩陣 如 下 : 優(yōu)化optizefromsochoptimizeimportfsolvrommathimportin ,cosdefj (x): x,X,x = xtolist () return ,X,* x * cos (x * x) ,* x * cos(x * x) , (scipyfsolvejacobianpy)優(yōu)化雅可比矩陣的函數(shù)J(),它與 F()一樣,是一組其X 參數(shù)未知的值。它計算非線性方程的雅可比矩陣通過 fprime 參數(shù)將 j() 傳遞給 fsolve()。由于本例中的未知數(shù)很少, 雅可比矩陣的計算不能顯著提高計算速度。插值是一種通過已知的離散數(shù)據(jù)發(fā)現(xiàn)未知數(shù)據(jù)的

21、方法。與擬合不同,它要求曲線通過所有已知數(shù)據(jù)。SciPy 的插值模塊提供了許多插值數(shù)據(jù)的功能。用B 樣條曲線對一維數(shù)據(jù)進行插值可以用interpd()來完成。調用形式如下 :實際上它不是一個函數(shù)而是一個類:參數(shù)類型是一個插值類型。給出插值的b 樣條曲線的階數(shù)可以具有以下候選值:interpd(x,y,kind=#linear#) 插值插值 elsquozerorsque 、rsquonear:步長插值等效于b 樣條曲線的階數(shù)。線性插值使用一條直線來連接所有采樣點,這相當于使用擴展庫中的相關函數(shù)來計算二次B樣條曲線RSQUOSILINEARSQUAO ,而 LSQUOLINEARSQUAO直接使

22、用用Python 編寫的函數(shù)來計算它們,結果是相同的。# quadratic squo 、# cubic: 可以使用整數(shù)值直接指定高階曲線和 B 樣條曲線。Interpd 對象可以計算 x 值范圍內任意點的函數(shù)值。它可以像函數(shù)一樣直接調用像NumPy 一樣的 ufunc 函數(shù),并且可以計算數(shù)組中的每個元素并返回一個新的數(shù)組。插值插值使用插值以不同的順序插值數(shù)據(jù)。(scipyinterpdpy)importnumpyasnpfromscipyimportinterpolateimportpylabasplx=nplinspispace(,)y=npsin(x)xnew=nplinspispace

23、(,)plplplplplplplplplot(x ,y,ro #)for kindin # near # # # zero# # # linear # # # quandradic #:f = interpolateinpinterped(x ,y,kind =kind)ynew = f(xnew)plplot(xnew ,ynew,label = str (kind) 插值插值插值插值程序使用循環(huán)來首先,使用數(shù)據(jù)點創(chuàng)建一個interpd 對象 f,并通過 kind 參數(shù)指定其順序。調用 f() 計算一系列插值結果。Pllegend (loc = #右下角 #) plshow()插值插值樣條

24、插值 :使用兩個基本步驟: () 首先使用splrep()計算要插值的曲線的樣條系數(shù)(splprep 用于 n 維空間 ) ()使用 splev()計算給定點的樣條插值結果。tck = scipyinterpolsplip(x ,y,w = none,XB = none,xe = none,k = ,task =,s = none,t = none,fulloutput = ,per =,quiet =)參數(shù) s用于確定平滑點數(shù),通常為mSQRT(m),m 是曲線點數(shù)。如果插值不需要平滑,則s = 1。插值插值 esplrep()輸出一個單元數(shù)組 (t,c,k)的一個元素,其中 t 是曲線點

25、c,計算系數(shù) k 是樣條順序,這通常是順序,但可以改變 k。其中 der 用于樣條計算或實際計算順序必須滿足條件DER =K插值插值下面是一個用直線和基線在正弦波上插值點的例子。(ScipyBSpline)importnumpyanpimportpylabasplfromcipyimportinterpolatex = nplinspace(,*nppinppi) ,y=npsin(x)xnew=nplinspace(,*nppinppi ,(x,y)tck = interplantsprep(x,y)ybsplit = interplantsprep(x,y)ybsplit =interpl

26、antsprev(x, y, o, label = u raw 數(shù)據(jù) )plplplplplplot(xnew ,flinter(xnew) ,Label=u linear interpolation)插值插值插值插值plplplot(xnew,ybSpline ,label=UBSplineinterpolation)pllegend()plshow()interpolation interplate extrapolation 和spline fitting 前面描述的 interpd 類要求其參數(shù) x 是增量序列,并且只能在 x 的值范圍內進行插值, 它不能用于外推, 即不能計算 x 的

27、值范圍之外的數(shù)據(jù)點。單葉線類插值比插值更先進。 它支持外推。其調用形式如下 : 單變量樣條 (X ,Y,W =無, BBOXS = 無,無, K =,S =無)插值 ex、 y 是保存數(shù)據(jù)點的 XY 坐標的數(shù)組,其中 X 必須是遞增序列。w 是分配給每個數(shù)據(jù)點的權重值。由 bboxs 序列指定的近似區(qū)間的邊界K 是樣條曲線的階。S 是一個平滑參數(shù),它使最終生成的樣條曲線滿足條件SUM(W (YSP 線(X) LES ,也就是說,當 S 時,樣條曲線不一定通過每個數(shù)據(jù)點。為了使曲線通過所有數(shù)據(jù)點, 必須將 S 參數(shù)設置為單變量樣條(X,Y ,W = NONE,BBOXS = NONE ,NONE

28、,K =,S = NONE)插值插值使用單變量插值線 :(Scipypuslinepy)ImpNumPYanportPylaBasPlFromScipImport 插 值EX = NP )sy = interplantanivaritestpline(x , y , s =)(sx)interplant plfigure(figure size =( , )plplplplplplot(x , y , label = u 數(shù) 據(jù)點)plplplplplot(sx ,sy,label = u 無噪聲曲線 )pllegend()plplplplplplot(x ,y,label=u 數(shù)據(jù)點 )pl

29、plplplot(sx , sy, linewidth=, Label = u 數(shù)據(jù)點)plplplplot(x ,npsin(x),Label = u 無噪聲曲線 )pllegend()plshow()插值為有噪聲的輸入數(shù)據(jù)選擇合適的 S 參數(shù)可以使樣條曲線在沒有噪聲時接近波形??梢哉J為是用樣條曲線擬合數(shù)據(jù)。插值插值二維插值使用插值 ()執(zhí)行二維插值。它的調用形式如下 :x、y、z 都是一維數(shù)組。如果多維數(shù)組被傳入,它首先被轉換成一維數(shù)組類型參數(shù)。將插值操作的順序指定為 RSQUOLINE ARROW 、RSQUOCUCBICLSQO 或 rsquoquinticrsquo。二維插值 (sc

30、ipyinterpdpy)使用 interpd 函數(shù) interpd (x,y,z,kind = # linearsquo),插值插值演示二維插值。importnumpyasnpfromschyimportimportimportimportyplabaspldeffunc(X,y): return (xy) * npexp (* (x * * y * *) # 將 xy 軸分成 * 的網格 Y,X = NPM grid:j:JF vals = func(X ,Y)#計算每個網格點的函數(shù)值 #二維插值 NEWFNC = 插值 # (X ,Y,fvals,KIND = LSQUOCCUBICLS

31、QO)插值 XNEW = NP LINSPACE( ,YNEW = NP LINSPACEpl subspot()plimshow(f val , extent=, cmap=plcmjet ,interpolation=#nearest#,origin = lower)pl subspot()plimshow(fnew,extent=,cmap=plcmjet,Interpolation = # nearest #,origin = lower)plshow()interpolate func 是一個計算曲面上每個點的高度的函數(shù)。獲得的二維陣列的第一軸對應于Y 軸,第一軸對應于X 軸。int

32、erpd 對象可以像函數(shù)一樣調用, 以計算密集網格中插值曲面的高度值。這里的參數(shù)是兩個一維數(shù)組分別指定網格的XY 軸坐標,而不通過網格創(chuàng)建網格坐標數(shù)組。Interpd 只能插值網格形狀的采樣值。 如果隨機散列采樣點需要插值,則需要徑向基函數(shù)插值算法。徑向基函數(shù)支持多維散列點的插值。插值插值使用徑向基函數(shù)插值二維隨機采樣點。(scipyrbfpy)importnumpyasnpfromscompumportimportimportimportpillaspldeffunc(x,y): return (xy) * npexp (* (x * * y * *) #計算最后一個隨機分布點 x=npra

33、ndomuniform(,Size =) y = nprandomuniform(,size =)fvals = func (x ,y)插值插值使用Rbf new func = InterPlantRbf(x ,y,fvals,function = # multi quadrac #)ynew,xnew = npmgrid extend=,cmap = plcmjet,Origin = lower)pl subset()pl spread(x,y,fvals,cmap = plcmjet) plmshow (fnew,extend =,cmap = plcmjet,origin= lower)

34、 plshow()插值使用隨機點創(chuàng)建一個徑向基函數(shù),并通過函數(shù)參數(shù)指定使用的徑向基函數(shù)。徑向基函數(shù)對象也可以像函數(shù)一樣調用, 用于計算密集網格上的點的值。它的兩個參數(shù)是指定XY 軸坐標的兩個數(shù)組。與 interpd 對象不同,它不會在網格上自動生成點,因此這兩個數(shù)組是使用 Megrid 對象創(chuàng)建的,以便使用等距正交網格。數(shù)值積分集成模塊提供了幾種數(shù)值積分算法, 包括常微分方程數(shù)值積分。本節(jié)以球體體積和洛倫茲吸引子軌跡的計算為例, 介紹積分模塊的使用。球的體積數(shù)值積分是定積分的數(shù)值解。 例如,某一形狀的面積可以通過數(shù)值積分來計算。首先考慮如何計算半徑為半圓的面積。根據(jù)圓的面積公式,它的面積應該等

35、于 。單位半圓的曲線方程是下面的半圓 ()可以通過數(shù)值積分來計算圓的面積和球的體積。 最簡單的數(shù)值積分算法是將待積分區(qū)域分成許多小矩形,然后計算這些矩形的和。以下方法用于將 x 軸上的積分分成相等的部分, 然后計算面積和 :def half circle(x):return(x * *)* * n = x = NPL spice( ,n)dx = xxy =half circle(x)* dx * npsum(y)#由半圓上的每個點形成的多邊形面積也可以通過數(shù)值trapz()來計算 :trapz()計算以 (x,y)為頂點坐標的折線與x 軸之間的面積。如果您在 SciPy 的積分模塊中使用數(shù)值

36、積分函數(shù)quad(),您將得到非常精確的 結果:nptrapz(y , x)*#兩倍于fromstipyimportintegratepihalf 的面積, err =積分 quad(半圓,)pihalf*數(shù)值積分 defhalfsphere (x,y): return (x * * y * *) * * 多重定積分的計算可以通過多次調用 quad()來實現(xiàn)。為了便于調用,集成模塊為二重定積分提供 dblquad (),為三重定積分提供 tplquad()。下面以 dblquad() 計算單位半球體積為例來說明 dblquad()的用法。單位半球上的點 (x,y,z)滿足以下等式 :XYz=

37、因此,下面的半球體 ()可以通過 xy 軸坐標計算球體上的點的 z 軸坐標值 :數(shù)值積分的交點 Y 軸平面和球體是一個單位圓,所以二重積分的計算間隔是單位圓。也就是說,對于 x 軸,從到執(zhí)行積分, 對于 y 軸,從半圓 (x) 到半圓 (x)執(zhí)行積分。因此,半球體積的二重積分公式如下 : 下面的程序使用dblquad()計算半球體積 :integratedblquad(半球、x:半圓 (x),x:半圓 (x)( ,e) nppi * #計算半球體積數(shù)值積分 integratedblquad()通過球體體積公式。調用參數(shù)是 :funcd 是一個需要二重積分的函數(shù),它有兩個參數(shù)假設 :x 和 y。

38、A 和 B 參數(shù)指定積分函數(shù)的第一個變量 (即 X) 的積分間隔,而 gfun 和 hfun 參數(shù)指定第二個變量 (即 Y)的積分間隔。Gfun 和 hfun 是函數(shù)。他們通過變量X 計算變量 Y 的積分區(qū)間,這樣函數(shù)就可以在XY 平面上的任何區(qū)間內積分。Dblquad(funcd,a,b,gfun,hfun)數(shù)值積分積分解常微分方程組積分模塊還提供函數(shù)odeint()來積分常微分方程組。讓我們看看如何用它來計算洛倫茲吸引子的軌跡。洛倫茲吸引子由以下三個微分方程定義 :這三個方程定義了三維空間中每個坐標點的速度矢量。從某個坐標出發(fā), 沿速度矢量積分, 可以計算出該空間中無質量點的運動軌跡。當

39、、是具有不同常數(shù)的三個參數(shù)時, 可以計算不同的軌跡 :x(t) 、y(t)、z(t)。當參數(shù)為某一值時,軌跡出現(xiàn)混沌現(xiàn)象。即使初始值稍有不同,也會顯著影響軌跡。以 下 是Lorenz吸 引 子 的 軌 跡 計 算 和 繪 圖 程序 :(Scipoudeindlorenz)fromtipyintegradeportodeinimportantumpuyasnpd orenz(W,T,P,R,b): #給定位置矢量 W 和三個參數(shù) P,R,B,計算值 x, y # dxdt,dydt,dzdt。Z=wtolist()# 直接對應于 lorenz 的計算公式returnp*(yx) , x*(rz)

40、y , x*yb*z數(shù)值積分INTEGRATET =NPARGE(,#創(chuàng)建時間點 #調用 ode 來求解 lorenz,使用兩個不同的初始值 TRACK = ODINT(Lorenz ,(,),T,ARGS =(,)TRACK = ODINT(Lorenz , ( , , ) , T , args =( , )# 從 mpltoolkitsmportdimportasidimportatmatchplotlibplotaspltfigure 繪圖它的任務是計算一個坐標點在所有方向上的微分值,這可以根據(jù)洛侖茲吸引子公式直接得到。用不同的初始位移值調用Odeint()兩次來求解微分方程。Odein

41、t()有許多參數(shù) :lorenz:它是一個計算某個位置所有方向速度的函數(shù)。(,):位置初始值它是計算常微分方程所需的每個變量的初始值。t:表示時間的數(shù)組odeint()求解該數(shù)組中的每個時間點, 以獲得所有時間點的位置。參數(shù) :這些參數(shù)直接傳遞給 lorenz(),因此它們在整個集成過程中是恒定的。數(shù)值積分最終通過 matplotlib 的三維繪制模塊繪制出 odeint() 后得到的軌跡。即使初始值只相差兩條軌跡,它們也是完全不同的。統(tǒng)計科學的統(tǒng)計模塊包含各種概率分布的隨機變量。 隨機變量分為連續(xù)變量和離散變量。所有連續(xù)隨機變量都是 rvcontinuous 派生類的對象,所有離散隨機變量都是 rvdiscrete 派生類的對象。連續(xù)和離散概率分布可以通過使用以下語句獲得 stats 模塊中 的 所 有 連 續(xù) 隨 機 變 量 :fromstipyimportstatskfork 、 vinstatsdictiontems()ifisinstance(v , stats RV continuous)lsquogenhalflowitstquota 、 RSQUOTIANGRSQUO 、 RSQUOL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論