公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+3 投票
2.9k 浏览
Clear["Global`*"]
y = {3.8396, 7.2040, 0.0, 0.0, 4.4132, 8.0230, 5.7971, 7.0828, 0.0, 
   0.80260, 13.0670, 4.3211, 0.0, 8.6801, 5.4571, 0.0, 8.1021, 0.0, 
   1.2526, 5.6016};
formula = (\[Mu] + \[Sigma] InverseCDF[NormalDistribution[], 
      Count[y, 0.0]/Length[y]])^2 + (Mean@
      Exp[Select[y, # > 0.0 &]] CDF[
      NormalDistribution[], \[Mu]/\[Sigma]] - 
    Exp[\[Mu] + \[Sigma]^2/2]*
     CDF[NormalDistribution[], \[Sigma] - (0 - \[Mu])/\[Sigma]]/(
     1 - CDF[NormalDistribution[], (0 - \[Mu])/\[Sigma]]))^2

(*it cant*)
Plot3D[Evaluate@formula, {\[Mu], 0, 5}, {\[Sigma], 0, 5}]
(*Show 
Throw::sysexc: Uncaught SystemException returned to top level. Can be caught with Catch[\[Ellipsis], _SystemException]. >>
SystemException["MemoryAllocationFailure"]
*)
(*not work*)
Plot[formula /. \[Mu] -> 1, {\[Sigma], 0, 3}]
(*work*)
Plot[formula /. \[Sigma] -> 1, {\[Mu], 0, 3}]

 

这不是许多数据,这不过用到了CDF。很费解出现这样的情况

用户: flumer (161 分)

2 个回答

+7 投票
 
已采纳

一个更加简单地重现你所说的问题的方法:

Erfc[10^5.]
1 - %

如果你没对Mathematica做内存控制就别随便执行上面这行……

这个问题的本质和这帖说的是一样的:http://mathematica.stackexchange.com/a/25668/1871

简单地说就是Mathematica的某些代数函数在计算非常接近0的值时,即使输入值的精度是MachinePrecision,它也会自动启动任意精度计算。你用Exp也可以弄出这个问题来:

1 - Exp[-10^10.]

解决方法那帖里也讲了:

SetSystemOptions["CatchMachineUnderflow" -> False]

或者怕不保险就再局部化一下什么的,这里不多说。其实,这里真正有意思的是:你们用的都是版本10吧?我的版本9.0.1在用你那三行代码画图时不会出现你的问题,Plot3D和Plot都在采样时做出了足够聪明的选择,避开了会引发问题的极端数据。之前好像看到人说WRI正在对MMA的画图功能做某种升级(改用OpenGL?)因此导致了一些BUG,这个问题搞不好也是其中之一。

LZ有兴趣不妨把这事捅到SE去。

用户: xzczd (2.2k 分)
采纳于 用户:flumer
嗷!我使用的确实是10.4英文版。当加上SetSystemOptions["CatchMachineUnderflow" -> False]
确实画出了图
+2 投票

观察发现是因为sigma很小的时候,计算单个点就会出现占用巨大内存导致kernel崩溃现象。比如

formula /. {\[Mu] -> 1, \[Sigma] -> 0.00001}

就已经开始长时间计算了并且占用巨大内存。要是想画图的话把sigma下限改成0.01或者0.001都能在合理的时间内算出来。

具体原因的解释还是另请高明吧。

用户: happyfish (1.8k 分)
修改于 用户:happyfish
这确实是一种可行的方法:)
...