2015-04-12 98 views
-1

我试图运行此代码,但在标题中出现错误。我查找了关于tplquad的文档和示例,但我无法理解我的问题。非常感谢您提前!tplquad:TypeError:'float'对象不可调用

这里我的代码:

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 

注:该功能 “整体” 和 “积”被定义但最终没有使用......我只是把它们留在那里

+1

哪一行包含错误?你可以显示完整的“Traceback” – ZdaR

+0

对不起......我用错误行和回溯编辑了问题! – cgastald

+0

@MarkDickinson我刚刚试过你的建议,但后来我得到这个错误: TypeError:tplquad()至少需要7个参数(给出6个) – cgastald

回答

1

scipy.integratedocstplquad(它计算一个数值近似到三重积分)为:

scipy.integrate.tplquad(func, a, b, gfun, hfun, qfun, rfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)

其中func是三个变量的函数加以整合,ab是浮点限制对于一个变量的外积分,gfunhfun是功能给出中间积分的极限,并且qfunrfun是给出最内积分的极限的两个变量的函数。

我很难弄清楚发生了什么,直到我将您的代码重新格式化为更具可读性。这里有您的来电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时,您传递的是-0.1的常量hfun。这是行不通的:在数学中,人们可以使用一个常数值来表示一个常数函数,但编程语言(和一些数学家来说)往往会更挑剔:你需要这是一个实际的功能。将-0.1替换为lambda thetap1: -0.1

顺便说一句,我也有点怀疑你的可变订单在这里。文档页面说,尽管被积函数的输入顺序应该是(z, y, x),gfunhfun应该只是x的函数,并且qfunrfun应该是(x, y)(以该顺序)的函数。这似乎不符合你的要求。

+0

非常感谢你,这很有帮助! – cgastald