13

我知道 python 中的 sympy 可以对变量设置假设,例如 x 是正数、负数、实数、复数等。我想知道 sympy 是否可以相对于其他变量对变量设置假设。例如,如果我有变量 x 和 y,我可以设置 sympy 以假设 x > y 在其解决方案中。或者,或者,如果我有两个变量,a 和 B,我可以设置 sympy 来假设 a + 2B < 1?这类假设可能有助于 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,但我不确定。

4

2 回答 2

13

我想知道是否将其作为评论发布,但它太长了:

简短的回答:不是以可用的方式。

SymPy 的假设系统现在有点乱(版本 0.7.2,最新于 2013 年 5 月)。由于未来的 GSoC 项目,它有可能在今年夏天变得更好,但这还不确定。

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

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

在旧的假设系统中,您想要的是不可能的。在新版本中它是可能的,但可能还没有实现,也没有在 SymPy 的任何部分中使用。

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

于 2013-05-08T08:29:53.793 回答
5

这些假设在这里没有发挥作用。这通常只有在你有平方根时才重要,因为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 ⎦⎦⎠⎦
于 2013-05-08T17:58:37.843 回答