2013-05-08 130 views
7

我知道sympy在python中可以设置变量的假设,例如x是正数,负数,实数,复数等。我在想,sympy是否可以设置相对变量的假设到其他变量。例如,如果我有变量x和y,我可以设置sympy在其解决方案中假定x> y。或者,或者,如果我有两个变量a和b,我可以设置sympy来假设a + 2B < 1?这些假设可能有助于sympy简化复杂的解决方案来解决()和特征向量。在Sympy中设置变量相对于其他变量的假设

我已经看了全部,还没有找到有关在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,但我不确定。

回答

9

我想知道是否张贴此作为一个评论,但它是太长:

简短的回答:没有可用的方式。

SymPy的假设系统现在很混乱(版本0.7.2,截至2013年5月最新)。由于预期的GSoC项目,今年夏天有可能会变得更好,但这还不确定。

SymPy中实际上有两个假设系统。旧的,它添加了符号本身的假设(因此导致重建表达树的问题),并在构造函数中调用(例如Symbol(..., positive=True)),并且有一个新的基于全局变量的全局假设和本地经理(with assume(...):)。

SymPy中的许多函数都会检查旧的假设(例如Abs将检查是否设置了关键字参数positive),但仍然可能存在漏洞。新的假设系统可能更强大,但目前几乎未被使用(除非是最近的子模块)。

在旧的假设系统中,你想要的是不可能的。在新版本中,它是可能的,但可能尚未实现,并且不用于SymPy的任何部分。

所以你有两个选择:帮助我们设定假设系统或帮助我们使用矩阵模块。两人都可以用更多的爱。

+1

你好,你似乎知道了很多关于假设系统中。我在哪里可以了解当前的状态更加的实用技巧假设系统在2016年年底?Sympy现在处于版本1,并且似乎仍然存在两个假设系统,因为假设模块和符号构造器假设都存在。文档没有解释为什么仍然存在两个系统或提供指导要知道何时使用其中一个或另一个 – Shaun 2016-12-02 19:14:24

+0

@Shaun,要求更新说明的最佳位置是sympy邮件列表。 – Krastanov 2016-12-04 04:57:18

4

这里的假设并未发挥作用。如果你有平方根,那通常只是很重要,因为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 ⎦⎦⎠⎦ 
+0

https://code.google.com/p/sympy/issues/detail?id= 3811 – asmeurer 2013-05-08 18:01:00

+0

啊。谢谢!解决问题实际上解决了我遇到的一些问题。我遇到了包含平方根的特征向量问题,如sqrt((K-a)** 2)。能够指定K> a的假设是很好的,所以这可以简化为正面。根据上面的帖子,看来这是不可能的。 – Nate 2013-05-08 19:51:34

+1

你可以在一定程度上用新的假设来做到这一点。试一下'refine(expr,Q.positive(K-a))'。 – asmeurer 2013-05-09 00:07:39