2016-04-10 51 views
0

Ich möchte dies Code:Integrate.quad funktioniert nicht richtig

http://latex.codecogs.com/gif.latex?%5Cint_%7B0.322411516161%7D%5E%5Cinfty%20%28108e%5Ex%20-%20150%29function%5Bselection%5D%28%29%20dx

wo

params = (-0.00019942774322628663, 0.017096351295537309) 
functions = {'1': lambda x:norm.cdf(x,loc=params[0],scale=params[1]), '2': lambda x:laplace.cdf(x,loc=params[0],scale=params[1])} 

Also habe ich geschrieben, um diese:

print integrate.quad(lambda x : ((108*numpy.exp(x))-150)*functions[selection](), 0.322411516161, numpy.inf) 

wo Auswahl wird vom Benutzer angegeben. Ich bekomme diese Fehlermeldung:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

EDIT: Ich habe folgende Änderungen vorgenommen, die Antwort zu lesen:

print integrate.quad(lambda x : ((108*numpy.exp(x))-150)*functions[selection](x), 0.322411516161, numpy.inf) 

und ich

IntegrationWarning: The occurrence of roundoff error is detected, which prevents the requested tolerance from being achieved. The error may be underestimated.warnings.warn(msg, IntegrationWarning) 
(inf, nan) 
+1

Ihr Integral divergiert. Jede der CDF-Funktionen in "Auswahl" nähert sich 1, wenn x in Unendlich geht. Der Integrand ist die CDF multipliziert mit 108 x exp (x) - 150. Also ist der Integrand für großes x effektiv 108 × exp (x) - 150, und das Integral von diesem über [x0, unendlich] divergiert. Überprüfen Sie das Problem, das Sie lösen möchten, um sicherzustellen, dass Sie die richtige Funktion integrieren. Vielleicht möchten Sie die PDF (https://en.wikipedia.org/wiki/Probability_density_function) anstelle der CDF verwenden? –

Antwort

1

Der Grund, warum Sie die Fehlermeldung erhalten, weil Ihr lambda ist

lambda x : ((108*numpy.exp(x))-150)*functions[selection]() 

, wenn es

lambda x : ((108*numpy.exp(x))-150)*functions[selection](your_arg_here) 

sein sollte, wo your_arg_here ist, was Sie Ihre Auswahl Funktion übergeben werden soll.

Mit anderen Worten, die lambda, die den Fehler über nicht mit genug args erzeugt ist je nachdem, welcher lambda Sie mit selection sind Referenzierung nicht die lambda Sie integrate.quad definiert haben.

Nicht sicher, welche arg Sie an Ihre Auswahlfunktion übergeben möchten, oder ich würde eine vollständigere Antwort geben. Ich gehe davon aus, es ist x, aber, und in diesem Fall Ihre lambda wäre:

lambda x : ((108*numpy.exp(x))-150)*functions[selection](x) 

Als Antwort auf die Frage aktualisiert:

IntegrationWarning: The occurrence of roundoff error is detected, which prevents the requested tolerance from being achieved. The error may be underestimated.warnings.warn(msg, IntegrationWarning) 
(inf, nan) 

gerade ist so dass Sie wissen, dass das Integral divergiert (geht in die Unendlichkeit), und es gibt einige Gleitkomma-Fehler. Das Integral divergent ist sinnvoll, da e^x als x ---> inf unbegrenzt ist und einen cdf-Wert berechnet, was bedeutet, dass es durch [0,1] begrenzt ist. Aufgrund einiger schneller Tests sieht es so aus, als ob für Werte größer als 1 immer 1 ist. Also als x -> inf ist 1, und e^x geht ins Unendliche, daher die Divergenz.

+0

Danke Kumpel. Ich habe das getan, aber anstelle von x habe ich params (Funktionen innerhalb des Wörterbuchs müssen Params, habe ich Recht?) Und ich bekomme einen neuen Fehler: Fehler: Die mitgelieferte Funktion gibt keinen gültigen Float zurück. Weißt du, was das Problem ist? – Jane

+0

Die Lambda-Funktionen innerhalb des Wörterbuchs benötigen keine 'params', sie haben bereits' params' als Teil ihrer Definition. Sie müssen also auf keinen Fall Params als Argument übergeben. Ich glaube wirklich, du willst einfach 'x' weitergeben, so wie ich es am Ende meiner Antwort gesehen habe. Ich würde Ihre genauen Änderungen sehen müssen, um Ihnen weiter zu helfen, denke ich. Achten Sie darauf, meine Antwort zu verbessern/zu akzeptieren, wenn Sie meinen, dass sie Ihre Frage beantwortet hat! – mwm314

+0

Sie können auch immer eine andere Frage öffnen, wenn Sie andere Probleme haben, die nicht mit der oben gestellten Frage zusammenhängen. – mwm314