2015-04-12 99 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