计算定积分。
使用Fortran库QUADPACK中的技术将func从a集成到b(可能是无限间隔)。
参数:
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四元组的参数
另外,支持某些ctypes调用签名以实现向后兼容性,但不应在新代码中使用这些签名。
a:float积分的下限(将-numpy.inf用于-infinity)。
b:float积分上限(将numpy.inf用于+ infinity)。
args:tuple, 可选参数传递给func的额外参数。
full_output:int, 可选参数非零返回集成信息字典。如果不为零,则警告消息也将被抑制,并将该消息附加到输出元组。
返回值:
y:浮动函数从a到b的积分。
abserr:浮动结果中绝对误差的估计。
infodict:字典包含其他信息的字典。运行scipy.integrate.quad_explain()以获取更多信息。
信息收敛消息。
说明仅附加了‘cos’或‘sin’加权和无限积分限制,它包含对infodict [‘ierlst’]中代码的解释
其他参数:
epsabs:float 或 int, 可选参数绝对误差容限。
epsrel:float 或 int, 可选参数相对误差容限。
limit:float 或 int, 可选参数自适应算法中使用的子间隔数的上限。
points:(sequence of floats,ints), 可选参数有界积分区间中可能出现积分对象局部困难的一 Series 断点(例如,奇异点,不连续点)。序列不必排序。请注意,此选项不能与weight。
weight:float 或 int, 可选参数表示加权函数的字符串。有关此内容和其余参数的完整说明,请参见下文。
wvar:可选参数与加权函数一起使用的变量。
wopts:可选参数用于重用切比雪夫时刻的可选输入。
maxp1:float 或 int, 可选参数切比雪夫矩数的上限。
limlst:int, 可选参数用于正弦加权和无限end-point的循环数(> = 3)的上限。
注意:
quad()输入和输出的附加信息
如果full_output不为零,则第三个输出参数(infodict)是字典,其条目如下表所示。对于无限限制,将范围转换为(0,1),并针对此转换范围给出可选输出。令M为输入参数限制,令K为infodict [‘last’]。条目是:
‘neval’函数评估的次数。
‘last’在细分过程中产生的子间隔数K。
‘alist’长度为M的秩1数组,其前K个元素是积分范围分区中子间隔的左端点。
‘blist’长度为M的秩1数组,其前K个元素是子间隔的右端点。
‘rlist’长度为M的秩1数组,其前K个元素是子间隔的整数近似。
‘elist’长度为M的秩1数组,其前K个元素是子间隔上绝对误差估计的模。
‘iord’长度为M的秩1整数数组,其前L个元素是指向子区间上的误差估计的指针,其中L=K如果K<=M/2+2或者L=M+1-K除此以外。让我成为序列infodict['iord']并让E为序列infodict['elist']。然后E[I[1]], ..., E[I[L]]形成递减顺序。
如果提供了输入参数点(即不为None),则以下附加输出将放置在输出字典中。假设点序列的长度为P。
‘pts’长度为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])进行首次积分之后,某些区间的误差估计可能已经人为地增加了,以便对其进行细分。此数组在与发生这种情况的子间隔相对应的插槽中有一个。
加权被积物
输入变量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 =(alpha,beta)
‘alg-loga’
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)* log(b-x)
wvar =(alpha,beta)
‘cauchy’
1 /(x-c)
wvar = c
wvar根据选择的权重保存参数w,(alpha,beta)或c。在这些表达式中,a和b是积分极限。
对于‘cos’和‘sin’加权,可以使用其他输入和输出。
对于有限的积分极限,使用使用切比雪夫矩的Clenshaw-Curtis方法执行积分。为了进行重复计算,这些力矩将保存在输出字典中:
‘momcom’计算出的切比雪夫矩的最大水平,即M_c是infodict['momcom']然后计算出力矩的长度间隔|b-a| * 2**(-l),l=0,1,...,M_c。
‘nnlog’长度为M(= limit)的1阶整数数组,包含子间隔的细分级别,即,如果相应的子间隔为则此数组的元素等于l|b-a|* 2**(-l)。
‘chebmo’包含计算出的切比雪夫矩的形状为等级2的数组(25,maxp1)。通过将数组作为序列wopts的第二个元素传递,并将infodict [‘momcom’]作为第一个元素传递,可以在相同的时间间隔内将这些传递给积分。
如果积分极限之一是无穷大,则将计算傅立叶积分(假设W neq 0)。如果full_output为1并且遇到数字错误,则除了附加到输出元组的错误消息外,还将字典附加到输出元组中,以翻译数组中的错误代码。info['ierlst']英文消息。输出信息词典包含以下条目,而不是‘last’,‘alist’,‘blist’,‘rlist’和‘elist’:
‘lst’集成所需的子间隔数(称为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级数组M_f包含与在相同位置的间隔相对应的误差估计infodict['rslist']。
‘ierlst’长度的1级整数数组M_f包含一个错误标志,该错误标志对应于间隔在同一位置infodict['rslist']。有关代码的含义,请参见说明字典(输出元组中的最后一个条目)。
例子:
计算并与分析结果进行比较
>>> 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
计算
>>> 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)