2016-04-20 8 views
2

Ich muss Dirac Delta in einem komplizierten Integral verwenden und hoffte zu sehen, wie es mit einem einfachen Fall funktioniert, aber es gibt die falsche Antwort zurück. Irgendeine Ahnung, was ich im folgenden falsch gemacht habe?DiracDelta gibt kein korrektes Ergebnis

from sympy import DiracDelta 
from scipy import integrate 

def f(x): 
    return x*DiracDelta(x-1) 

b, err = integrate.quad(f, 0, 5)  
print b 

Dies gibt 0.0 während es nicht sollte.

+0

einverstanden sind, soll die Antwort sein, die Fläche unter der Funktion Delta Null ist und konzentriert um x = 1, wobei der Vervielfacher x ist nicht etwas zu ändern . – roadrunner66

Antwort

5

Es scheint sympy Funktionen sind nicht kompatibel mit scipy integrieren. Man muss sympy integrieren. Im Folgenden finden Sie die richtige Antwort

from sympy import * 
x = Symbol('x') 
print integrate(x*DiracDelta(x-1), (x, 0, 5.0))  

Obwohl, ich bin nicht sicher, ob sympy.integrate so mächtig und vielseitig wie scipy.integrate.

+1

** Symbolische ** Integration (durch Sympy) und ** numerische ** Integration (durch scipy) sind sehr unterschiedliche Dinge. Ein abstraktes Objekt wie DiracDelta in eine numerische Integrationsroutine zu stecken, ist wie das Einstecken von Fingern in eine Steckdose; das Ding gehört einfach nicht dorthin. –

+1

Ah, schlag mich dazu. Im Grunde genommen ist die Integration von scipy eine * numerische * Integration und spielt im Allgemeinen nicht gut mit sympy zusammen, umso mehr, wenn wir etwas so Eigenartiges wie die Delta "Funktion" haben. – DSM

+0

@DSM Ihre Antwort war besser, bitte rückgängig machen. –

1

HuShus Antwort ist korrekt. Ich füge hinzu, dass die Dirac δ-Funktion eine symbolische Methode ist, die Funktionsbewertung als Integral darzustellen. Es ist nützlich als eine symbolische Abstraktion, aber wenn Sie nur auf numerische Auswertung achten, tun Sie einfach die Funktion Auswertung. Das heißt, anstatt

b 
⌠ 
⎮ f(x)⋅DiracDelta(x - 1) dx 
⌡ 
a 

verwendet nur

f(1) if a <= 1 <= b else 0