2017-10-25 2 views
3

次のコードエラーでsympy積分限界エラー:例外TypeError:単項の悪いオペランドタイプ - : 'タプル'

from sympy import * 
r = Symbol('r', real=True, positive=True) 
a = Symbol('a', real=True, positive=True) 
Integral(1/r**2,(r,oo,a)).doit() 

結果

TypeError: bad operand type for unary -: 'tuple'  

-Integral(1/r**2,(r,a,oo)).doit() 

一方、上記の積分の等価定式化であるが、正しい結果を与える:-1/a

さらに、a

r = Symbol('r', real=True, positive=True) 
a = Symbol('a') 
Integral(1/r**2,(r,oo,a)).doit() 

のドメインのための制限を低下させることにも正しい結果を与えます。

sympyのバグで、これは間違っていますか?

編集: Infinityから正の値に統合することは完全に有効です。 Mathematicaは@BenTに関する私のコメントに書いたとおり、仕事を正しく行う。

答えて

2

これは不適切な積分をどのように設定するかと関係があります。 'a'を正と定義しているので、無限大から正の数へと積分することになります。これは理にかなっていません。

これは、「a」が肯定的な制約を受けていないため、3番目の例が機能する理由です。無限大から負数(3番目の例)、正数から無限大(2番目の例)、または負の無限大から正の 'a'まで、以下のように積分することができます。

from sympy import * 
r = Symbol('r', real=True, positive=True) 
a = Symbol('a', real=True, positive=True) 
Integral(1/r**2,(r,-oo,a)).doit() 

>>>-1/a 
+0

エラーは発生しましたが、非常にあいまいです。 –

+0

私は同意する、非常に直感的ではない。 – BenT

+0

@BenT:無限大から正の数に統合するのはなぜ理にかなっていないのですか?なぜこれが問題であるべきかわからない。 '-Integral(1/r ** 2、(r、a、oo))'はうまく動作し、Integral(1/r ** 2、(r、oo、a))と同等でなければなりません。さらに、Mathematica(Integrate [1/r^2、{r、Infinity、a}、 前提 - > {Element [a、Reals]、a> 0}] ')を使って積分を解くと、正しい結果。 – Finn

関連する問題