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

この警告は(私が行ったとしてもscipy.special.errprint(0))一度だけ印刷されますが、なぜ印刷されるのかまったくわかりません。実は、0.jと同じ番号で0.問題ありません。

2つの質問があると思います:1)この警告を抑制する方法はありますか?2)この警告はバグですか、それとも何かが足りませんか?

アップデート

私は(私が思うに)scipyソースツリーのエラー関数を追跡しました。にあります:( scipy/special/specfun/specfun.fsubroutine CERROR。この関数は警告を発しません(単純なFortranプログラムから呼び出された場合は正常に機能します)。

4

1 に答える 1

1

警告をオフにするにはnumpy.seterr

    numpy.seterr(invalid='ignore')

0.jと同じではありません0.。前者は複素数であり、後者は単なる浮動小数点数です。

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

複雑なerfと実際のerfは、異なるアルゴリズムを使用します。

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

実際のerfと複雑なerfは異なるアルゴリズムを使用するため、複雑なerfの一部の警告は実際のerfには表示されません。Fortranの実装を確認すると、次のことがわかります。

    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かどうかを確認することで簡単に「修正」できます。この動作が不安定な場合は、バグを報告できます。

于 2012-07-12T14:01:17.020 に答える