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)[源代码]

计算定积分。

从以下位置集成函数 ab (可能是无限间隔)使用Fortran库故障诊断包中的技术。

参数
func{function,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 。在包含以下内容的电话表中 xxn 是指 xx 包含以下内容的数组 xx[0] == x 项目的睡觉是包含在 args 四边形的变元。

此外,支持某些ctype调用签名以实现向后兼容,但不应在新代码中使用这些签名。

a浮动

积分下限(使用-numpy.inf表示-无穷大)。

b浮动

积分上限(使用numpy.inf表示+无穷大)。

args元组,可选

要传递的额外参数 func

full_output整型,可选

非零返回集成信息字典。如果非零,则警告消息也将被取消,并且该消息将被追加到输出元组中。

退货
y浮动

中函数的积分 ab

abserr浮动

对结果中绝对误差的估计。

infodictDICT

包含附加信息的词典。运行scipy.Integrate.quad_EXPLAIN()了解更多信息。

消息

汇聚消息。

解释一下

它仅附加了‘cos’或‘sin’权重和无限积分限制,包含对infodict中代码的解释 [‘Ierlst’]

其他参数
epsabsFLOAT或INT,可选

绝对误差容限。默认值为1.49e-8。 quad 试图获得一个精确度为 abs(i-result) <= max(epsabs, epsrel*abs(i)) 哪里 i =积分 func 从… ab ,以及 result 是数值近似。看见 epsrel 下面。

epsrelFLOAT或INT,可选

相对误差容限。默认值为1.49e-8。如果 epsabs <= 0epsrel 必须大于5e-29和 50 * (machine epsilon) 。看见 epsabs 上面。

limitFLOAT或INT,可选

自适应算法中使用的子区间数的上限。

points(浮点数序列,整型),可选

有界积分区间中的一系列断点,其中可能出现被积函数的局部困难(例如,奇点、间断)。不需要对序列进行排序。请注意,此选项不能与一起使用 weight

weightFLOAT或INT,可选

表示加权函数的字符串。关于这一点和其余论点的完整解释可以在下面找到。

wvar可选

用于加权函数的变量。

wopts可选

重复使用切比雪夫矩的可选输入。

maxp1FLOAT或INT,可选

切比雪夫矩个数的一个上界。

limlst整型,可选

与正弦加权和无限终点一起使用的循环数的上限(>=3)。

参见

dblquad

二重积分

tplquad

三重积分

nquad

n维积分(用法 quad 递归地)

fixed_quad

定阶高斯求积

quadrature

自适应高斯求积

odeint

ODE积分器

ode

ODE积分器

simpson

采样数据积分器

romb

采样数据积分器

scipy.special

对于正交多项式的系数和根

注意事项

有关quad()输入和输出的额外信息

如果FULL_OUTPUT非零,则第三个输出参数(Infodict)是一个字典,其条目如下表所示。对于无限限制,范围被转换为(0,1),并给出关于该转换范围的可选输出。设M为输入参数限制,K为信息量 [“最后一个”] 。这些条目包括:

“新时代”

函数求值的次数。

“最后一个”

细分过程中产生的子区间数K。

“主义者”

长度为M的秩-1数组,其前K个元素是积分范围划分中子区间的左端点。

“BLIST”

长度为M的秩-1数组,其前K个元素是子区间的右端点。

“名单”

长度为M的秩-1数组,其前K个元素是子区间上的积分近似。

“名单”

长度为M的秩-1阵列,其前K个元素是子区间上绝对误差估计的模。

“大人”

长度为M的秩-1整数数组,其前L个元素是指向子区间上的误差估计的指针 L=K 如果 K<=M/2+2L=M+1-K 不然的话。让我成为序列 infodict['iord'] 设E为序列 infodict['elist'] 。然后 E[I[1]], ..., E[I[L]] 形成一个递减的序列。

如果提供了输入自变量(即,它不是无),则以下附加输出被放置在输出字典中。假设点序列的长度为P。

“分数”

长度为P+2的秩-1数组,按升序包含区间的积分极限和断点。这是一个给出子间隔的数组,积分将在这些子间隔上进行。

“水平”(Level)

长度为M(=LIMIT)的秩-1整数数组,包含子区间的细分级别,即如果(AA,BB)是 (pts[1], pts[2]) 哪里 pts[0]pts[2] 是相邻的元素 infodict['pts'] ,则(aa,bb)有水平l,如果 |bb-aa| = |pts[2]-pts[1]| * 2**(-l)

‘ndin’

长度为P+2的秩-1整数数组。在间隔(PTS)上进行第一次积分后 [1] ,PTS [2] ),一些区间上的误差估计可能已经被人为地增加,以便将它们的细分向前推进。该阵列在对应于其发生的子间隔的时隙中具有1。

