2014-05-06 1 views
5

Das folgende Beispiel wird auf der Referenzseite Scipy für integration bereitgestellt.Wie verwende ich dblquad für die doppelte Integration?

from scipy import integrate 
N = 5 
def f(t, x): 
    return np.exp(-x*t)/t**N 
integrate.nquad(f, [[1, np.inf],[0, np.inf]]) 

Im Folgenden ist der Fehler, den ich von meinem IPython Notebook (auf cloud.sagemath.com) erhalten: enter image description here

Es ist meine Vermutung, dass cloud.sagemath.com auf die neueste Version von Scipy nicht aktualisiert wird und daher Es fehlt das Modul für nquad. Alles, was ich brauche, ist die Integration über zwei Variablen und daher wollte ich dblquad verwenden, die bereits in der Cloud verfügbar ist.

Daher geändert ich die letzte Zeile der dblquad Syntax zu entsprechen, wie unten dargestellt: enter image description here

Aber es erscheint immer noch den Fehler auf: TypeError: 'int' object is not callable. Was ist der Fehler in meinem Skript? Ich habe die gesamte Fehlermeldung unten eingefügt:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-5-2d0c5cf05694> in <module>() 
     4 def f(t, x): 
     5  return np.exp(-x*t)/t**N 
----> 6 integrate.dblquad(f,1, np.inf,0, np.inf) 

/usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in dblquad(func, a, b, gfun, hfun, args, epsabs, epsrel) 
    424 
    425  """ 
--> 426  return quad(_infunc,a,b,(func,gfun,hfun,args),epsabs=epsabs,epsrel=epsrel) 
    427 
    428 def _infunc2(y,x,func,qfun,rfun,more_args): 

/usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst) 
    246  if type(args) != type(()): args = (args,) 
    247  if (weight is None): 
--> 248   retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points) 
    249  else: 
    250   retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts) 

/usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points) 
    313    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) 
    314   else: 
--> 315    return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit) 
    316  else: 
    317   if infbounds !=0: 

/usr/local/sage/sage-6.2.rc0/local/lib/python2.7/site-packages/scipy/integrate/quadpack.pyc in _infunc(x, func, gfun, hfun, more_args) 
    371 
    372 def _infunc(x,func,gfun,hfun,more_args): 
--> 373  a = gfun(x) 
    374  b = hfun(x) 
    375  myargs = (x,) + more_args 

TypeError: 'int' object is not callable 

Edit 1: Ich habe ein funktionierendes Script die Eingaben von den Benutzern Weckesser und Chen verwenden. Nur der Vollständigkeit halber für jeden, der in Zukunft auf diese Frage stolpert.

import numpy as np 
from scipy import integrate 
N=5 
def f(t, x): 
    return np.exp(-x*t)/t**N 
R1=integrate.dblquad(f,0, np.inf,lambda x: 1, lambda x: np.inf) 
print R1 

Antwort

5

Erneut die docstring for dblquad. Das vierte und das fünfte Argument müssen aufrufbar sein (d. H. Funktionen). Sie haben 0 und np.inf übergeben. Die Funktionen sind die untere und obere Grenze des inneren Integrals.

Es gibt an example in the tutorial.

4

Die Signatur dblquad ist

integrate.dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08) 

gfun:

aufrufbare in y

Die untere Grenzkurve, die eine Funktion eines einzelnen Gleitkomma Argument zu nehmen ist (x) und Zurückkehren ein Fließkomma-Ergebnis: Eine Lambda-Funktion kann hier nützlich sein.

hfun: aufrufbare

Die obere Begrenzungslinie in y (gleichen Anforderungen wie gfun).

Also müssen Sie gfun und hfun zu Funktionen ersetzen.

Verwandte Themen