2016-05-09 10 views
9

Czy istnieje sposób sprawdzenia, czy dwa wyrażenia są matematycznie równe? Oczekiwalem, ze tg(x)cos(x) == sin(x) wyjdzie True, ale wyjdzie False. Czy istnieje sposób dokonywania takich porównań z sympy? Innym przykładem jest (a+b)**2 == a**2 + 2*a*b + b**2, który zaskakująco również wyprowadza False.Sympy - Porównywanie wyrażeń

Znalazłem kilka podobnych pytań, ale żaden z nich nie obejmował dokładnie tego problemu.

Odpowiedz

9

Od the SymPy documentation

== reprezentuje dokładny test równości strukturalnej. "Dokładny" oznacza tutaj, że dwa wyrażenia będą porównywane z równością == tylko wtedy, gdy będą dokładnie równe strukturalnie. Tutaj (x + 1)^2 i x^2 + 2x + 1 nie są takie same symbolicznie. Jednym jest moc dodania dwóch terminów, a druga to dodanie trzech terminów.

Okazuje się, że przy używaniu SymPy jako biblioteki, posiadanie testu == dla dokładnej symbolicznej równości jest o wiele bardziej użyteczne niż to, że reprezentuje symboliczną równość, czy też ma test matematycznej równości. Jednak jako nowy użytkownik prawdopodobnie będziesz bardziej dbać o te dwa ostatnie. Widzieliśmy już alternatywę symbolicznego reprezentowania równości, Eq. Aby sprawdzić, czy dwie rzeczy są sobie równe, najlepiej jest przypomnieć sobie podstawowy fakt, że jeśli a = b, to a-b = 0. Zatem najlepszym sposobem sprawdzenia, czy a = b ma wziąć a-b i uprościć go, i sprawdzić, czy idzie do 0. Później dowiemy się, że funkcja ta ma nazwę simplify. Ta metoda nie jest nieomylna - w rzeczywistości można teoretycznie udowodnić, że niemożliwe jest ustalenie, czy dwa wyrażenia symboliczne są identyczne w ogólności - ale w przypadku większości popularnych wyrażeń działa całkiem dobrze.

jako demo dla danej kwestii, możemy użyć odejmowanie równoważnych wyrażeń i porównać do 0 jak tak

>>> 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 
+0

UWAGA Jeśli masz wyrażeń logicznych (gdzie zmienne 'a, b,. .. = sympy.symbols ('ab ...', boolean = True) 'i używasz rzeczy takich jak' sympy.Or', 'sympy.Xor', itp.), wtedy możesz zrobić' isEquivalent = lambda expr1, expr2 : sympy.simplify ((wyrażenie1 i (~ wyrażenie2)) | ((~ wyrażenie1) i wyrażenie2)) == Fałsz' – Phylliida