2016-05-22 8 views
1

Ich möchte die Funktion Integral (t ** t, (t, 0, x)) Lambdify. Es funktioniert, aber meine neue Funktion, die von Lambdify zurückgegeben wurde, gibt keine Zahl, sondern nur (sympy.integrals.integrals.Integral) -Klasse. Aber ich will das nicht, ich will, dass es eine Float-Nummer zurückgibt.Sympy, Konvertieren von harten Integral in Lambda-Funktion mit Lambdify

Hier ist mein Code:

import sympy as sp 
import numpy as np 
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x))) 
print(f(2)) #return Integral(t**t, (t, 0, 2)) 
#but i want 2.83387674524687 

Antwort

0

Sympy kann keine geschlossene Form analytische Lösung für dieses Integral finden, daher gibt es ein nicht bewertet sympy integrales Objekt. Da es scheint, sind Sie mit einer numerischen Lösung in Ordnung, können Sie den quad Funktion des scipy verwenden zu diesem Zweck

import scipy.integrate 

def f(x): 
    return scipy.integrate.quad(lambda t: t**t, 0,x)[0] 

f(2) 

2,83387674525

+0

Ja, vielen Dank für diese Lösung, aber ich möchte kombinieren Sympy und Scipy zusammen. Wechsel von Sympy-Funktion zu Scipy und zurück. –

1

Schließlich i nächste Lösung hierfür zu finden. Ich schaue mich um und finde heraus, dass die Lambda-Funktion zurückkehrt. und wenn Sie es mit einer Zahl aufrufen, gibt es das Objekt zurück (Integarl).

So kann ich eval() auf dieses Objekt aufrufen und es wird eine Zahl zurückgeben. Gefällt mir:

import sympy as sp 
import numpy as np 
x = sp.symbols('x') 
f = sp.lambdify(x,sp.integrate(t**t,(t,0,x))) 
def return_number(z): 
    return f(z).evalf() 
return_number(2) #return 2.83387674524687 

Es funktioniert.

+0

'evalf' verwendet mpmath, um das Integral zu berechnen, das genauer sein kann als scipy.integrate.quad, aber auch langsamer. – asmeurer

2

lambdify unterstützt scipy.integrate.quad nicht direkt yet, aber es ist nicht schwer, die entsprechende Definition hinzuzufügen. Man muss einfach lambdify sagen, wie drucken Integral:

def integral_as_quad(expr, lims): 
    var, a, b = lims 
    return scipy.integrate.quad(lambdify(var, expr), a, b) 

f = lambdify(x, Integral(t**t,(t,0,x)), modules={"Integral": integral_as_quad}) 

Das Ergebnis ist

In [42]: f(2) 
Out[42]: (2.8338767452468625, 2.6601787439517466e-10) 

Was wir hier tun, ist die Definition einer Funktion integral_as_quad, die eine SymPy Integral in einen scipy.integrate.quad Aufruf übersetzt, rekursiv lambdifying der Integrand (wenn Sie komplexere oder symbolische Integrationslimits haben, wollen Sie diese rekursiv auch lamifizieren).

Verwandte Themen