Mathematica:NExpectation vs Expectation - 结果不一致

Mic*_*hal 5 wolfram-mathematica

下面的代码返回不同的值NExpectationExpectation.如果我尝试相同的,NormalDistribution[]我会得到收敛错误NExpectation(但最终的结果仍然0适用于所有这些).是什么导致了这个问题?

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]]
Run Code Online (Sandbox Code Playgroud)

输出:

    -0.104154
     0.796449
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 6

我认为它可能实际上是一个Integrate错误.

让我们来定义你的

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]
Run Code Online (Sandbox Code Playgroud)

等同的

V[x_] := Piecewise[{{Sqrt[x], x >= 0}, {-Sqrt[-x], x < 0}}]
Run Code Online (Sandbox Code Playgroud)

这相当于实数

FullSimplify[U[x] - V[x], x \[Element] Reals] (* Returns 0 *)
Run Code Online (Sandbox Code Playgroud)

对于两者UV,分析Expectation命令使用可以通过运行看到的Method选项"Integrate"

Table[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1], 
  Method -> m], {m, {"Integrate", "Moment", "Sum", "Quantile"}}]
Run Code Online (Sandbox Code Playgroud)

因此,它真正做的是积分

Integrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]
Run Code Online (Sandbox Code Playgroud)

返回

(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))
Run Code Online (Sandbox Code Playgroud)

积分 V

Integrate[V[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]
Run Code Online (Sandbox Code Playgroud)

给出相同的答案但乘以系数1 + I.这显然是一个错误.

数值积分使用UV返回预期值0.796449:

NIntegrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]
Run Code Online (Sandbox Code Playgroud)

这可能是正确的解决方案.


编辑:kguler的答案为所有版本返回相同值 的原因是因为该u[x_?NumericQ]定义阻止了分析积分的执行,因此未被Expectation评估并NExpectation在被要求其数值时恢复使用.


编辑2: 更多地解决问题,你会发现

In[1]:= N@Integrate[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]:= N@Integrate[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
Run Code Online (Sandbox Code Playgroud)

在两个范围内,被积函数是真实的,非振荡的,具有指数衰减.不应该有任何想象/复杂的结果.

最后请注意,上述结果适用于Mathematica版本8.0.3.在版本7中,积分返回1F1超几何函数,分析结果与数值结果匹配.所以这个bug(目前也存在于Wolfram | Alpha中)是一个回归.

  • @Michal:是的!这基本上就是我所说的.我建议你[提交错误报告](http://www.wolfram.com/support/contact/email/)给Wolfram Research看看他们的想法......(PS欢迎来到stackoverflow.请提出任何答案和问题你觉得很有用.请按照[新的Mathematica网站提案](http://area51.stackexchange.com/proposals/37304/mathematica).) (2认同)

kgl*_*glr 2

如果您更改函数的参数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]];
{% === %% === %%%, %}
Run Code Online (Sandbox Code Playgroud)

结果为 {True, 0.796449}