本文簡要介紹 python 語言中 scipy.integrate.quad
的用法。
用法:
scipy.integrate.quad(func, a, b, args=(), full_output=0, epsabs=1.49e-08, epsrel=1.49e-08, limit=50, points=None, weight=None, wvar=None, wopts=None, maxp1=50, limlst=50, complex_func=False)#
計算一個定積分。
使用 Fortran 庫 QUADPACK 中的技術將 func 從 a 集成到 b(可能是無限區間)。
- func: {函數,scipy.LowLevelCallable}
要集成的 Python 函數或方法。如果 func 接受許多參數,它會沿對應於第一個參數的軸進行積分。
如果用戶希望提高集成性能,那麽f可能是一個scipy.LowLevelCallable帶有其中一個簽名:
double func(double x) double func(double x, void *user_data) double func(int n, double *xx) double func(int n, double *xx, void *user_data)
user_data
是包含在scipy.LowLevelCallable
中的數據。在帶有xx
的調用表單中,n
是包含xx[0] == x
的xx
數組的長度,其餘項是包含在 quad 的args
參數中的數字。此外,為了向後兼容,支持某些 ctypes 調用簽名,但不應在新代碼中使用這些調用簽名。
- a: 浮點數
積分的下限(使用 -numpy.inf 表示 -infinity)。
- b: 浮點數
積分上限(使用 numpy.inf 表示 +infinity)。
- args: 元組,可選
傳遞給 func 的額外參數。
- full_output: 整數,可選
非零返回集成信息字典。如果非零,則警告消息也會被抑製,並且消息會附加到輸出元組。
- complex_func: 布爾型,可選
指示函數的 (函數) 返回類型為實數 (
complex_func=False
:默認)或複雜(complex_func=True
)。在這兩種情況下,函數的參數都是實數。如果 full_output 也不為零,則信息詞典,信息, 和解釋實數和複數分量在帶有鍵 “real output” 和 “imag output” 的字典中返回。
- y: 浮點數
func 從 a 到 b 的積分。
- abserr: 浮點數
結果中絕對誤差的估計。
- infodict: dict
包含附加信息的字典。
- 信息
收斂消息。
- 解釋
僅附加 ‘cos’ 或 ‘sin’ 權重和無限積分限製,它包含 infodict[‘ierlst’] 中代碼的解釋
- epsabs: float 或 int,可選
絕對容錯。默認值為 1.49e-8。
quad
試圖獲得準確度abs(i-result) <= max(epsabs, epsrel*abs(i))
其中i
= 積分函數從a到b, 和result
是數值近似。看埃普雷爾以下。- epsrel: float 或 int,可選
相對誤差容限。默認值為 1.49e-8。如果
epsabs <= 0
,埃普雷爾必須大於 5e-29 和50 * (machine epsilon)
.看易勝寶更多。- limit: float 或 int,可選
自適應算法中使用的子區間數的上限。
- points: (浮點數,整數序列),可選
有界積分區間中的一係列斷點,其中可能出現被積函數的局部困難(例如,奇異點、不連續點)。序列不必排序。請注意,此選項不能與
weight
一起使用。- weight: float 或 int,可選
表示權重函數的字符串。對此和其餘論點的完整解釋可以在下麵找到。
- wvar: 可選的
與加權函數一起使用的變量。
- wopts: 可選的
用於重用切比雪夫矩的可選輸入。
- maxp1: float 或 int,可選
切比雪夫矩數的上限。
- limlst: 整數,可選
用於正弦加權和無限 end-point 的周期數上限 (>=3)。
參數 ::
返回 ::
其他參數 ::
注意:
為了獲得有效的結果,積分必須收斂;不保證發散積分的行為。
quad() 輸入和輸出的額外信息
如果 full_output 不為零,則第三個輸出參數 (infodict) 是一個字典,其條目如下表所示。對於無限限製,範圍轉換為 (0,1),並針對此轉換範圍給出可選輸出。令 M 為輸入參數限製,令 K 為 infodict[‘last’]。條目是:
函數評估的數量。
細分過程中產生的子區間數 K。
一個長度為 M 的 rank-1 數組,其前 K 個元素是積分範圍分區中子區間的左端點。
一個長度為 M 的 rank-1 數組,其中的前 K 個元素是子區間的右端點。
長度為 M 的 rank-1 數組,其中的前 K 個元素是子區間上的積分近似值。
長度為 M 的 rank-1 數組,其中的前 K 個元素是子區間上的絕對誤差估計的模。
一個長度為 M 的 rank-1 整數數組,如果為
K<=M/2+2
或L=M+1-K
,則其中的前 L 個元素是指向帶有L=K
的子間隔上的錯誤估計的指針。讓 I 為序列infodict['iord']
,讓 E 為序列infodict['elist']
。然後E[I[1]], ..., E[I[L]]
形成一個遞減序列。
‘neval’:
‘last’:
‘alist’:
‘blist’:
‘rlist’:
‘elist’:
‘iord’:
如果提供了輸入參數點(即,它不是無),則以下附加輸出將放置在輸出字典中。假設點序列的長度為 P。
長度為 P+2 的 rank-1 數組,包含積分限製和按升序排列的區間斷點。這是一個數組,給出了積分將發生的子區間。
長度為 M (=limit) 的 rank-1 整數數組,包含子區間的細分級別,即如果 (aa,bb) 是
(pts[1], pts[2])
的子區間,其中pts[0], pts[2]
是infodict['pts']
的相鄰元素,則(aa,bb) 如果|bb-aa| = |pts[2]-pts[1]| * 2**(-l)
具有級別 l。長度為 P+2 的 rank-1 整數數組。在對區間 (pts[1], pts[2]) 進行第一次積分後,一些區間的誤差估計可能已經人為地增加了,以推進它們的細分。該數組在與發生這種情況的子間隔相對應的插槽中包含一個。
‘pts’:
‘level’:
‘ndin’:
加權被積函數
輸入變量 weight 和 wvar 用於通過選擇的函數列表對被積函數進行加權。不同的積分方法用於計算這些加權函數的積分,這些方法不支持指定斷點。權重的可能值和相應的權重函數是。
weight
使用的權重函數
wvar
‘cos’
cos(w*x)
wvar = w
‘sin’
罪(w*x)
wvar = w
‘alg’
g(x) = ((x-a)**alpha)*((b-x)**beta)
wvar =(阿爾法,貝塔)
‘alg-loga’
g(x)*log(x-a)
wvar =(阿爾法,貝塔)
‘alg-logb’
g(x)*log(b-x)
wvar =(阿爾法,貝塔)
‘alg-log’
g(x)*log(x-a)*log(b-x)
wvar =(阿爾法,貝塔)
‘cauchy’
1/(x-c)
wvar = c
wvar 保存參數 w、(alpha, beta) 或 c,具體取決於所選的權重。在這些表達式中,a 和 b 是積分極限。
對於‘cos’ 和‘sin’ 加權,可以使用額外的輸入和輸出。
對於有限積分限製,積分使用Clenshaw-Curtis 方法執行,該方法使用切比雪夫矩。對於重複計算,這些時刻保存在輸出字典中:
已計算的最大切比雪夫矩水平,即,如果
M_c
為infodict['momcom']
,則已計算長度為|b-a| * 2**(-l)
、l=0,1,...,M_c
的區間的矩。長度為 M(=limit) 的 rank-1 整數數組,包含子區間的細分級別,即,如果相應的子區間為
|b-a|* 2**(-l)
,則此數組的元素等於 l。包含計算出的 Chebyshev 矩的 rank-2 形狀數組 (25, maxp1)。通過將此數組作為序列 wopts 的第二個元素傳遞並將 infodict[‘momcom’] 作為第一個元素傳遞,這些可以在相同的時間間隔內傳遞給積分。
‘momcom’:
‘nnlog’:
‘chebmo’:
如果積分極限之一是無窮大,則計算傅裏葉積分(假設 w neq 0)。如果 full_output 為 1 並且遇到數字錯誤,除了附加到輸出元組的錯誤消息之外,還會將一個字典附加到輸出元組,該字典將數組
info['ierlst']
中的錯誤代碼轉換為英語消息。輸出信息字典包含以下條目,而不是‘last’, ‘alist’, ‘blist’, ‘rlist’和‘elist’:集成所需的子區間數(稱為
K_f
)。長度為 M_f=limlst 的 rank-1 數組,其第一個
K_f
元素包含區間(a+(k-1)c, a+kc)
的積分貢獻,其中c = (2*floor(|w|) + 1) * pi / |w|
和k=1,2,...,K_f
。長度為
M_f
的 rank-1 數組,包含與infodict['rslist']
中相同位置的間隔對應的誤差估計。長度為
M_f
的 rank-1 整數數組,包含與infodict['rslist']
中相同位置的間隔相對應的錯誤標誌。有關代碼的含義,請參閱解釋字典(輸出元組中的最後一個條目)。
‘lst’:
‘rslst’:
‘erlst’:
‘ierlst’:
QUADPACK關卡例程的詳細信息
quad
調用 FORTRAN 庫 QUADPACK 中的例程。本節提供有關調用每個例程的條件的詳細信息以及每個例程的簡短說明。調用的例程取決於重量,積分和積分限製a和b.四包例程
重量
積分
無限界限
qagse
None
No
No
qagie
None
No
Yes
qagpe
None
Yes
No
qawoe
‘sin’, ‘cos’
No
No
qawfe
‘sin’, ‘cos’
No
A或B
qawse
‘阿爾格*’
No
No
qawce
‘cauchy’
No
No
下麵提供了 [1] 中每個例程的簡短說明。
是一個基於全局自適應區間細分與外推法相結合的積分器,它將消除幾種類型的被積函數奇異性的影響。
處理無限間隔內的積分。無限範圍映射到有限區間,隨後應用與
QAGS
中相同的策略。與 QAGS 的用途相同,但還允許用戶提供有關 trouble-spots 的位置和類型的明確信息,即內部奇點、不連續性和被積函數的其他困難的橫坐標。
是用於在有限區間 [a,b] 上評估 或 的積分器,其中 和 由用戶指定。規則評估組件基於修改後的Clenshaw-Curtis技術
自適應細分方案與外推程序結合使用,該方案是對
QAGS
中的方案的修改,並允許算法處理 中的奇點。計算用戶提供的
QAWO
的過程應用於連續的有限間隔,並且通過 算法的收斂加速應用於一係列積分近似。 和 的傅裏葉變換 或 。近似 和 其中 和 ,其中 可以是以下函數之一: 、 、 、 。
用戶指定
, 和函數的類型 。應用全局自適應細分策略,並對包含以下內容的子區間進行修改後的 Clenshaw-Curtis 積分:a或者b.計算 ,其中對於用戶指定的 和 ,積分必須解釋為柯西主值積分。該策略具有全局適應性。修改後的 Clenshaw-Curtis 積分用於包含點 的那些區間。
察格色:
卡吉:
察格佩:
卡沃伊:
誇夫:
誇瑟:
誇斯:
實變量的複函數積分
實數變量的複值函數 可以寫為 。類似地, 的積分可以寫為
假設
quad
通過分別集成實部和虛部來集成complex-valued函數。 和 的積分存在於區間 [2] 上。因此,參考:
[1]羅伯特·皮森斯; de Doncker-Kapenga,伊莉斯;克裏斯托夫·W·尤伯胡貝爾;大衛·卡哈納 (1983)。 QUADPACK:用於自動集成的子程序包。 Springer-Verlag。 ISBN 978-3-540-12553-2。
[2]麥卡洛,托馬斯;菲利普斯·基思 (1973)。複平麵分析基礎。霍爾特·萊因哈特·溫斯頓。國際標準書號 0-03-086370-8
例子:
計算 並與解析結果進行比較
>>> from scipy import integrate >>> import numpy as np >>> x2 = lambda x: x**2 >>> integrate.quad(x2, 0, 4) (21.333333333333332, 2.3684757858670003e-13) >>> print(4**3 / 3.) # analytical result 21.3333333333
計算
>>> invexp = lambda x: np.exp(-x) >>> integrate.quad(invexp, 0, np.inf) (1.0, 5.842605999138044e-11)
計算 的
>>> f = lambda x, a: a*x >>> y, err = integrate.quad(f, 0, 1, args=(1,)) >>> y 0.5 >>> y, err = integrate.quad(f, 0, 1, args=(3,)) >>> y 1.5
使用 ctypes 計算 ,保持 y 參數為 1:
testlib.c => double func(int n, double args[n]){ return args[0]*args[0] + args[1]*args[1];} compile to library testlib.*
from scipy import integrate import ctypes lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path lib.func.restype = ctypes.c_double lib.func.argtypes = (ctypes.c_int,ctypes.c_double) integrate.quad(lib.func,0,1,(1)) #(1.3333333333333333, 1.4802973661668752e-14) print((1.0**3/3.0 + 1.0) - (0.0**3/3.0 + 0.0)) #Analytic result # 1.3333333333333333
請注意,與積分間隔的大小相比,脈衝形狀和其他尖銳特征可能無法使用此方法正確積分。此限製的一個簡化示例是將 y 軸反射階躍函數與積分範圍內的許多零值積分。
>>> y = lambda x: 1 if x<=0 else 0 >>> integrate.quad(y, -1, 1) (1.0, 1.1102230246251565e-14) >>> integrate.quad(y, -1, 100) (1.0000000002199108, 1.0189464580163188e-08) >>> integrate.quad(y, -1, 10000) (0.0, 0.0)
相關用法
- Python SciPy integrate.quad_vec用法及代碼示例
- Python SciPy integrate.quadrature用法及代碼示例
- Python SciPy integrate.quad_explain用法及代碼示例
- Python SciPy integrate.qmc_quad用法及代碼示例
- Python SciPy integrate.cumulative_trapezoid用法及代碼示例
- Python SciPy integrate.romberg用法及代碼示例
- Python SciPy integrate.dblquad用法及代碼示例
- Python SciPy integrate.simpson用法及代碼示例
- Python SciPy integrate.solve_bvp用法及代碼示例
- Python SciPy integrate.solve_ivp用法及代碼示例
- Python SciPy integrate.newton_cotes用法及代碼示例
- Python SciPy integrate.odeint用法及代碼示例
- Python SciPy integrate.ode用法及代碼示例
- Python SciPy integrate.romb用法及代碼示例
- Python SciPy integrate.fixed_quad用法及代碼示例
- Python SciPy integrate.tplquad用法及代碼示例
- Python SciPy integrate.nquad用法及代碼示例
- Python SciPy integrate.trapezoid用法及代碼示例
- Python SciPy interpolate.make_interp_spline用法及代碼示例
- Python SciPy interpolate.krogh_interpolate用法及代碼示例
- Python SciPy interpolative.reconstruct_matrix_from_id用法及代碼示例
- Python SciPy interpolate.InterpolatedUnivariateSpline用法及代碼示例
- Python SciPy interpolate.BSpline用法及代碼示例
- Python SciPy interpolative.reconstruct_interp_matrix用法及代碼示例
- Python SciPy interpolate.LSQSphereBivariateSpline用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.integrate.quad。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。