Проблема с Python-Sympy при проверке равенства выражений при оценке = False - PullRequest
2 голосов
/ 10 ноября 2011

В моем проекте мне нужно использовать evaluate=false в то время, когда я создаю любые Add или Mul объекты. В этом случае я сталкиваюсь с проблемой, когда применяю проверки равенства к этим объектам. Проблема заключается в упорядочении аргументов.

Пожалуйста, рассмотрите пример ниже:

k2=Mul(*[x,y,2],evaluate=False)
k1=Mul(*[x,2,y],evaluate=False)
print k1==k2 

Результат равен false, поскольку k2.args равны (x,y,2), а k1.args равны (x,2,y). Таким образом, в то время как сравнение проверяет равенство кортежей, оно возвращает false. Есть ли способ получить желаемый результат?

Кроме того, если я наложу некоторую операцию на кортежи (например, изменим порядок и затем проверим), произойдет сбой в случаях, когда k1 и k2 сформированы из различных объектов Mul (например, когда k1.args = 2*x,y и k2.args = 2*y,x)

Я не могу использовать сортировку, так как в этом случае Add([x+y,z],evaluate=False) и Add([x+z,y],evaluate=False) будут двумя различными выражениями. Также, если я использую evalaute=True, в этом случае Add([x+y],x]) и Add([2*x+y]) будут одинаковыми, чего я не хочу.

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Мул не знает, что x и y оба представляют скаляры.Умножение матриц зависит от порядка аргументов, поэтому в вашем примере k1 и k2 не обязательно равны.Если вы знаете, что в вашей программе x и y всегда будут скалярами (или каким-либо другим типом значений, где умножение является коммутативным и ассоциативным), возможно, существует способ выделить константы из каждого термина, сравнить константы и сравнить отсортированный списокусловий.

0 голосов
/ 12 ноября 2011

Найден один обходной путь.

в классах Add / Mul при формировании выражения сглаживают все аргументы, используя приведенный ниже код

   flatten_args = []
            for arg in args:
                if (arg.__class__==cls):
                    flatten_args.extend(arg.args)
                else:
                    flatten_args.append(arg)

            obj = Expr.__new__(cls, *flatten_args) 

, а во время проверки на равенство я ставлю одиндополнительная проверка сначала сортирует список аргументов arg_list.sort(), а затем сравнивает два списка

0 голосов
/ 11 ноября 2011

Помогает ли вам следующее?

print simplify(k1 - k2) == 0 # True
print k1 == k2 # Still False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...