De l'FAQ:
Pourquoi sympy dire que deux expressions égales sont inégales?
L'opérateur d'égalité (==) teste si les expressions ont une forme identique, et non si elles sont mathématiquement équivalentes.
Pour rendre les tests d'égalité utiles dans les cas de base, SymPy tente de réécrire des expressions mathématiquement équivalentes à une forme canonique lors de leur évaluation. Par exemple, SymPy évalue à la fois x + x et - (- 2 * x) à 2 * x et x * x à x ** 2.
L'exemple le plus simple où les transformations par défaut ne parviennent pas à générer une forme canonique concerne les polynômes non linéaires, qui peuvent être représentés à la fois sous forme factorisée et sous forme étendue. Bien que clairement a(1+b) = a+ab
mathématiquement, sympy donne:
>>> bool(a*(1+b) == a + a*b) False
De même, sympy ne détecte que la différence est égale à zéro:
>>> bool(a*(1+b) - (a+a*b) == 0) False
Si vous souhaitez déterminer l'équivalence mathématique des expressions non triviaux, vous devez appliquer une routine de simplification plus avancée des deux côtés de l'équation. Dans le cas des polynômes, les expressions peuvent être réécrites sous une forme canonique en les développant complètement. Cela se fait selon la méthode .expand()
dans sympy:
>>> A, B = a*(1+b), a + a*b
>>> bool(A.expand() == B.expand()) True
>>> (A - B).expand() 0
Si .expand()
ne fonctionne pas, essayez simplify()
, trigsimp()
, etc, qui tentent des transformations plus avancées. Par exemple,
>>> trigsimp(cos(x)**2 + sin(x)**2) == 1 True