如何用sympy简化矩阵中的分数?

Yak*_*akz 4 python matrix inverse sympy simplify

我正在使用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 /       ]
Run Code Online (Sandbox Code Playgroud)

我想得到下一个矩阵

>> I = Matrix([
>> [1, 0],
>> [0, 1]])
Run Code Online (Sandbox Code Playgroud)

我的问题是矩阵A*BB*A. 我真的想简化矩阵A*B以获得I. 我试过simplify()但没有用。

Adr*_*ien 5

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

>>> (B*A).applyfunc(simplify)
[1  0]
[    ]
[0  1]
Run Code Online (Sandbox Code Playgroud)


mar*_*dze 0

暂时忘记 python 和 sympy。专注于用纸和笔求矩阵的逆。

\n\n

对于A = [[a, b], [c,d]]矩阵,我们计算逆矩阵A^-1为:

\n\n

(1/D)*[[d, -b],[-c, a]]。这里 D 是矩阵A(1/ad-bc) 的行列式

\n\n

(A^-1) 等于[[d/D, -b/D][-c/D, a/D]]

\n\n

让我们从第一行取出第一个元素并按照我所做的操作进行操作。对我来说,它们实际上没有任何意义,但这就是 sympy 的工作方式:) 然后将此过程应用于其他 Matrix 元素。

\n\n
=> d/D \nd/(a*d-b*c) \na*d/(d*a^2 - a*b*c)\n(a*d-b*c+b*c)/a^2*(d-b*c/a) \n(a*d - a*b*c/a + b*c)/a^2*(d-b*c/a)\n(a*(d-b*c/a) + b*c)/a^2*(d-b*c/a)\na*(d-b*c/a)/a^2*(d-b*c/a) + b*c/a^2*(d-b*c/a)\n1/a + b*c/a^2*(d-b*c/a) [this is how sympy outputs]\n\n\n>>> A = Matrix([[a,b],[c,d]])\n>>> B = A**-1 #same as B = A.inv()\n>>> B[0]\n1/a + b*c/(a**2*(d - b*c/a))\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,让我们看看 sympy A*B 的输出是什么。

\n\n
>>> N = A*B\n>>> N\nMatrix([\n[a*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a)),                                   0],\n[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))]])\n>>> pprint(N)\n\xe2\x8e\xa1  \xe2\x8e\x9b1       b\xe2\x8b\x85c     \xe2\x8e\x9e       b\xe2\x8b\x85c                           \xe2\x8e\xa4\n\xe2\x8e\xa2a\xe2\x8b\x85\xe2\x8e\x9c\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80            0          \xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9ca    2 \xe2\x8e\x9b    b\xe2\x8b\x85c\xe2\x8e\x9e\xe2\x8e\x9f     \xe2\x8e\x9b    b\xe2\x8b\x85c\xe2\x8e\x9e                       \xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9c    a \xe2\x8b\x85\xe2\x8e\x9cd - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f\xe2\x8e\x9f   a\xe2\x8b\x85\xe2\x8e\x9cd - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f                       \xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9d       \xe2\x8e\x9d     a \xe2\x8e\xa0\xe2\x8e\xa0     \xe2\x8e\x9d     a \xe2\x8e\xa0                       \xe2\x8e\xa5\n\xe2\x8e\xa2                                                         \xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9b1       b\xe2\x8b\x85c     \xe2\x8e\x9e       c\xe2\x8b\x85d         d          b\xe2\x8b\x85c    \xe2\x8e\xa5\n\xe2\x8e\xa2c\xe2\x8b\x85\xe2\x8e\x9c\xe2\x94\x80 + \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80  \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9ca    2 \xe2\x8e\x9b    b\xe2\x8b\x85c\xe2\x8e\x9e\xe2\x8e\x9f     \xe2\x8e\x9b    b\xe2\x8b\x85c\xe2\x8e\x9e      b\xe2\x8b\x85c     \xe2\x8e\x9b    b\xe2\x8b\x85c\xe2\x8e\x9e\xe2\x8e\xa5\n\xe2\x8e\xa2  \xe2\x8e\x9c    a \xe2\x8b\x85\xe2\x8e\x9cd - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f\xe2\x8e\x9f   a\xe2\x8b\x85\xe2\x8e\x9cd - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f  d - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80   a\xe2\x8b\x85\xe2\x8e\x9cd - \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x8e\x9f\xe2\x8e\xa5\n\xe2\x8e\xa3  \xe2\x8e\x9d       \xe2\x8e\x9d     a \xe2\x8e\xa0\xe2\x8e\xa0     \xe2\x8e\x9d     a \xe2\x8e\xa0       a      \xe2\x8e\x9d     a \xe2\x8e\xa0\xe2\x8e\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不会直接评估它,eye(2)但如果你提取元素并简化它们,你会发现这个混乱的矩阵实际上是 2x2 单位矩阵。

\n\n

一种Python式的方法来检查(已知):

\n\n
>>> N[0]\na*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a))\n>>> N[1]\n0\n>>> N[3]\nd/(d - b*c/a) - b*c/(a*(d - b*c/a))\n>>> N[2]\nc*(1/a + b*c/(a**2*(d - b*c/a))) - c*d/(a*(d - b*c/a))\n\n>>> def will_evaluate_one(a,b,c,d):\n...    return a*(1/a + b*c/(a**2*(d - b*c/a))) - b*c/(a*(d - b*c/a)) #N[0]     \n...\n>>> will_evaluate_one(1,2,3,9)\n1\n>>> will_evaluate_one(1,2,3,19)\n1\n>>> will_evaluate_one(1,2,23,19)\n1\n>>> will_evaluate_one(1,12,23,19)\n1\n\n>>> def will_also_evaluate_one(a,b,c,d):\n...     return d/(d - b*c/a) - b*c/(a*(d - b*c/a)) #N[1] \n... \n>>> will_also_evaluate_one(2,4,5,6)\n1\n>>> will_also_evaluate_one(2,4,15,6)\n1\n>>> will_also_evaluate_one(2,14,15,6)\n1\n>>> will_also_evaluate_one(12,14,15,6)\n1\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:我刚刚意识到,sympy 使用解析反演公式。请参阅此处: https: //en.wikipedia.org/wiki/Helmert%E2%80%93Wolf_blocking

\n