Sympy 乘以答案改变它并使其错误
Sympy multiplies answer changing it and making it wrong
我试图找到矩阵的逆矩阵,但是,sympy 总是将最终答案乘以 4,从而使答案错误。当我使用 factor 函数时也会发生这种乘法。
这是我要更改的矩阵
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 变换演化而来的,这种因子的乘积导致最终答案错误。因子或极点必须完全是它们没有任何乘法的结果,即答案必须完全是 (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) ⎦
我试图找到矩阵的逆矩阵,但是,sympy 总是将最终答案乘以 4,从而使答案错误。当我使用 factor 函数时也会发生这种乘法。
这是我要更改的矩阵
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 变换演化而来的,这种因子的乘积导致最终答案错误。因子或极点必须完全是它们没有任何乘法的结果,即答案必须完全是 (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) ⎦