from numpy import *
m = array( [[1, 2, 3],
[2, 3, 4],
[3, 4, 6]] )
linalg.det(m) # déterminant
-1.0000000000000004
minv = linalg.inv(m) # inverse
print minv
[[-2. 0. 1.] [ 0. 3. -2.] [ 1. -2. 1.]]
print dot(minv, m) # M^{-1} . M = I
[[ 1.00000000e+00 -1.33226763e-15 -1.77635684e-15] [ 0.00000000e+00 1.00000000e+00 0.00000000e+00] [ 0.00000000e+00 4.44089210e-16 1.00000000e+00]]
b = array([2, 2, 3])
x = linalg.solve(m, b) # résolution de système
print x
[-1. 0. 1.]
print dot(m, x) # on vérifie que la solution est correcte
[ 2. 2. 3.]
valp, vecp = linalg.eig(m) # valeurs et vecteurs propres
print "Valeurs propres de m :", valp
print "Vecteurs propres associés :"
print vecp
Valeurs propres de m : [ 10.18669767 -0.42027581 0.23357814] Vecteurs propres associés : [[ 0.36530658 0.92694664 0.08556306] [ 0.52826911 -0.13074871 -0.83894966] [ 0.7664743 -0.35167415 0.53744064]]
print dot(m, vecp[:,0]) # m * 1er vecteur propre
print valp[0] * vecp[:,0] # 1ere valeur propre * 1er vecteur propre
[ 3.72126769 5.38131768 7.80784197] [ 3.72126769 5.38131768 7.80784197]
P = vecp
D = diag(valp)
Pinv = linalg.inv(P)
print dot(P, dot(D, Pinv)) # principe de diagonalisation : m = P . D . Pinv
[[ 1. 2. 3.] [ 2. 3. 4.] [ 3. 4. 6.]]
A = array( [[10., 7., 8., 7.],
[7., 5., 6., 5.],
[8., 6., 10., 9.],
[7., 5., 9., 10.]] )
b = array( [32, 23, 33, 31 ] )
print "A = ", A
print "b = ", b.T
A = [[ 10. 7. 8. 7.] [ 7. 5. 6. 5.] [ 8. 6. 10. 9.] [ 7. 5. 9. 10.]] b = [32 23 33 31]
x = linalg.solve(A, b)
print x
[ 1. 1. 1. 1.]
E = array( [[0., 0., 0.1, 0.2],
[0.08, 0.04, 0., 0.],
[0., -0.02, -0.02, 0.],
[-0.01, -0.01, 0., -0.02]] )
A2 = A + E
x2 = linalg.solve(A2, b)
print x2
[ -5.79224365 12.01880932 -1.56555429 2.56552237]
def matrix_norm2(M): # calcule la norme 2 de la matrice M
valp, _ = linalg.eig( dot(M.conj(), M) )
return sqrt( max(valp) )
matrix_norm2(E)
(0.050463861837858059+0j)
def vect_norm2(v): # calcule la norme 2 du vecteur v
return sqrt( sum(v**2) )
vect_norm2( x-x2 )
13.288403278162946
cond = matrix_norm2(A) * matrix_norm2( linalg.inv(A) )
cond
2984.0927016755245
cond * matrix_norm2(E)
(150.58884180871425+0j)