Matrixrekening: Matrices in Python
Rijreductie en determinant
Python biedt rij- en kolomoperaties om veegoperaties in matrices numeriek uit te rekenen, maar voor het berekenen van de rijgereduceerde trapvorm (row-reduced echelon form) van een matrix is er het methode rref
in het sympy
pakket Hiermee kun je ook de methode van rijreductie voor het berekenen van een inverse matrix uitvoeren.
Inverse van een matrix berekenen
>>> import numpy as np
>>> import numpy.linalg as la
>>> import sympy as sy
>>> # inverteerbare matrix:
>>> A = sy.Matrix([[3, 1, -4], [-1, 0, 2], [1, 1, -1]]); A
Matrix([
[ 3, 1, -4],
[-1, 0, 2],
[ 1, 1, -1]])
>>> I = sy.eye(3); I
Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]])
>>> AI = A.row_join(I); AI # gerande matrix
Matrix([
[ 3, 1, -4, 1, 0, 0],
[-1, 0, 2, 0, 1, 0],
[ 1, 1, -1, 0, 0, 1]])
>> GAI = AI.rref(); GAI[0] # rijgereduceerde trapvorm
Matrix([
[1, 0, 0, 2, 3, -2],
[0, 1, 0, -1, -1, 2],
[0, 0, 1, 1, 2, -1]])
>>> GAI[0][:, 3:] # deelmatrix die gelijk is aan inverse van A
Matrix([
[ 2, 3, -2],
[-1, -1, 2],
[ 1, 2, -1]])
>>> la.inv(np.array(A.tolist(), float)) # inverse via numpy.linalg.inv
array([[ 2., 3., -2.],
[-1., -1., 2.],
[ 1., 2., -1.]])
De determinant van de matrix uit bovenstaand voorbeeld kan berekend worden met het commando det
en de uitkomst toont aan dat de matrix inverteerbaar is. We geven hieronder ook een voorbeeld van een niet-inverteerbare matrix omdat de determinant gelijk aan 0 is en de gereduceerde trapvorm ongelijk is aan een identiteitsmatrix. Als je toch probeert de inverse te bereken, krijg je overigens wel een resultaat met bijpassende waarschuwing. Wees bij berekening ook altijd op je hoede voor numerieke afrondingsfouten.
Determinant van een matrix
>>> A # inverteerbare matrix A
Matrix([
[ 3, 1, -4],
[-1, 0, 2],
>>> sy.det(A) # determinant van A
-1
>>> # niet-inverteerbare matrix B:
>>> B = sy.Matrix([[1, -2, -2], [1, 14, 14], [-4, -24, -24]]); B
Matrix([
[ 1, -2, -2],
[ 1, 14, 14],
[-4, -24, -24]])
>>> sy.det(B) # determinant van B
0
>>> np.rank(B) # rang van B
2
>>> B.rref()[0] # rijgereduceerde trapvorm van B
Matrix([
[1, 0, 0],
[0, 1, 1],
[0, 0, 0]])
>>> la.inv(np.array(B.tolist(), float)) # poging om inverse van B te berekenen
Traceback (most recent call last):
...
numpy.linalg.linalg.LinAlgError: Singular matrix