2016-05-09 20 views
9

C'è un modo per verificare se due espressioni sono matematicamente uguali? Mi aspettavo che tg(x)cos(x) == sin(x) emettesse True, ma emette False. C'è un modo per fare questo confronto con sympy? Un altro esempio è (a+b)**2 == a**2 + 2*a*b + b**2 che sorprende anche come output False.Sympy - Confronto espressioni

Ho trovato alcune domande simili, ma nessuna ha coperto questo problema esatto.

risposta

9

Da the SymPy documentation

== rappresenta preciso controllo parità strutturale. "Esatto" qui significa che due espressioni verranno confrontate uguali a == solo se sono esattamente uguali strutturalmente. Qui, (x + 1)^2 e x^2 + 2x + 1 non sono gli stessi simbolicamente. Uno è il potere di un'aggiunta di due termini e l'altro è l'aggiunta di tre termini.

Si scopre che quando si utilizza SymPy come libreria, avere il test == per l'esatta uguaglianza simbolica è molto più utile che averlo rappresenta l'uguaglianza simbolica o averlo testato per l'uguaglianza matematica. Tuttavia, come nuovo utente, probabilmente ti interesserà di più a questi ultimi due. Abbiamo già visto un'alternativa a rappresentare le uguaglianze simbolicamente, l'Eq. Per verificare se due cose sono uguali, è meglio ricordare il fatto di base che se a = b, allora a-b = 0. Quindi, il modo migliore per verificare se a = b è prendere a-b e semplificarlo, e vedere se va a 0. In seguito impareremo che la funzione per farlo è chiamata simplify. Questo metodo non è infallibile - infatti, può essere teoricamente dimostrato che è impossibile determinare se due espressioni simboliche sono identicamente uguali in generale - ma per le espressioni più comuni, funziona piuttosto bene.

come demo per la vostra domanda particolare, possiamo usare la sottrazione di espressioni equivalenti e confrontare a 0 in questo modo

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

Nota se si dispone di espressioni booleane (dove le variabili 'a, b,. .. = sympy.symbols ('ab ...', boolean = True) 'e usi cose come' sympy.Or', 'sympy.Xor', ecc.) allora puoi fare' isEquivalent = lambda expr1, expr2 : sympy.simplify ((expr1 & (~ expr2)) | ((~ expr1) ed expr2)) == False' – Phylliida