私はSymPyを使い始めたばかりで、その動作のいくつかに少し驚いています。たとえば、これは私が期待する結果ではありません。
>>> import sympy as s
>>> (-1)**s.I == s.E**(-1* s.pi)
False
>>> s.I**s.I == s.exp(-s.pi/2)
False
これらが False を返すのはなぜですか? また、複素数の書き方を別の書き方に変換する方法はありますか?
よくある質問から:
SymPy が 2 つの等しい式が等しくないと言うのはなぜですか?
等値演算子 (==) は、式が数学的に等しいかどうかではなく、式が同じかどうかをテストします。
基本的なケースで同等性テストを有効にするために、SymPy は、数学的に同等の式を評価するときに正規の形式に書き直そうとします。たとえば、SymPy は x+x と -(-2*x) の両方を 2*x に評価し、x*x を x**2 に評価します。
デフォルトの変換が標準形式を生成できない最も単純な例は、因数分解された形式と展開された形式の両方で表すことができる非線形多項式の場合です。数学的には明らかa(1+b) = a+ab
ですが、SymPy は次のようになります。
>>> bool(a*(1+b) == a + a*b) False
同様に、SymPy は差がゼロであることを検出できません。
>>> bool(a*(1+b) - (a+a*b) == 0) False
重要な式の数学的な等価性を判断したい場合は、方程式の両側に、より高度な単純化ルーチンを適用する必要があります。多項式の場合、式を完全に展開することで正規形に書き直すことができます。これは.expand()
、SymPy のメソッドを使用して行われます。
>>> A, B = a*(1+b), a + a*b
>>> bool(A.expand() == B.expand()) True
>>> (A - B).expand() 0
.expand()
解決しない場合はsimplify()
、trigsimp()
、 などを試して、より高度な変換を試みます。例えば、
>>> trigsimp(cos(x)**2 + sin(x)**2) == 1 True
彼らは平等ではないからです。これを試してください:
sE**(sI* s.pi)== sI*sI