Mic*_*hal 5 wolfram-mathematica
下面的代码返回不同的值NExpectation和Expectation.如果我尝试相同的,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)
我认为它可能实际上是一个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)
对于两者U和V,分析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.这显然是一个错误.
数值积分使用U或V返回预期值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中)是一个回归.
如果您更改函数的参数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}