Из FAQ :
Почему SymPy говорит, что два равных выражения неравны?
Оператор равенства (==) проверяет, имеют ли выражения одинаковую форму, а не являются ли они математически эквивалентными.
Чтобы сделать тестирование на равенство полезным в базовых случаях, SymPy пытается переписать математически эквивалентные выражения в каноническую форму при их оценке. Например, SymPy оценивает x + x и - (- 2 * x) в 2 * x, а x * x в x ** 2.
Простейший пример, когда преобразования по умолчанию не могут сгенерировать каноническую форму, - это нелинейные полиномы, которые могут быть представлены как в разложенном виде, так и в развернутом виде. Хотя математически ясно a(1+b) = a+ab
, SymPy дает:
>>> bool(a*(1+b) == a + a*b) False
Аналогично, SymPy не может обнаружить, что разница равна нулю:
>>> bool(a*(1+b) - (a+a*b) == 0) False
Если вы хотите определить математическую эквивалентность нетривиальных выражений, вам следует применить более сложную процедуру упрощения к обеим сторонам уравнения. В случае многочленов выражения могут быть переписаны в канонической форме путем их полного расширения. Это делается с помощью метода .expand()
в SymPy:
>>> A, B = a*(1+b), a + a*b
>>> bool(A.expand() == B.expand()) True
>>> (A - B).expand() 0
Если .expand()
не помогает, попробуйте simplify()
, trigsimp()
и т. Д., Чтобы выполнить более сложные преобразования. Например,
>>> trigsimp(cos(x)**2 + sin(x)**2) == 1 True