tplquad: TypeError: 'float' object is not callable
tplquad: TypeError: 'float' object is not callable
我正在尝试 运行 此代码,但我在标题中收到错误。我查找了有关 tplquad 的文档和示例,但无法理解我的问题。非常感谢您!
这里是我的代码:
from numpy import *
from pylab import *
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from math import *
from scipy.integrate import quad,dblquad,tplquad
from scipy.integrate import nquad
fig_width = 6.
fig_height = fig_width*0.75
fig_size = [fig_width,fig_height]
params = {'backend': 'TkAgg',
'axes.labelsize': 30,
'text.fontsize': 20,
'title.fontsize': 20,
'legend.fontsize': 20,
'xtick.labelsize': 20,
'ytick.labelsize': 20,
'text.usetex': False,
'font.family': 'sans-serif',
'figure.figsize': fig_size}
rcParams.update(params)
pi=3.14
pt_T=3.
#T=0.47
thetaP= -pi
precision=5
y=0
M_T=linspace(1.,7.,precision)
integral1d=[0]*precision
#chi now is def with a plus instead of the minus in the article
def chi(thetap1,p1,thetaP,T,M_T):
return abs((2*p1*T*sqrt(pt_T**2+(M_T**2+pt_T**2)*sinh(y)**2)*sin(thetaP)*sin(thetap1))**2 - (2*p1*T*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2)*sinh(y)**2)*cos(thetaP) *cos(thetap1) )-(T**2)* M_T**2)**2)+1
def p1max(thetaP, thetap1,T,M_T):
return (M_T**2)*T/(2*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2))*sinh(y)**2*cos(thetaP-thetap1)))-0.1
def p1min(thetaP, thetap1,T,M_T):
#NOT SURE ABOUT THE T AT DENOMINATOR
return (M_T**2)*T/(2*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2))*sinh(y)**2*cos(thetaP+thetap1))) +0.1
def integral(thetaP,T,M_T):
area =dblquad(lambda p1, thetap1: 5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) , -pi+0.1, -0.1, lambda p1: p1min(thetaP, p1,T,M_T), lambda p1: p1max(thetaP,p1,T,M_T)) #CHANGE 1., lambda p1:10.)
return area[0]
def integrand(M_T, p1,thetap1,T):
return pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1)))
def formula151(M_T):
area =tplquad(lambda p1, thetap1,T: pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) ,0.333, 20./3,lambda thetap1: -pi+0.1, -0.1, lambda thetap1, p1: p1min(thetaP, p1,T,M_T),lambda thetap1,p1: p1max(thetaP,p1,T,M_T) )
return area[0]
#solving the integral
for ind in range(0, precision):
integral1d[ind]=formula151( M_T[ind])
print integral1d[ind]
plot(M_T,integral1d)
xlabel('M/T')
ylabel('prod rate')
title('thetaP =-3.12')
plt.yscale('log')
#plt.xscale('log')
show()
错误来自第 57 行,其中使用了 tplquad,完整的回溯是
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
202 else:
203 filename = fname
--> 204 __builtin__.execfile(filename, *where)
/home/chiara/Scrivania/formula15a.py in <module>()
61 #solving the integral
62 for ind in range(0, precision):
---> 63 integral1d[ind]=formula151( M_T[ind])
64 print integral1d[ind]
65
/home/chiara/Scrivania/formula15a.py in formula151(M_T)
55
56 def formula151(M_T):
---> 57 area =tplquad(lambda p1, thetap1,T: pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) ,0.333, 20./3,lambda thetap1: -pi+0.1, -0.1, lambda thetap1, p1: p1min(thetaP, p1,T,M_T),lambda thetap1,p1: p1max(thetaP,p1,T,M_T) )
58 return area[0]
59
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in tplquad(func, a, b, gfun, hfun, qfun, rfun, args, epsabs, epsrel)
498
499 """
--> 500 return dblquad(_infunc2,a,b,gfun,hfun,(func,qfun,rfun,args),epsabs=epsabs,epsrel=epsrel)
501
502
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in dblquad(func, a, b, gfun, hfun, args, epsabs, epsrel)
433
434 """
--> 435 return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)
436
437
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
252 args = (args,)
253 if (weight is None):
--> 254 retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
255 else:
256 retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
317 if points is None:
318 if infbounds == 0:
--> 319 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
320 else:
321 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in _infunc(x, func, gfun, hfun, more_args)
379 def _infunc(x,func,gfun,hfun,more_args):
380 a = gfun(x)
--> 381 b = hfun(x)
382 myargs = (x,) + more_args
383 return quad(func,a,b,args=myargs)[0]
TypeError: 'float' object is not callable
注意:函数 "integral" 和 "integrand" 已定义但最终未使用...我只是将它们留在那里
根据 scipy.integrate
docs,tplquad
的签名(计算三重积分的数值近似值)是:
scipy.integrate.tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)
其中func
是三个变量求积分的函数,a
和b
是外积分的浮点数极限,gfun
和hfun
是给出中间积分极限的一个变量的函数,qfun
和 rfun
是给出最内层积分极限的两个变量的函数。
在我重新格式化您的代码以使其更具可读性之前,我很难弄清楚发生了什么。这是您对 tplquad
的调用,已重新格式化以使行长度更短:
area = tplquad(
lambda p1, thetap1, T: (
pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*
(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*
(1/(exp(p1/T) + 1))*
(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) + 1)))
),
0.333, # a
20./3, # b
lambda thetap1: -pi + 0.1, # gfun
-0.1, # hfun
lambda thetap1, p1: p1min(thetaP, p1, T, M_T), # qfun
lambda thetap1, p1: p1max(thetaP, p1, T, M_T), # rfun
)
(正如@user2357112 所建议的那样,将这些 lambda
表达式从调用中拉出并将它们定义为单独的函数也有助于提高可读性。特别是,如果您为被积函数定义一个单独的函数,您将能够一点一点地执行计算,而不需要将一个巨大的表达式放在一行上。)
重新格式化后,更容易看出问题所在:在您对 tplquad
的调用中,您为 hfun
传递了常量 -0.1
。这行不通:在数学中,可以(ab)使用一个常数值来表示一个常数函数,但是编程语言(和一些数学家,来了)往往有点挑剔:你将需要这里有一个实际的功能。将 -0.1
替换为 lambda thetap1: -0.1
.
顺便说一句,我也有点怀疑你这里的可变订单。文档页面说虽然被积函数的输入顺序应该是 (z, y, x)
,gfun
和 hfun
应该只是 x
和 qfun
的函数rfun
应该是 (x, y)
的函数(按顺序)。这似乎与您拥有的不符。
我正在尝试 运行 此代码,但我在标题中收到错误。我查找了有关 tplquad 的文档和示例,但无法理解我的问题。非常感谢您!
这里是我的代码:
from numpy import *
from pylab import *
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from math import *
from scipy.integrate import quad,dblquad,tplquad
from scipy.integrate import nquad
fig_width = 6.
fig_height = fig_width*0.75
fig_size = [fig_width,fig_height]
params = {'backend': 'TkAgg',
'axes.labelsize': 30,
'text.fontsize': 20,
'title.fontsize': 20,
'legend.fontsize': 20,
'xtick.labelsize': 20,
'ytick.labelsize': 20,
'text.usetex': False,
'font.family': 'sans-serif',
'figure.figsize': fig_size}
rcParams.update(params)
pi=3.14
pt_T=3.
#T=0.47
thetaP= -pi
precision=5
y=0
M_T=linspace(1.,7.,precision)
integral1d=[0]*precision
#chi now is def with a plus instead of the minus in the article
def chi(thetap1,p1,thetaP,T,M_T):
return abs((2*p1*T*sqrt(pt_T**2+(M_T**2+pt_T**2)*sinh(y)**2)*sin(thetaP)*sin(thetap1))**2 - (2*p1*T*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2)*sinh(y)**2)*cos(thetaP) *cos(thetap1) )-(T**2)* M_T**2)**2)+1
def p1max(thetaP, thetap1,T,M_T):
return (M_T**2)*T/(2*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2))*sinh(y)**2*cos(thetaP-thetap1)))-0.1
def p1min(thetaP, thetap1,T,M_T):
#NOT SURE ABOUT THE T AT DENOMINATOR
return (M_T**2)*T/(2*(sqrt(M_T**2+pt_T**2)*cosh(y)- sqrt(pt_T**2+(M_T**2+pt_T**2))*sinh(y)**2*cos(thetaP+thetap1))) +0.1
def integral(thetaP,T,M_T):
area =dblquad(lambda p1, thetap1: 5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) , -pi+0.1, -0.1, lambda p1: p1min(thetaP, p1,T,M_T), lambda p1: p1max(thetaP,p1,T,M_T)) #CHANGE 1., lambda p1:10.)
return area[0]
def integrand(M_T, p1,thetap1,T):
return pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1)))
def formula151(M_T):
area =tplquad(lambda p1, thetap1,T: pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) ,0.333, 20./3,lambda thetap1: -pi+0.1, -0.1, lambda thetap1, p1: p1min(thetaP, p1,T,M_T),lambda thetap1,p1: p1max(thetaP,p1,T,M_T) )
return area[0]
#solving the integral
for ind in range(0, precision):
integral1d[ind]=formula151( M_T[ind])
print integral1d[ind]
plot(M_T,integral1d)
xlabel('M/T')
ylabel('prod rate')
title('thetaP =-3.12')
plt.yscale('log')
#plt.xscale('log')
show()
错误来自第 57 行,其中使用了 tplquad,完整的回溯是
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
202 else:
203 filename = fname
--> 204 __builtin__.execfile(filename, *where)
/home/chiara/Scrivania/formula15a.py in <module>()
61 #solving the integral
62 for ind in range(0, precision):
---> 63 integral1d[ind]=formula151( M_T[ind])
64 print integral1d[ind]
65
/home/chiara/Scrivania/formula15a.py in formula151(M_T)
55
56 def formula151(M_T):
---> 57 area =tplquad(lambda p1, thetap1,T: pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*(1/(exp(p1/T) + 1))*(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) +1))) ,0.333, 20./3,lambda thetap1: -pi+0.1, -0.1, lambda thetap1, p1: p1min(thetaP, p1,T,M_T),lambda thetap1,p1: p1max(thetaP,p1,T,M_T) )
58 return area[0]
59
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in tplquad(func, a, b, gfun, hfun, qfun, rfun, args, epsabs, epsrel)
498
499 """
--> 500 return dblquad(_infunc2,a,b,gfun,hfun,(func,qfun,rfun,args),epsabs=epsabs,epsrel=epsrel)
501
502
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in dblquad(func, a, b, gfun, hfun, args, epsabs, epsrel)
433
434 """
--> 435 return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel)
436
437
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
252 args = (args,)
253 if (weight is None):
--> 254 retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
255 else:
256 retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
317 if points is None:
318 if infbounds == 0:
--> 319 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
320 else:
321 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in _infunc(x, func, gfun, hfun, more_args)
379 def _infunc(x,func,gfun,hfun,more_args):
380 a = gfun(x)
--> 381 b = hfun(x)
382 myargs = (x,) + more_args
383 return quad(func,a,b,args=myargs)[0]
TypeError: 'float' object is not callable
注意:函数 "integral" 和 "integrand" 已定义但最终未使用...我只是将它们留在那里
根据 scipy.integrate
docs,tplquad
的签名(计算三重积分的数值近似值)是:
scipy.integrate.tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)
其中func
是三个变量求积分的函数,a
和b
是外积分的浮点数极限,gfun
和hfun
是给出中间积分极限的一个变量的函数,qfun
和 rfun
是给出最内层积分极限的两个变量的函数。
在我重新格式化您的代码以使其更具可读性之前,我很难弄清楚发生了什么。这是您对 tplquad
的调用,已重新格式化以使行长度更短:
area = tplquad(
lambda p1, thetap1, T: (
pt_T*T*2*pi*5*(1/(18*pi**5))*sin(thetap1)*
(p1/(sqrt(chi(thetap1,p1,thetaP,T,M_T))))*
(1/(exp(p1/T) + 1))*
(1/(exp((sqrt(M_T**2 + pt_T**2)*cosh(y) - p1/T) + 1)))
),
0.333, # a
20./3, # b
lambda thetap1: -pi + 0.1, # gfun
-0.1, # hfun
lambda thetap1, p1: p1min(thetaP, p1, T, M_T), # qfun
lambda thetap1, p1: p1max(thetaP, p1, T, M_T), # rfun
)
(正如@user2357112 所建议的那样,将这些 lambda
表达式从调用中拉出并将它们定义为单独的函数也有助于提高可读性。特别是,如果您为被积函数定义一个单独的函数,您将能够一点一点地执行计算,而不需要将一个巨大的表达式放在一行上。)
重新格式化后,更容易看出问题所在:在您对 tplquad
的调用中,您为 hfun
传递了常量 -0.1
。这行不通:在数学中,可以(ab)使用一个常数值来表示一个常数函数,但是编程语言(和一些数学家,来了)往往有点挑剔:你将需要这里有一个实际的功能。将 -0.1
替换为 lambda thetap1: -0.1
.
顺便说一句,我也有点怀疑你这里的可变订单。文档页面说虽然被积函数的输入顺序应该是 (z, y, x)
,gfun
和 hfun
应该只是 x
和 qfun
的函数rfun
应该是 (x, y)
的函数(按顺序)。这似乎与您拥有的不符。