quad_vec#
- scipy.integrate.quad_vec(f, a, b, epsabs=1e-200, epsrel=1e-08, norm='2', cache_size=100000000.0, limit=10000, workers=1, points=None, quadrature=None, full_output=False, *, args=())[source]#
向量值函數的自適應積分。
- 參數:
- fcallable
要積分的向量值函數 f(x)。
- afloat
初始點。
- bfloat
終點。
- epsabsfloat, optional
絕對容忍度。
- epsrelfloat, optional
相對容忍度。
- norm{‘max’, ‘2’}, optional
用於誤差估計的向量範數。
- cache_sizeint, optional
用於記憶化的位元組數。
- limitfloat or int, optional
自適應演算法中使用的子區間數量的上限。
- workersint or map-like callable, optional
如果 workers 是整數,則部分計算會平行完成,並細分為這麼多任務(使用
multiprocessing.pool.Pool
)。 提供 -1 以使用進程可用的所有核心。 或者,提供類似 map 的可呼叫物件,例如multiprocessing.pool.Pool.map
,以平行評估族群。 此評估會以workers(func, iterable)
執行。- pointslist, optional
額外的中斷點列表。
- quadrature{‘gk21’, ‘gk15’, ‘trapezoid’}, optional
要在子區間上使用的積分規則。 選項:‘gk21’(Gauss-Kronrod 21 點規則)、‘gk15’(Gauss-Kronrod 15 點規則)、‘trapezoid’(複合梯形規則)。 預設值:有限區間為 ‘gk21’,(半)無限區間為 ‘gk15’
- full_outputbool, optional
傳回額外的
info
字典。- argstuple, optional
要傳遞給函數的額外參數(如果有的話)。
在版本 1.8.0 中新增。
- 返回:
- res{float, array-like}
結果的估計值
- errfloat
給定範數中結果的誤差估計值
- infodict
僅當
full_output=True
時返回。 Info 字典。 是一個具有以下屬性的物件- successbool
積分是否達到目標精度。
- statusint
收斂指標,成功 (0)、失敗 (1) 和因捨入誤差而失敗 (2)。
- nevalint
函數評估次數。
- intervalsndarray, shape (num_intervals, 2)
細分區間的起點和終點。
- integralsndarray, shape (num_intervals, …)
每個區間的積分。 請注意,最多記錄
cache_size
個值,並且陣列可能包含 nan 以表示遺失的項目。- errorsndarray, shape (num_intervals,)
每個區間的估計積分誤差。
註解
該演算法主要遵循 QUADPACK 的 DQAG* 演算法的實作,實作了全域誤差控制和自適應細分。
此處的演算法與 QUADPACK 方法有一些差異
該演算法不是一次細分一個區間,而是一次細分 N 個誤差最大的區間。 這使得積分能夠(部分)平行化。
然後不實作首先細分「下一個最大」區間的邏輯,我們依靠上述擴展來避免僅專注於「小」區間。
未使用 Wynn epsilon 表格外推法(QUADPACK 將其用於無限區間)。 這是因為此處的演算法應該適用於向量值函數,在使用者指定的範數中,並且 epsilon 演算法到這種情況的擴展似乎並未得到廣泛認可。 對於最大範數,使用元素級 Wynn epsilon 可能是可行的,但我們在此處不這樣做,希望 epsilon 外推法主要在特殊情況下有用。
參考文獻
[1] R. Piessens, E. de Doncker, QUADPACK (1983)。
範例
我們可以計算向量值函數的積分
>>> from scipy.integrate import quad_vec >>> import numpy as np >>> import matplotlib.pyplot as plt >>> alpha = np.linspace(0.0, 2.0, num=30) >>> f = lambda x: x**alpha >>> x0, x1 = 0, 2 >>> y, err = quad_vec(f, x0, x1) >>> plt.plot(alpha, y) >>> plt.xlabel(r"$\alpha$") >>> plt.ylabel(r"$\int_{0}^{2} x^\alpha dx$") >>> plt.show()
使用 workers 參數時,應確保主模組是導入安全的,例如將上面的範例重寫為
from scipy.integrate import quad_vec import numpy as np import matplotlib.pyplot as plt alpha = np.linspace(0.0, 2.0, num=30) x0, x1 = 0, 2 def f(x): return x**alpha if __name__ == "__main__": y, err = quad_vec(f, x0, x1, workers=2)