scipy.integrate.

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()
../../_images/scipy-integrate-quad_vec-1_00_00.png

使用 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)