web-dev-qa-db-ja.com

Sympy-式の比較

2つの式が数学的に等しいかどうかを確認する方法はありますか? tg(x)cos(x) == sin(x)Trueを出力することを期待していましたが、Falseを出力します。 sympyとそのような比較をする方法はありますか?別の例は(a+b)**2 == a**2 + 2*a*b + b**2これは驚くべきことにFalseも出力します。

私はいくつかの同様の質問を見つけましたが、この正確な問題をカバーしたものはありませんでした。

20
Xico Sim

から SymPyドキュメント

_==_は、正確な構造的同等性テストを表します。ここでの「正確」とは、2つの式が構造的に完全に等しい場合にのみ、==と等しいと比較されることを意味します。ここで、(x + 1)^ 2とx ^ 2 + 2x +1はシンボリックに同じではありません。 1つは2つの項の加算の力であり、もう1つは3つの項の加算です。

SymPyをライブラリとして使用する場合、正確な記号の同等性を_==_テストする方が、記号の同等性を表す、または数学的な同等性をテストするよりもはるかに便利であることがわかります。ただし、新しいユーザーとしては、おそらく後者の2つについてもっと気にするでしょう。等式を象徴的に表す代わりの方法はすでに見てきました。 2つのものが等しいかどうかをテストするには、a = bの場合、a-b = 0であるという基本的な事実を思い出すのが最善です。したがって、a = bかどうかを確認する最良の方法は、a-bを取得して単純化し、0になるかどうかを確認することです。これを行う関数は simplify と呼ばれることを後で学習します。この方法は絶対的なものではありません。実際、2つの記号式が一般に同じであるかどうかを判断することは理論的に不可能ですが、ほとんどの一般的な式では非常にうまく機能します。

あなたの特定の質問のデモとして、同等の式の減算を使用して、0と比較することができます。

_>>> from sympy import simplify
>>> from sympy.abc import x,y
>>> vers1 = (x+y)**2
>>> vers2 = x**2 + 2*x*y + y**2
>>> simplify(vers1-vers2) == 0
True
>>> simplify(vers1+vers2) == 0
False
_
17
miradulo