加权被积函数

输入变量, 重量wvar ,用于通过选择的函数列表对被积函数加权。使用不同的积分方法来计算具有这些权函数的积分,并且这些方法不支持指定断点。权值的可能值和相应的权函数是。

weight

使用的权重函数

wvar

“因为”

COS(w*x)

wvar=w

“罪”

SIN(w*x)

wvar=w

“Alg”

G(X)=((x-a) alpha)*((b-x) 测试版)

wvar=(alpha,beta)

“阿尔格-洛嘎”

G(X)*log(x-a)

wvar=(alpha,beta)

‘alg-logb’

G(X)*log(b-x)

wvar=(alpha,beta)

‘alg-log’

G(X) log(x-a) 对数(b-x)

wvar=(alpha,beta)

“幼稚”

1/(x-c)

wvar=c

wvar根据选定的权重保存参数w、(alpha、beta)或c。在这些表达式中,a和b是积分极限。

对于“cos”和“sin”权重,可以使用其他输入和输出。

对于有限积分极限,采用使用切比雪夫矩的Clenshaw-Curtis方法进行积分。对于重复计算,这些矩保存在输出字典中:

“妈妈咪呀”

已计算的切比雪夫矩的最大水平,即如果 M_cinfodict['momcom'] 然后计算出长度区间的力矩 |b-a| * 2**(-l)l=0,1,...,M_c

“nnlog”

长度为M(=LIMIT)的秩-1整数数组,包含子区间的细分级别,即,如果对应子区间为 |b-a|* 2**(-l)

‘chebmo’

包含计算的切比雪夫矩的形状(25,maxp1)的秩2数组。通过将此数组作为序列wopts的第二个元素传递并传递infodict,可以在相同的间隔内将这些传递给积分 [“妈妈咪呀”] 作为第一个元素。

如果其中一个积分极限是无限的,则计算傅立叶积分(假设w NEQ 0)。如果FULL_OUTPUT为1并且遇到数值错误,则除了附加到输出元组的错误消息外,还会向输出元组追加字典,用于转换数组中的错误代码 info['ierlst'] 致英文信息。输出信息字典包含以下条目,而不是‘last’、‘list’、‘blist’、‘rlist’和‘elist’:

“第一”

积分所需的子间隔数(称为 K_f )。

‘rslst’

长度为M_f=limlst的秩-1数组,其第一个 K_f 元素包含区间内的积分贡献 (a+(k-1)c, a+kc) 哪里 c = (2*floor(|w|) + 1) * pi / |w|k=1,2,...,K_f

‘erlst’

长度为1的秩1数组 M_f 中相同位置的间隔对应的误差估计 infodict['rslist']

‘Ierlst’

长度为1的秩1整数数组 M_f 包含与中相同位置的间隔相对应的错误标志 infodict['rslist'] 。有关代码的含义,请参阅解释字典(输出元组中的最后一个条目)。

示例

计算 \(\int^4_0 x^2 dx\) 并与分析结果进行比较

>>> from scipy import integrate
>>> x2 = lambda x: x**2
>>> integrate.quad(x2, 0, 4)
(21.333333333333332, 2.3684757858670003e-13)
>>> print(4**3 / 3.)  # analytical result
21.3333333333

计算 \(\int^\infty_0 e^{{-x}} dx\)

>>> 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

计算 \(\int^1_0 x^2 + y^2 dx\) 对于ctype,将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)