我对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 < 0
和4 >= 4
需要显式的求值(一个很长的故事,我将省略)来从它们推导出false
和true
。
(%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]