设定同一变量相对于其他变量的假设

2024-06-01 04:32:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我找遍了所有地方,但没有找到与在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] ])

symphy正确地找到特征值

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,但我不确定。


Tags: ltgt信息false地方矩阵matrixsymbols
2条回答

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

简言之:不是以一种有用的方式。

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 ⎦⎦⎠⎦

相关问题 更多 >