2011-12-19 11 views
5

次のコードは、NExpectationExpectationの異なる値を返します。 NormalDistribution[]について同じことを試してみると、NExpectationのコンバージェンスエラーが発生します(ただし、最終結果はすべてが0です)。 問題の原因は何ですか?Mathematica:NExpectationとExpectationの結果が一致しない

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]] 

出力:

-0.104154 
    0.796449 
+1

私はそれがベッセル関数の分枝切り問題であるかもしれないと思います...興味深いことに、私は 'U [x_]:= Piecewise {{{Sqrt [x]、x> = 0}、{-Sqrt '[Expectation [...]]'は明らかに間違った複雑な結果を返します: '' Expectation''は同じ値を返しますが、 -0.104154-0.104154I'である。 – Simon

+1

@Simon、それは 'Integrate'バグのようです。もし 'N @ Expectation [v [x(x)= 0}、{-Sqrt [-x]、x <0}}]'を試してみたら、 'v [x _]:= Piecewise {{{Sqrt [x]、x> = 0} ]、 x \ [分散] NormalDistribution [1.0,1。]、方法 - > "積分"] 'あなたは' -0.104154 - 0.104154 I'を得ます。メソッドを変更すると、 'N @ Expectation [v [x]、x \ [Distributed] NormalDistribution [1.0、1.]、 メソッド - >" Moment "]'は '0.796449'となります。 – kglr

+0

@kguler:ええ、私は私の元々の推測が間違っていたことに気付きました。より完全な議論のために私の答えを見てください... – Simon

答えて

2

あなたはすべての3つのメソッド数値以外の値の評価を避けるために、あなたの関数uの引数を変更した場合と同じ結果与える:と

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]]; 
{% === %% === %%%, %} 

を結果 {True、0.796449}

+1

この方法は本質的にどちらの場合でも 'NExpectation'を強制することを指摘することが重要です。 '期待値'が象徴的に評価されないときに 'N'を適用すると、' NExpectation'で使用される方法に切り替えるだけです。少なくともこれは '(N)Integrate'のような他の関数の場合です。 – Szabolcs

6

実際にはIntegrateバグです。

のは、あなたの

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

UVの両方について

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

実数を超える等価です同等

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

を定義してみましょう、分析ExpectationコマンドはMethodを使用していますオプション"Integrate"これはこのように、何それは本当にやっていることはV

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

(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)) 

積分を返し不可欠

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

ある

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

を実行することで見ることができます3210

は、同じ回答を返しますが、係数を掛けたのは1 + Iです。これは明らかにバグです。 U又はVを用い

数値積分は、0.796449の期待値を返す:

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

これはおそらく正しい解です。


編集:u[x_?NumericQ]定義が行われてから解析積分を防止するため、すべてのバージョンのkguler's answer戻り同じ値であることを理由は、そうExpectationが未評価であり、その数値を求めたときNExpectationを用いに戻り。 。


編集2: もう少し問題を分解、あなたは両方の範囲を超える

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 

を見つけ、積分は指数関数的減衰を持つ本物の、非振動です。想像上/複雑な結果は必要ありません。

最後に、上記の結果がMathematicaバージョン8.0.3で保持されることに注意してください。 バージョン7では、積分は1F1超幾何関数を返し、解析結果は数値結果と一致します。したがって、このバグ(Wolfram | Alphaに現在ある)は回帰です。

+0

はい、Integrateは異なる結果を返します:N [Integrate [U [x] PDF [正規分布[1、1]、x]、{x、-Infinity、Infinity}]]は** - 0.104154 **を返します。 NIntegrate [U [x] PDFを返します。[NormalDistribution [1,1、x]、{x、-Infinity、Infinity}]は、** 0.796449 ** – Michal

+2

を返す@Michal:うん!それは基本的に私が言ったことです。私はあなたに[バグレポートを提出する](http://www.wolfram.co.jp/support/contact/email/)をWolfram Researchに提案し、彼らの考えを見てみましょう...(PSはstackoverflowへようこそ。あなたは便利であると思います[新しいMathematicaサイトの提案](http://area51.stackexchange.com/proposals/37304/mathematica)に従ってください。) – Simon

+0

@Michal、実際には別の問題があります: 'If'と' Piecewise' 'Integrate'のような他の関数への引数として全く違った振る舞いをします。バージョン7とバージョン8の両方で、 'U [x]'関数と同じ結果が得られます。 'If​​'を' Piecewise'に変換するには、Simonの 'V [x]'または 'PiecewiseExpand @ U [x]'を使う必要があります。それ以外の場合、 'Integrate [If [cond、expr1、expr2] ...]は常に' Integrate [expr2 ...] 'を返します。 – kglr

関連する問題