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)[源代码]¶
计算定积分。
从以下位置集成函数 a 至 b (可能是无限间隔)使用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
。在包含以下内容的电话表中xx
,n
是指xx
包含以下内容的数组xx[0] == x
项目的睡觉是包含在args
四边形的变元。此外,支持某些ctype调用签名以实现向后兼容,但不应在新代码中使用这些签名。
- a浮动
积分下限(使用-numpy.inf表示-无穷大)。
- b浮动
积分上限(使用numpy.inf表示+无穷大)。
- args元组,可选
要传递的额外参数 func 。
- full_output整型,可选
非零返回集成信息字典。如果非零,则警告消息也将被取消,并且该消息将被追加到输出元组中。
- 退货
- y浮动
中函数的积分 a 至 b 。
- 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 从… a 至 b ,以及result
是数值近似。看见 epsrel 下面。- epsrelFLOAT或INT,可选
相对误差容限。默认值为1.49e-8。如果
epsabs <= 0
, epsrel 必须大于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+2
或L=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_c
是infodict['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)