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*B或B*A. 我真的想简化矩阵A*B以获得I. 我试过simplify()但没有用。
您可以使用 将该simplify函数应用于矩阵的每个单元格applyfunc,如下所示:
>>> (B*A).applyfunc(simplify)
[1 0]
[ ]
[0 1]
Run Code Online (Sandbox Code Playgroud)
暂时忘记 python 和 sympy。专注于用纸和笔求矩阵的逆。
\n\n对于A = [[a, b], [c,d]]矩阵,我们计算逆矩阵A^-1为:
(1/D)*[[d, -b],[-c, a]]。这里 D 是矩阵A(1/ad-bc) 的行列式
(A^-1) 等于[[d/D, -b/D][-c/D, a/D]]
让我们从第一行取出第一个元素并按照我所做的操作进行操作。对我来说,它们实际上没有任何意义,但这就是 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))\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n它不会直接评估它,eye(2)但如果你提取元素并简化它们,你会发现这个混乱的矩阵实际上是 2x2 单位矩阵。
一种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\nRun Code Online (Sandbox Code Playgroud)\n\n注意:我刚刚意识到,sympy 使用解析反演公式。请参阅此处: https: //en.wikipedia.org/wiki/Helmert%E2%80%93Wolf_blocking
\n| 归档时间: |
|
| 查看次数: |
2692 次 |
| 最近记录: |