我正在使用sympy
来查找矩阵的逆。我有下一个问题。当我计算矩阵A
的逆矩阵并且我想要证明它时,我得到了一个带分数的矩阵;我的意思是
>> import sympy
>> from sympy import pprint
>> from sympy.abc import *
>> import sys
>> sys.displayhook = pprint
>> from sympy.matrices import *
>> A = Matrix([[a, b],[c, d]])
>> B = A.inv()
>> B
>> [1 b*c -b ]
>> [- + ------------ -----------]
>> [a 2 / b*c\ / b*c\]
>> [ a *|d - ---| a*|d - ---|]
>> [ \ a / \ a /]
>> [ ]
>> [ -c 1 ]
>> [ ----------- ------- ]
>> [ / b*c\ b*c ]
>> [ a*|d - ---| d - --- ]
>> [ \ a / a ]
>> B*A
>> [ /1 b*c \ b*c /1 b*c \ b*d ]
>> [a*|- + ------------| - ----------- b*|- + ------------| - -----------]
>> [ |a 2 / b*c\| / b*c\ |a 2 / b*c\| / b*c\]
>> [ | a *|d - ---|| a*|d - ---| | a *|d - ---|| a*|d - ---|]
>> [ \ \ a // \ a / \ \ a // \ a /]
>> [ ]
>> [ d b*c ]
>> [ 0 ------- - ----------- ]
>> [ b*c / b*c\ ]
>> [ d - --- a*|d - ---| ]
>> [ a \ a / ]
我想得到下一个矩阵
>> I = Matrix([
>> [1, 0],
>> [0, 1]])
我的问题是矩阵A*B
或B*A
。我真的想简化矩阵A*B
以获得I
。我试过了simplify()
但是没有用。
答案 0 :(得分:2)
您可以使用simplify
将applyfunc
函数应用于矩阵的每个单元格,如下所示:
>>> (B*A).applyfunc(simplify)
[1 0]
[ ]
[0 1]
答案 1 :(得分:0)
忘了蟒蛇和同情一分钟。专注于用纸和笔找到矩阵的逆矩阵。
对于A = [[a, b], [c,d]]
矩阵,我们计算逆A^-1
as,
(1/D)*[[d, -b],[-c, a]]
。这里D是A
矩阵(1 / ad-bc)
这(A ^ -1)等于[[d/D, -b/D][-c/D, a/D]]
让我们从第一行开始,然后按照我的操作进行操作。对我来说,他们实际上没有任何意义,但这是同情的方式:)然后将此过程应用于其他Matrix元素。
=> d/D
d/(a*d-b*c)
a*d/(d*a^2 - a*b*c)
(a*d-b*c+b*c)/a^2*(d-b*c/a)
(a*d - a*b*c/a + b*c)/a^2*(d-b*c/a)
(a*(d-b*c/a) + b*c)/a^2*(d-b*c/a)
a*(d-b*c/a)/a^2*(d-b*c/a) + b*c/a^2*(d-b*c/a)
1/a + b*c/a^2*(d-b*c/a) [this is how sympy outputs]
>>> A = Matrix([[a,b],[c,d]])
>>> B = A**-1 #same as B = A.inv()
>>> B[0]
1/a + b*c/(a**2*(d - b*c/a))
现在,让我们来看看什么是同情A * B输出。
>>> N = A*B
>>> N
Matrix([
[a*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a)), 0],
[c*(1/a + b*c/(a**2*(d - b*c/a))) - c*d/(a*(d - b*c/a)), d/(d - b*c/a) - b*c/(a*(d - b*c/a))]])
>>> pprint(N)
⎡ ⎛1 b⋅c ⎞ b⋅c ⎤
⎢a⋅⎜─ + ────────────⎟ - ─────────── 0 ⎥
⎢ ⎜a 2 ⎛ b⋅c⎞⎟ ⎛ b⋅c⎞ ⎥
⎢ ⎜ a ⋅⎜d - ───⎟⎟ a⋅⎜d - ───⎟ ⎥
⎢ ⎝ ⎝ a ⎠⎠ ⎝ a ⎠ ⎥
⎢ ⎥
⎢ ⎛1 b⋅c ⎞ c⋅d d b⋅c ⎥
⎢c⋅⎜─ + ────────────⎟ - ─────────── ─────── - ───────────⎥
⎢ ⎜a 2 ⎛ b⋅c⎞⎟ ⎛ b⋅c⎞ b⋅c ⎛ b⋅c⎞⎥
⎢ ⎜ a ⋅⎜d - ───⎟⎟ a⋅⎜d - ───⎟ d - ─── a⋅⎜d - ───⎟⎥
⎣ ⎝ ⎝ a ⎠⎠ ⎝ a ⎠ a ⎝ a ⎠⎦
它不会将其评估为直接eye(2)
但是如果你采用元素,
并简化它们,你会发现它们这个混乱的矩阵实际上是2x2单位矩阵。
检查(知道给定)的pythonic方法:
>>> N[0]
a*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a))
>>> N[1]
0
>>> N[3]
d/(d - b*c/a) - b*c/(a*(d - b*c/a))
>>> N[2]
c*(1/a + b*c/(a**2*(d - b*c/a))) - c*d/(a*(d - b*c/a))
>>> def will_evaluate_one(a,b,c,d):
... return a*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a)) #N[0]
...
>>> will_evaluate_one(1,2,3,9)
1
>>> will_evaluate_one(1,2,3,19)
1
>>> will_evaluate_one(1,2,23,19)
1
>>> will_evaluate_one(1,12,23,19)
1
>>> def will_also_evaluate_one(a,b,c,d):
... return d/(d - b*c/a) - b*c/(a*(d - b*c/a)) #N[1]
...
>>> will_also_evaluate_one(2,4,5,6)
1
>>> will_also_evaluate_one(2,4,15,6)
1
>>> will_also_evaluate_one(2,14,15,6)
1
>>> will_also_evaluate_one(12,14,15,6)
1
注意:我刚刚意识到,sympy使用了anlaytic inversion公式。见这里:https://en.wikipedia.org/wiki/Helmert%E2%80%93Wolf_blocking