如何简化基质中的分数?

时间:2015-10-02 22:54:02

标签: python matrix sympy simplify inverse

我正在使用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*BB*A。我真的想简化矩阵A*B以获得I。我试过了simplify()但是没有用。

2 个答案:

答案 0 :(得分:2)

您可以使用simplifyapplyfunc函数应用于矩阵的每个单元格,如下所示:

>>> (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