使用cdf_binomial分发核心库的最大bug ?



我对maxima很陌生,几天前我通过MacOS ARM上的brew安装了maxima。因此,我不知道我是发现了一个bug,还是一个特性,还是我在做一些愚蠢的事情。下面的示例显示了我得到的意外错误:

$ maxima
Maxima 5.46.0 https://maxima.sourceforge.io
using Lisp SBCL 2.3.3
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) load ("distrib"); 
(%o1) /opt/homebrew/Cellar/maxima/5.46.0_11/share/maxima/5.46.0/share/distrib/
distrib.mac
(%i2) cdf_binomial(4,4,p);
(%o2)                                  1
(%i3) subst( [S=3], cdf_binomial(S,4,p)); 
3    2
(%o3)                      (1 - p) (p  + p  + p + 1)
(%i4) subst( [S=4], cdf_binomial(S,4,p));
beta_incomplete: beta_incomplete(0,5,1-p) is undefined.
-- an error. To debug this try: debugmode(true);
(%i5) 

我在这里做错了什么吗?(PS:我的实际用途是在p上积分到1,这也会引发这个问题。)是否有标准的变通方法?

建议表示赞赏。

您看到的错误实际上是未求值条件表达式处理方式的微妙后果。(cdf_binomial(S, 4, p)返回一个未求值条件的例子。)一个更简单的错误示例(我将创建一个错误报告)是'(if 0 > 0 then 0/0 else inf),即使0 > 0为假,它也会遇到除以0的错误。

作为一个解决方案,尝试ev(myexpr, S = 4),其中myexpr被分配cdf_binomial(S, 4, p)返回的值。

如果S有一个赋值,那么通过ev绕路是不必要的——在这种情况下,cdf_binomial返回一个case或另一个case,并且不返回未求值的条件。当调用cdf_binomial时,S没有赋值,因此cdf_binomial不知道取哪个分支,因此返回一个未求值的条件时,需要特殊处理。

编辑:我还在研究为beta_incomplete_regularized配置一个额外的标识,用于第一个参数为零。看起来beta_incomplete_regularized(0, n, z)等于1,至少当n是整数时。我将为此寻找参考,但同时可以告诉Maxima通过tellsimp识别该身份。

(%i2) matchdeclare (nn, integerp) $             
(%i3) matchdeclare (zz, all) $
(%i4) tellsimp (beta_incomplete_regularized (0, nn, zz), 1) $
(%i5) beta_incomplete_regularized (0, 5, z);
(%o5)                           1
(%i6) load (distrib);
(%o6) /usr/local/share/maxima/branch_5_46_base_1803_g61b2abdd9/s
hare/distrib/distrib.mac
(%i7) cdf_binomial (S, 4, p);
(%o7) if S < 0 then 0 elseif S >= 4 then 1
else beta_incomplete_regularized(4 - floor(S), floor(S) + 1, 
1 - p)

现在替换为未求值的条件是可以的,因为beta_incomplete_regularized不会报错。

(%i8) subst (S = 4, %);
(%o8)      if 4 < 0 then 0 elseif 4 >= 4 then 1 else 1

字面上的不等式4 < 04 >= 4需要显式的求值(一个很长的故事,我将省略)来从它们推导出falsetrue

(%i9) ''%;
(%o9)                           1

现在对quad_qags的调用成功。

(%i10) quad_qags (subst (S = 4, cdf_binomial (S, 4, p)), p, 0, 1);
(%o10)         [1.0, 1.110223024625157e-14, 21, 0]

相关内容

  • 没有找到相关文章

最新更新