我正在使用Sympy(版本0.7.3,Python 2.7.5,Mac OS X)解算器来解决一些矩阵方程,我遇到了一个不一致的行为,这会破坏我的整个结果。确切地说,结果似乎取决于应该求解的方程的顺序。
通过以下代码生成最小工作示例:
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}
,当然在数学上是相同的,但在使用SymPy subs
函数应用此解决方案时会有所不同,即:
axx.subs({byy: 0, bxx: axx})
返回axx
,而
axx.subs({axx: bxx, byy: 0})
返回bxx
,这显然会在以后的计算中造成很多麻烦。
如果有人能告诉我如何让SymPy以一致的方式行事,我将不胜感激。我真的不在乎结果是{axx: bxx}
还是{bxx: axx}
,但无论我在方程中传递的顺序如何,它都应该是相同的。
答案 0 :(得分:3)
正如Krastanov所说,将第二个参数传递给solve,它告诉它要解决的符号。例如,如果您想要根据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}
如果你不这样做,它只会猜测,并且正如你所发现的,猜测是任意的,可能取决于方程的顺序甚至符号名称。
答案 1 :(得分:-1)
使用manual=True
似乎解决了我的问题,虽然我不知道为什么。
无论这意味着什么。'manual = True(默认为False)'
不要使用多边形/矩阵方法来求解方程组,一次一个地解决它们,就像你可以“手动”一样。
但是,solve([axx - bxx, byy], manual = True)
和solve([axx - bxx, byy], manual = True)
都会给出相同的结果。