我知道python中的同情可以设置变量的假设,例如x是正数,负数,实数,复数等.我想知道sympy是否可以设置变量相对于其他变量的假设.例如,如果我有变量x和y,我可以设置sympy以假设其解决方案中的x> y.或者,如果我有两个变量a和B,我可以设置同情假设a + 2B <1?这些假设可能有助于简化解决()和特征向量的复杂解决方案.
我看了一遍,并没有找到有关在同情中设置这些假设的信息.
我问,因为我试图找到特定矩阵的特征向量
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] ])
Run Code Online (Sandbox Code Playgroud)
Sympy正确地找到了特征值
M.eigenvals()
Run Code Online (Sandbox Code Playgroud)
我通过MATLAB和WolframAlpha证实了这一点,它们都给出了相同的结果.然而,特征向量是一团糟
M.eigenvects()
Run Code Online (Sandbox Code Playgroud)
MATLAB和WolframAlpha都返回[1,1,1,1] [-1,-1,1,1] [0,0,-1,1] [-1,1,0,0]的特征向量,它们是正确的特征向量.我甚至都没有试图简化同意的结果,因为它们非常漫长而复杂.我怀疑它与变量的假设有关,比如指定a + 2b <1,但我不确定.
Kra*_*nov 10
我想知道是否将此作为评论发布,但它太长了:
简短回答:不是以可用的方式.
SymPy的假设系统现在很乱(版本0.7.2,最新截至2013年5月).由于预期的GSoC项目,今年夏天有可能会好转,但目前尚不确定.
SymPy中实际上有两个假设系统.旧的,它将假设添加到符号本身(因此导致重建表达式树的问题)并在构造函数(例如Symbol(..., positive=True))中调用,并且有一个新的,它基于全局变量的全局假设和with assume(...):本地的上下文管理器().
SymPy中的许多函数都会检查旧的假设(例如,Abs将检查是否positive设置了关键字参数),但仍然可能会遗漏.新的假设系统可以更强大,但目前几乎未使用(除了最近的子模块).
在旧的假设系统中,你想要的是不可能的.在新版本中,它是可能的,但可能尚未实现,并且未在SymPy的任何部分中使用.
所以你有两个选择:帮助我们使用假设系统或帮助我们使用矩阵模块.两者都可以使用更多的爱.
这些假设在这里不起作用。这通常只有在您有平方根时才重要,因为sqrt(x**2) = x只有当x >= 0.
为此,您需要做的就是简化结果。Matrix.eigenvects有一个simplify标志,但它显然没有简化结果。我会为此打开一个问题。同时,您可以手动执行此操作。请注意,Matrix.simplify就地操作(如果您不喜欢那样,可以使用Matrix.applyfunc(simplify)
>>> A = M.eigenvects()
>>> A[0][2][0].simplify()
>>> A[1][2][0].simplify()
>>> pprint(A)
??1, 1, ??1???, ?-4?b + 1, 1, ??-1???, ?-2?a - 2?b + 1, 2, ??-1?, ?0 ????
?? ?? ??? ? ?? ??? ? ?? ? ? ????
?? ??1??? ? ??-1??? ? ??1 ? ?0 ????
?? ?? ??? ? ?? ??? ? ?? ? ? ????
?? ??1??? ? ??1 ??? ? ??0 ? ?-1????
?? ?? ??? ? ?? ??? ? ?? ? ? ????
?? ??1??? ? ??1 ??? ? ??0 ? ?1 ????
Run Code Online (Sandbox Code Playgroud)