Sympy - Solver的不可预测的行为

时间:2013-08-29 11:13:51

标签: python sympy

我正在使用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},但无论我在方程中传递的顺序如何,它都应该是相同的。

2 个答案:

答案 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似乎解决了我的问题,虽然我不知道为什么。

documentation

  

'manual = True(默认为False)'

     

不要使用多边形/矩阵方法来求解方程组,一次一个地解决它们,就像你可以“手动”一样。

无论这意味着什么。

但是,solve([axx - bxx, byy], manual = True)solve([axx - bxx, byy], manual = True)都会给出相同的结果。