2015-05-10 12 views
6

Utilizzando la versione recente di sympy (0.7.6) ottengo il seguente risultato male nel determinare l'integrale di una funzione di supporto [0, y):integrale di funzione a tratti dà risultato errato

from sympy import * 
a,b,c,x,z = symbols("a,b,c,x,z",real = True) 
y = Symbol("y",real=True,positive=True) 
inner = Piecewise((0,(x>=y)|(x<0)|(b>c)),(a,True)) 
I = Integral(inner,(x,0,z)) 
Eq(I,I.doit()) 

http://mathurl.com/l8wrjcn.png

Questo non è corretto in quanto il risultato effettivo dovrebbe avere gli ultimi due casi scambiati. Questo può essere confermata controllando la derivata:

Derivative(I.doit(),z).doit().simplify().subs(z,x) 

http://mathurl.com/mg4zpts.png

che riduce a 0 dappertutto.

interessante notare che quando far cadere la condizione (b>c) sostituendo inner = Piecewise((0,(x>=y)|(x<0)),(a,True)) ottengo un TypeError:

TypeError: cannot determine truth value of 
-oo < y 

sto utilizzando la libreria in modo non corretto o si tratta in realtà di un grave bug sympy?

risposta

4

Sì, sympy 0.7.6 è errato in questo caso e in alcuni altri casi simili. In generale, non conosco pacchetti simbolici di matematica che mi piacerebbe fare calcoli con funzioni definite a tratti.

Nota che, anche se

inner = Piecewise((0, (x>=y)|(x<0)), (a,True)) 

getta una TypeError al tempo di integrazione, una definizione logicamente equivalenti

inner = Piecewise((a, (x<y)&(x>=0)), (0,True)) 

porta al risultato corretto

Piecewise((a*z, And(z < y, z >= 0)), (0, And(z <= 0, z >= -oo)), (a*y, True)) 

Tra l'altro, il precedente versione, sympy 0.7.5, gestisce

inner = Piecewise((0, (x>=y)|(x<0)), (a,True)) 

senza TypeError, produce il risultato corretto (in una forma diversa):

Piecewise((0, z <= 0), (a*y, z >= y), (a*z, True)) 

Ecco un altro, più semplice esempio di comportamento buggy:

>>> Integral(Piecewise((1,(x<1)|(z<x)), (0,True)) ,(x,0,2)).doit() 
-Max(0, Min(2, Max(0, z))) + 3 

>>> Integral(Piecewise((1,(x<1)|(x>z)), (0,True)) ,(x,0,2)).doit() 
-Max(0, Min(2, Max(1, z))) + 3 

La prima il risultato è errato (non riesce per z = 0, ad esempio). Il secondo è corretto L'unica differenza tra due formule è z<x rispetto a x>z.

+0

Grazie, questo conferma il mio sospetto. Qualche idea sul perché i pacchetti simbolici di matematica si dibattano così tanto con funzioni definite a tratti? Credo che sia solo questione di dividere l'integrale e scegliere i giusti limiti di integrazione. Non dovrebbe sympy sollevare un NotImplementedError su funzioni a tratti se questo è noto comportamento buggy? – Lars

+0

Non conosco interni di sympy. So solo empiricamente che CAS lotta con queste cose, ad esempio [Wolfram Alpha] (http://www.wolframalpha.com/input/?i=integral+abs%28sin%28x%29%29) ottiene l'integrale indefinito di | sin x | sbagliato. Se hai accesso a Maple o Mathematica (al momento non lo faccio), potresti voler confrontare il risultato con il loro. –

+0

In realtà, il risultato che ottengo da wolfram alfa è -cos (x) sign (sin (x)) + c, che è la corretta antiderivata (nota che nel caso definito c deve aumentare di 2 per ogni mezzo- periodo). – Lars

Problemi correlati