繁体   English   中英

设置Sympy中相对于其他变量的变量的假设

[英]Setting Assumptions on Variables in Sympy Relative to Other Variables

我知道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] ])

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]的特征向量,它们是正确的特征向量。 我甚至都没有试图简化同意的结果,因为它们非常漫长而复杂。 我怀疑它与变量的假设有关,比如指定a + 2b <1,但我不确定。

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

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

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

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

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

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

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

这些假设没有在这里发挥作用。 这通常只有你有平方根才有意义,因为只有当x >= 0sqrt(x**2) = x

您需要做的就是简化结果。 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 ⎦⎦⎠⎦

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM