2016-04-17 15 views
3

Ich habe scipy und die Kernpakete von scipy für ein Mathematikprojekt erforscht.Wie erstellt man einen mathematischen Ausdruck in scipy?

Ich muss Kalkül Operationen auf einige Gleichungen zu tun ... so zum Lernen scipy habe ich beschlossen, eine einfache Gleichung (PDF of a normal random variable) zu testen. Ich muss die Konstanten so belassen, wie sie während der Rechenoperationen sind ... und ihr keinen Wert zuweisen.

Ich konnte es erfolgreich mit Sympy erstellen. Hier ist der Code:

from sympy import * 

x = Symbol('x') 
mu = Symbol('mu') 
sigma = Symbol('sigma') 

def normpdfeqn(): 
    y = exp(-(((x-mu)**2))/(2*(sigma**2)))/(sqrt(2*pi*(sigma**2))) 
    return y 

print(integrate(normpdfeqn(), (x))) 

und bekam eine richtige Ausgabe:

sigma*erf(sqrt(2)*(-mu + x)/(2*sigma))/(2*sqrt(sigma**2))

Dann habe ich versucht, mit scipy das Gleiche zu tun.

Ich habe gelesen http://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html aber konnte nicht herausfinden, wie man die Gleichung dafür erstellt. Hier ist, was ich versucht habe, bis jetzt (es ist fast das gleiche wie der oben genannte Code):

from sympy import exp 
from sympy import sqrt 
from sympy import pi 
from scipy.integrate import quad 
from sympy import Symbol 
x = Symbol('x') 
mu = Symbol('mu') 
sigma = Symbol('sigma') 

def integrand(): 
    y = exp(-((x-mu)**2)/(2*(sigma**2)))/(sqrt(2*pi*(sigma**2))) 
    return y 


I = quad(integrand(), 0, 1,) 
print(I) 

Der Code könnte noch lange nicht abgeschlossen sein, ich weiß nicht, wie es zum Laufen zu bringen.

Wenn ich immer mit Gleichungen arbeiten würde, die ich oben gezeigt habe, sollte ich mich bemühen zu lernen, scipy integrieren? Oder benutze weiterhin sympy und numpy?

+2

Wenn Sie * symbolische * Operationen tun mögen, sollten Sie sympy verwenden. Scipy macht * numerische * Operationen. – BrenBarn

+0

@BrenBarn also, ich erstelle meine Gleichungen mit sympy und dann Lambdify (oder es war eine andere Funktion, konnte mich nicht erinnern) sie die eqn mit numpy oder scipy verwenden ... wäre dieser Workflow in Ordnung? – vicky96

+0

Sehr interessant. Die meisten Menschen trennen die beiden Bemühungen, weil sich ihre Gleichungen nicht oft ändern. Aber Sie beabsichtigen, eine analytische Eingabe zu machen, dann macht der Code zuerst die analytische Analyse (ohne Aufsicht) und berechnet dann numerische Ergebnisse? Dies könnte ehrgeizig sein. Ich mag das. – roadrunner66

Antwort

1

Dieser vereinfachte Code könnte ein Schritt in Richtung Ihrer Ziele sein:

es eine Funktion, hier eine quadratische, die Dinge so einfach wie möglich und wertet seine geschlossene Form Integral (mit sympy) Dann

nimmt numerisch wird der Integralwert zwischen 0 und 3 mit Hilfe von scipy ausgewertet.

Und die geschlossene Form integral mit den gleichen Grenzen mit sympy.

Es ist ein bisschen ein Prototyp, aber scheint zu tun, was Sie benötigen.

from sympy import * 
from scipy.integrate import quad 

x = Symbol('x') 

def func(): 
    y = x**2 + 2*x +3 
    return y 

def integrand(expr): 
    y = lambda x: eval(expr) 
    return y 


y = repr(func())    # a str representation of the original function 

res = integrate(func(), (x)) # a sympy representation of the closed form integral 
          # of the original function 

I = quad(integrand(y), 0, 3) # a scipy numerical integration of the original function 

print(y)  # sympy repr of original function 
print(I)  # scipy numerical integration of the original function 
print() 
print(res)  # sympy repr of closed form integral of original function 
print(integrand(repr(res))(3) - integrand(repr(res))(0)) # closed form integer evaluation 

resultierender Ausgang:

x**2 + 2*x + 3 
(27.0, 2.9976021664879227e-13) 

x**3/3 + x**2 + 3*x 
27.0 
Verwandte Themen