Wolfram mathematica Mathematica:Nexpection vs Expection-结果不一致

Wolfram mathematica Mathematica:Nexpection vs Expection-结果不一致,wolfram-mathematica,Wolfram Mathematica,以下代码为NExpectation和Expectation返回不同的值。 如果我对正态分布[]尝试同样的方法,我会得到nexpection的收敛EROR(但最终结果仍然是0)。 是什么导致了问题 U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]] N[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1]]] NExpectation[U[x], x \[Distributed] NormalD

以下代码为
NExpectation
Expectation
返回不同的值。 如果我对
正态分布[]
尝试同样的方法,我会得到
nexpection
的收敛EROR(但最终结果仍然是
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]]
输出:

    -0.104154
     0.796449

如果更改函数的参数
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}

我认为这实际上可能是一个
Integrate
bug

让我们定义您的

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]
和等价物

V[x_] := Piecewise[{{Sqrt[x], x >= 0}, {-Sqrt[-x], x < 0}}]
对于
U
V
,分析
预期
命令使用
方法
选项
“集成”
,这可以通过运行

Table[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1], 
  Method -> m], {m, {"Integrate", "Moment", "Sum", "Quantile"}}]
因此,它真正做的是积分

Integrate[U[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))
V的积分

Integrate[V[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]
给出相同的答案,但乘以系数
1+I
。这显然是一个错误

使用
U
V
的数值积分返回预期值0.796449:

NIntegrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]
这大概是正确的解决方案


编辑:所有版本返回相同值的原因是
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
在这两个范围内,被积函数都是实的,非振荡的,具有指数衰减。不需要任何想象/复杂的结果

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

我认为这可能是贝塞尔函数中的分支切割问题。。。有趣的是,如果我使用
U[x_]:=分段[{{Sqrt[x],x>=0},{-Sqrt[-x],x<0}}]
而不是
if
构造,那么
NExpectation
给出了相同的值,但是
N[Expectation[…]
返回了明显错误的复杂结果:
-0.104154-0.104154 I
@Simon,它看起来像是一个
Integrate
bug。如果您尝试
N@Expectation[v[x],x\[Distributed]正态分布[1.0,1.],方法->“积分”
得到
-0.104154-0.104154 I
。如果更改方法,
N@Expectation[v[x],x\[Distributed]正态分布[1.0,1.],方法->“矩”
给出
0.796449
@kguler:是的,我注意到我最初的猜测不太正确。关于更完整的讨论,请参见我的答案……是的,看起来Integrate返回不同的结果:N[Integrate[U[x]PDF[NormalDistribution[1,1,x],{x,-无穷大,无穷大]]返回-0.104154,但NIntegrate[U[x]PDF[NormalDistribution[1,1,x],{x,-无穷大,无穷大]返回0。796449@Michal:是的!我基本上就是这么说的。我建议你去Wolfram研究看看他们怎么想。。。(另请注意,欢迎来到stackoverflow。请对任何您认为有用的答案和问题进行投票。并遵循。)@Michal,这里实际上还有另一个问题:
If
分段
作为其他函数(如
Integrate
的参数)的行为非常不同。在版本7和版本8中,使用函数
U[x]
将获得相同的结果。您需要使用Simon的
V[x]
PiecewiseExpand@U[x] 
If
转换为
分段
。否则,
Integrate[If[cond,expr1,expr2]…
总是给出
Integrate[expr2…]
。这里需要指出的是,这种方法本质上强制在这两种情况下使用
nexpection
。我相信当
期望值
无法进行象征性评估时,对其应用
N
只会切换到
nexpection
所使用的方法。至少对于其他函数,如e
(N)集成
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