2013-08-29 2 views
0

Я использую решатель Sympy (версия 0.7.3, Python 2.7.5, Mac OS X) для решения некоторых матричных уравнений, и я столкнулся с непоследовательным поведением, которое портит все мои результаты. Если быть точным, результат, похоже, зависит от порядка уравнений, которые должны быть решены.Sympy - непредсказуемое поведение Solver

Минимальный рабочий пример производится с помощью следующего кода:

from sympy import * 
axx, bxx, byy = symbols('axx bxx byy') 

Эта команда

solve([axx - bxx, byy]) 

дает {axx: bxx, byy: 0} как результат, в то время как переключение порядок уравнений

solve([byy, axx - bxx]) 

дает {byy: 0, bxx: axx}, что, конечно, математическое LY то же самое, но имеет значение при применении этого решения, используя subs функцию SymPy, то есть:

axx.subs({byy: 0, bxx: axx}) 

возвращает axx, в то время как

axx.subs({axx: bxx, byy: 0}) 

возвращает bxx, который, очевидно, может вызвать много проблем в последующих расчетах.

Буду признателен, если сообщу мне, как заставить SymPy вести себя последовательно. Меня не волнует, если результат {axx: bxx} или {bxx: axx}, но он должен быть таким же, независимо от того, в каком порядке я передаю уравнения.

+0

Есть дополнительные аргументы, которые вы можете предоставить 'solve', чтобы указать, что вы хотите решить. Проверьте примеры в docstring. – Krastanov

+0

Я уже пробовал это, но если бы я включил все символы, то есть 'решать ([axx - bxx, byy], [axx, bxx, byy])', что я должен в моем случае, тогда вывод одинаков. – m4r73n

+1

Почему вы включаете все символы?Включите символ, который вы хотите решить для решения: 'solve ([x, yz], [x, y])' – Krastanov

ответ

-1

Использование manual=True, кажется, решает мою проблему, хотя я понятия не имею, почему.

documentation говорит

«ручное = True (по умолчанию False)»

не использовать метод полигонов/матрицы решить систему уравнений, решать их по одному за раз, как вы может «вручную».

что бы это ни значило.

Однако solve([axx - bxx, byy], manual = True) и solve([axx - bxx, byy], manual = True) оба дают одинаковый результат.

+0

Это просто совпадение. В будущем алгоритм может фактически измениться и дать другой ответ. – Krastanov

3

Как отметил Крастанов, передайте второй аргумент для решения, в котором говорится, для каких символов нужно решать. Например, если вы хотите, то с точки зрения b переменных, сделать

In [48]: solve([axx - bxx, byy], [bxx, byy]) 
Out[48]: {bxx: axx, byy: 0} 

In [49]: solve([byy, axx - bxx], [bxx, byy]) 
Out[49]: {bxx: axx, byy: 0} 

Если вы не сделаете этого, он будет только догадываться, и, как вы обнаружили, догадка произвольно и может зависеть от вещей как порядок уравнений или даже имена символов.

+0

Это решение не работает для меня. Возьмем, например: 'solve ([bxx-axx, byy-axx])', который дает желаемый результат: 'bxx = byy'. Но разрешая Sympy решать 'solve ([bxx-axx, byy-axx], [bxx, byy])' only возвращает '{byy: axx, bxx: axx}'. Это правильный результат, но не подходит для дальнейшей обработки. В моем более сложном случае приравнивания двух матриц 3x3, сообщая SymPy, какие символы решить, приводит к тому, что некоторые отношения остаются неоткрытыми. – m4r73n

+0

Можете ли вы привести пример более крупной системы с такими неоткрытыми отношениями (возможно, вставить ее в суть или что-то еще)? – asmeurer

Смежные вопросы