2009-12-23 10 views
4

Je commence tout juste à jouer avec SymPy et je suis un peu surpris par une partie de son comportement, par exemple ce ne sont pas les résultats que je voudrais attendre:Bases de sympy

>>> import sympy as s 
>>> (-1)**s.I == s.E**(-1* s.pi) 
False 
>>> s.I**s.I == s.exp(-s.pi/2) 
False 

Pourquoi ces soit faux et Y at-il un moyen de le convertir d'une façon d'écrire un nombre complexe à un autre?

Répondre

9

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 
0

Parce qu'ils ne sont pas égaux. Essayez celui-ci:

s.E ** (* s.I s.pi) == s.I * s.I