我知道python中的sympy可以对变量设置假设,例如x为正,负,实,复数等。我想知道sympy是否可以相对于其他变量对变量设置假设。例如,如果我有变量x和y,我可以设置sympy来假设x>
y在其解中。或者,或者,如果我有两个变量a和B,我可以设置sympy假设a + 2B
<1吗?这些假设可能有助于sympy简化解决方案solve()和特征向量的复杂解决方案。
我四处张望,没有找到关于在sympy中设置这些假设的信息。
我问是因为我试图找到特定矩阵的特征向量
a,b = symbols('a,b', nonnegative=False)
M = Matrix([ [1-a-2*b, a, b, b],
[a, 1-a-2*b, b, b],
[b, b, 1-a-2*b, a],
[b, b, a, 1-a-2*b] ])
Sympy正确找到特征值
M.eigenvals()
我已经通过MATLAB和WolframAlpha确认,它们都给出了相同的结果。然而,特征向量是一团糟
M.eigenvects()
MATLAB和WolframAlpha都返回[1,1,1,1] [-1,-1,1,1] [0,0,-1,1]
[-1,1,0,0]的特征向量正确的特征向量。我什至没有尝试简化sympy的结果,因为它们非常长且复杂。我怀疑这与对变量的假设有关,例如指定a + 2b
<1,但我不确定。
我想知道是否将此发表为评论,但它太长了:
简短的答案:不是可用的方式。
目前,SymPy的假设系统有点混乱(版本0.7.2,最新日期为2013年5月)。由于潜在的GSoC项目,今年夏天它可能会变得更好,但这还不确定。
SymPy中实际上有两个假设系统。旧的将假设添加到符号本身(因此会导致表达式树的重建问题)并在构造函数中调用(例如Symbol(..., positive=True)
),而新的则是基于全局变量的全局假设和新的。with assume(...):
本地经理的上下文管理器()。
SymPy中的许多功能确实会检查旧的假设(例如Abs
将检查是否positive
设置了关键字参数),但是仍然可能会遗漏。新的假设系统可能会更强大,但目前几乎未使用(最近的子模块中除外)。
在旧的假设系统中,您想要的是不可能的。在新版本中,它是可能的,但可能尚未实现,并且未在SymPy的任何部分中使用。
因此,您有两个选择:帮助我们使用假设系统或帮助我们使用矩阵模块。双方都可以使用更多的爱。