gpt4 book ai didi

python - scipy.special.erf 使用 0.j 引发运行时警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:32:49 24 4
gpt4 key购买 nike

>>> from scipy.special import erf
>>> print (erf(0.j))
__main__:1: RuntimeWarning: invalid value encountered in erf
0j

此警告只打印一次(即使我执行了 scipy.special.errprint(0)),但我完全不明白为什么要打印它。真的,0.j0. 是同一个数字,而且它没有问题。

我想有两个问题:1)有没有办法抑制这个警告?2) 这个警告是错误,还是我遗漏了什么?

更新

我(认为我)在 scipy 源代码树中追踪了错误函数。它位于:scipy/special/specfun/specfun.f(subroutine CERROR)。此函数不会引发警告(从简单的 Fortran 程序调用时它工作正常)。

最佳答案

您可以使用 numpy.seterr 关闭警告:

    numpy.seterr(invalid='ignore')

0.j0. 不同。前者是一个复数,后者只是一个 float 。

>>> type(0.j)
<class 'complex'>
>>> type(0.)
<class 'float'>

复杂的erf和真实的erf使用不同的算法,例如

>>> erf(complex(1))
(0.84270079294971512+0j)
>>> erf(1)
0.84270079294971478

由于real erf和complex erf使用不同的算法,所以complex erf中的一些警告在real erf中不会出现。如果我们检查 Fortran implementation ,我们会发现:

    SUBROUTINE CERROR(Z,CER)
C ...
Z1=Z
C ...
CS=Z1
CR=Z1
DO 10 K=1,120
CR=CR*Z1*Z1/(K+0.5D0)
CS=CS+CR
IF (CDABS(CR/CS).LT.1.0D-15) GO TO 15
10 CONTINUE

特别地,Z = 0 + 0j,所以 Z1 = 0 + 0j,所以循环前 CS = CR = 0 + 0j。在循环的第一次迭代中,我们得到:

  • CR ← CR × Z12/(K + 0.5) = 0 + 0j
  • CS ← CS + CR = 0 + 0j

然后条件需要 CR/CS,这是一个 0/​​0,这是一个无效的浮点运算,因此是警告。

这是一个小问题,可以通过在开始时检查 Z == 0 来轻松“修复”。你可以 report a bug如果您发现这种行为不稳定。

关于python - scipy.special.erf 使用 0.j 引发运行时警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com