numpy
Lineaire algebra met np.linalg
Zoeken…
Opmerkingen
Vanaf versie 1.8 kunnen verschillende routines in np.linalg
op een 'stapel' matrices werken. Dat wil zeggen dat de routine resultaten voor meerdere matrices kan berekenen als ze samen worden gestapeld. Bijvoorbeeld, hier wordt A
geïnterpreteerd als twee gestapelde 3-bij-3 matrices:
np.random.seed(123)
A = np.random.rand(2,3,3)
b = np.random.rand(2,3)
x = np.linalg.solve(A, b)
print np.dot(A[0,:,:], x[0,:])
# array([ 0.53155137, 0.53182759, 0.63440096])
print b[0,:]
# array([ 0.53155137, 0.53182759, 0.63440096])
De officiële np
docs specificeren dit via parameter specificaties zoals a : (..., M, M) array_like
.
Los lineaire systemen op met np.solve
Overweeg de volgende drie vergelijkingen:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
We kunnen dit systeem uitdrukken als een matrixvergelijking A * x = b
met:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
Gebruik vervolgens np.linalg.solve
om op te lossen voor x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
moet een vierkante en volledige matrix zijn: alle rijen moeten lineair onafhankelijk zijn. A
moet inverteerbaar / niet-enkelvoud zijn (de bepalende factor is niet nul). Indien bijvoorbeeld één rij A
is een veelvoud van een ander, bellen linalg.solve
zal verhogen LinAlgError: Singular matrix
:
A = np.array([[1, 2, 1],
[2, 4, 2], # Note that this row 2 * the first row
[1, 0, 1]])
b = np.array([4,8,5])
Dergelijke systemen kunnen worden opgelost met np.linalg.lstsq
.
Vind de kleinste kwadratenoplossing voor een lineair systeem met np.linalg.lstsq
Kleinste vierkanten is een standaardbenadering van problemen met meer vergelijkingen dan onbekenden, ook bekend als overbepaalde systemen.
Overweeg de vier vergelijkingen:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
We kunnen dit uitdrukken als een matrixvermenigvuldiging A * x = b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([4,3,5,4])
np.linalg.lstsq
vervolgens op met np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
is de oplossing, residuals
de som, rank
de matrixrang van invoer A
en s
de enkelvoudige waarden van A
Als b
meer dan één dimensie heeft, lstsq
het systeem op dat overeenkomt met elke kolom van b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([[4,3,5,4],[1,2,3,4]]).T # transpose to align dimensions
x, residuals, rank, s = np.linalg.lstsq(A,b)
print x # columns of x are solutions corresponding to columns of b
#[[ 2.05263158 1.63157895]
# [ 1.05263158 -0.36842105]
# [ 0.05263158 0.63157895]]
print residuals # also one for each column in b
#[ 0.84210526 5.26315789]
rank
en s
hangen alleen af van A
en zijn dus hetzelfde als hierboven.