2011-12-19 6 views
5

codice seguente restituisce valori diversi per NExpectation e Expectation. Se provo lo stesso per NormalDistribution[] ottengo erori di convergenza per NExpectation (ma il risultato finale è ancora 0 per tutti loro). Qual è la causa del problema?Mathematica: NExpectation vs Expectation - risultati inconsistenti

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]] 

N[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1]]] 

NExpectation[U[x], x \[Distributed] NormalDistribution[1, 1]] 

uscita:

-0.104154 
    0.796449 
+1

Penso che potrebbe essere un problema di diramazione nelle funzioni di Bessel ... È interessante notare che se utilizzo 'U [x_]: = Piecewise [{{Sqrt [x], x> = 0}, {-Sqrt [-x], x <0}}] 'invece del costrutto' If', quindi 'NExpectation' fornisce lo stesso valore, ma' N [Expectation [...]] 'restituisce il risultato complesso ovviamente sbagliato:' -0.104154 - 0.104154 I'. – Simon

+1

@Simon, sembra un bug 'Integrate'. Con 'v [x _]: = Piecewise [{{Sqrt [x], x> = 0}, {-Sqrt [-x], x <0}}]', se provi 'N @ Expectation [v [x ], x \ Distributed NormalDistribution [1.0, 1.], Method -> "Integrate"] 'ottieni' -0.104154 - 0.104154 I'. Se modifichi il metodo, 'N @ Expectation [v [x], x \ [Distributed] NormalDistribution [1.0, 1.], Method ->" Moment "]' restituisce '0.796449'. – kglr

+0

@kguler: Sì, ho notato che la mia ipotesi originale non era corretta. Vedi la mia risposta per una discussione più completa ... – Simon

risposta

2

Se si modifica l'argomento della funzione u per evitare di valutazione per i valori non numerici tutti e tre i metodi dà lo stesso risultato:

u[x_?NumericQ] := If[x >= 0, Sqrt[x], -Sqrt[-x]] ; 
Expectation[u[x], x \[Distributed] NormalDistribution[1, 1]] // N; 
N[Expectation[u[x], x \[Distributed] NormalDistribution[1, 1]]] ; 
NExpectation[u[x], x \[Distributed] NormalDistribution[1, 1]]; 
{% === %% === %%%, %} 

con la risultato {true, 0,796,449 mila}

+1

È importante sottolineare qui che questo metodo essenzialmente impone l'uso di "NExpectation" in entrambi i casi. Credo che quando 'Expectation' non riesce a valutare simbolicamente, applicando un' N' ad esso si passa ai metodi usati da 'NExpectation'. Almeno questo è il caso per altre funzioni come '(N) Integrate'. – Szabolcs

6

penso che migh in realtà è un bug Integrate.

Definiamo tuo

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]] 

e l'equivalente

V[x_] := Piecewise[{{Sqrt[x], x >= 0}, {-Sqrt[-x], x < 0}}] 

che sono equivalenti sui reali

FullSimplify[U[x] - V[x], x \[Element] Reals] (* Returns 0 *) 

Per entrambi U e V, il comando analitica Expectation utilizza il Methodopzione "Integrate" questo può essere visto eseguendo

Table[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1], 
    Method -> m], {m, {"Integrate", "Moment", "Sum", "Quantile"}}] 

Così, quello che sta realmente facendo è l'integrale

Integrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}] 

che restituisce

(Sqrt[Pi] (BesselI[-(1/4), 1/4] - 3 BesselI[1/4, 1/4] + 
    BesselI[3/4, 1/4] - BesselI[5/4, 1/4]))/(4 Sqrt[2] E^(1/4)) 

L'integrale per V

Integrate[V[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}] 

dà la stessa risposta, ma moltiplicato per un fattore di 1 + I. Questo è chiaramente un bug.

L'integrale numerico utilizzando U o V restituisce il valore atteso di 0,796,449 mila:

NIntegrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}] 

Questo è presumibilmente la soluzione corretta.


Edit: La ragione per cui kguler's answer restituisce lo stesso valore per tutte le versioni è perché la definizione u[x_?NumericQ] impedisce gli integrali analitici vengano eseguite in modo Expectation è non valutata e ripristina che utilizza NExpectation quando richiesto per il suo valore numerico. .


Edit 2: Abbattere il problema un po 'di più, a trovare

In[1]:= [email protected][E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}] 
     NIntegrate[E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}] 

Out[1]= 0. - 0.261075 I 
Out[2]= 2.25748 

In[3]:= [email protected][Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}] 
     NIntegrate[Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}] 

Out[3]= 0.261075  
Out[4]= 0.261075 

su entrambe le gamme, l'integrando è reale, non oscillatorio con un decadimento esponenziale. Non ci dovrebbe essere alcun bisogno di risultati immaginari/complessi.

Infine notare che i risultati sopra riportati valgono per Mathematica versione 8.0.3. Nella versione 7, gli integrali restituiscono le funzioni ipergeometriche 1F1 e il risultato analitico corrisponde al risultato numerico. Quindi questo bug (che è presente anche in Wolfram | Alpha) è una regressione.

+0

Sì, sembra integrare restituisce risultati diversi: N [Integrare [ U [x] PDF [NormalDistribution [1, 1], x], {x, -Infinity, Infinity}]] ritorna ** - ** 0,104,154 mila, ma NIntegrate [ U [x] PDF [NormalDistribution [1, 1], x], {x, -Infinity, Infinity}] restituisce ** 0.796449 ** – Michal

+2

@Michal: Sì! Questo è fondamentalmente quello che ho detto. Vi suggerisco [inviare una segnalazione di bug] (http://www.wolfram.com/support/contact/email/) a Wolfram Research e vedere cosa pensano ... (PS Benvenuti in StackOverflow. Per favore, invertire le eventuali risposte e domande .. che trovate utili e seguire le [nuova proposta sito Mathematica] (http://area51.stackexchange.com/proposals/37304/mathematica)) – Simon

+0

@Michal, v'è in realtà un altro problema qui: '' If' e Piecewise' comportarsi in modo molto diverso come argomenti ad altre funzioni come 'Integrare'. Sia nella versione 7 che nella versione 8, otterrai gli stessi risultati con la funzione 'U [x]'. Devi usare Simon 'V [x]' o 'PiecewiseExpand @ U [x]' per convertire 'Se' in' Piecewise'. Altrimenti, 'Integrate [If [cond, expr1, expr2] ...' dà sempre 'Integrate [expr2 ...]'. – kglr

Problemi correlati