问题描述
我试图找到矩阵的逆,但是,sympy总是将最终答案乘以4,从而使答案错误。当我使用因子函数时,也会发生这种乘法。
这是我要更改的矩阵
import sympy as sy
z = sy.symbols('z')
t = sy.Matrix([[z,-1],[sy.Rational(1,4),z + 1]])
t.inv()
这是它给出的“错误”答案
真正的答案是相同的,只是不乘以4。为什么sympy会这样乘以答案?
更新
要找出问题所在,我们可以尝试对行列式进行分解。
如果考虑行列式因素,我希望答案为(z + 1/2)** 2 但这是我得到的答案,它被4和乘以2。期望的答案必须正好是(z + 1/2)^ 2,而不是乘法版本的sympy输出。
d = t.det()
print("I want to factor this")
display(d)
print("After factoring")
display(sy.factor(d))
print(" \n The right answer I was expecting")
display((z+sy.Rational(1,2))**2)
我要解决的问题是Z-transfrom的演变,并且因数的这种乘积使最终答案是错误的。因子或极点必须准确无误,即答案必须恰好是(z + 1/2)^ 2
有没有办法让sympy给我确切的因素?
解决方法
请谨慎使用您的话语:您得到的答案没有“错误”之处。您可能希望以其他形式获得答案,这很好,但是给出的答案是正确的。
如果考虑高斯有理数,就可以获得所需的形式:
In [41]: e = z**2 + z + Rational(1,4)
In [42]: e
Out[42]:
2 1
z + z + ─
4
In [43]: factor(e)
Out[43]:
2
(2⋅z + 1)
──────────
4
In [44]: factor(e,gaussian=True)
Out[44]:
2
(z + 1/2)
In [45]: t.inv()
Out[45]:
⎡ 4⋅z + 4 -1 ⎤
⎢ ────────────── ─────────────────⎥
⎢ 2 ⎛ 2 ⎞⎥
⎢ 4⋅z + 4⋅z + 1 ⎜ z z 1 ⎟⎥
⎢ 4⋅⎜- ── - ─ - ──⎟⎥
⎢ ⎝ 4 4 16⎠⎥
⎢ ⎥
⎢ 1 4⋅z ⎥
⎢──────────────── ────────────── ⎥
⎢ ⎛ 2 1⎞ 2 ⎥
⎢4⋅⎜- z - z - ─⎟ 4⋅z + 4⋅z + 1 ⎥
⎣ ⎝ 4⎠ ⎦
In [46]: t.inv().applyfunc(lambda e: factor(e,gaussian=True))
Out[46]:
⎡ z + 1 1 ⎤
⎢ ────────── ──────────⎥
⎢ 2 2⎥
⎢ (z + 1/2) (z + 1/2) ⎥
⎢ ⎥
⎢ -1 z ⎥
⎢──────────── ──────────⎥
⎢ 2 2⎥
⎣4⋅(z + 1/2) (z + 1/2) ⎦