Académique Documents
Professionnel Documents
Culture Documents
m = np.size(A,0)
n = np.size(A,1)
assert(m==n)
d=np.diag(A)
p = np.prod(d)
assert(p != 0)
x = np.zeros((n,1))
x[0] = b[0]/A[0][0]
for i in range(1,n)꞉
s = 0
for k in range(i)꞉
s = s+A[i][k]*x[k]
x[i] = (b[i]‑s)/A[i][i]
return x
In [4]: n=4
L=np.zeros((n,n))
for i in range (n)꞉
for j in range (i+1)꞉
L[i,j]=1+i+j
print('L=')
print(L)
#y=5+10*np.random.rand﴾n﴿
y=np.array([1.,‑1.,2.,3.])
print('y=',y)
print('Solution de Lx=y ꞉')
x=Descente(L,y)
print(x)
print('erreur=',np.linalg.norm(np.dot(L,x)‑y))
L=
[[1. 0. 0. 0.]
[2. 3. 0. 0.]
[3. 4. 5. 0.]
[4. 5. 6. 7.]]
y= [ 1. ‑1. 2. 3.]
Solution de Lx=y ꞉
[ 1. ‑1. 0.6 0.05714286]
erreur= 0.0
In [5]: L=np.array([[3,0,0,0],
[‑1,2,0,0],
[2,‑2,1,0],
[1,‑1,2,‑3]],dtype = 'float64')
print(L)
#b=np.array﴾[[1],[‑1],[2],[3]]﴿
b=np.array([1.,‑1.,2.,3.])
print('b=',b)
x=Descente(L,b)
print('x=',x)
print('erreur=',np.linalg.norm(L.dot(x)‑b))
[[ 3. 0. 0. 0.]
[‑1. 2. 0. 0.]
[ 2. ‑2. 1. 0.]
[ 1. ‑1. 2. ‑3.]]
b= [ 1. ‑1. 2. 3.]
x= [ 0.33333333 ‑0.33333333 0.66666667 ‑0.33333333]
erreur= 0.0
d=np.diag(A)
p = np.prod(d)
assert(p != 0)
x = np.zeros((n,1))
x[n‑1] = b[n‑1]/A[n‑1][n‑1]
for i in range(n‑2,‑1,‑1)꞉
s = 0
for k in range(i+1,n)꞉
s = s+A[i][k]*x[k]
x[i] = (b[i]‑s)/A[i][i]
return x
In [8]: U=np.array([[3,1,2,‑1],
[0,2,2,1],
[0,0,1,3],
[0,0,0,‑3]],dtype = 'float64')
print(U)
#b=np.array﴾[[1],[‑1],[2],[3]]﴿
b=np.array([1.,‑1.,2.,3.])
print(b)
x=Remontee(U,b)
print(x)
print('erreur=',np.linalg.norm(U.dot(x)‑b))
[[ 3. 1. 2. ‑1.]
[ 0. 2. 2. 1.]
[ 0. 0. 1. 3.]
[ 0. 0. 0. ‑3.]]
[ 1. ‑1. 2. 3.]
[‑1.66666667 ‑5. 5. ‑1. ]
erreur= 0.0
1. Ecrire une fonction qui résout un système linéaire Ax = b par la méthode de décomposition LU
In [9]: def LU_Crout(A)꞉
n = len(A)
A1=np.array(A)
for k in range (n‑1)꞉
A1[k,k+1꞉n] = A1[k,k+1꞉n] / A1[k,k] #on divise par le pivot sur la ligne k à par
#on traite la matrice extraite entre les indices k+1 et n‑1
A1[k+1꞉n,k+1꞉n] = A1[k+1꞉n,k+1꞉n] ‑ (np.transpose([A1[k+1꞉n,k]])).dot([A1[k,k+1꞉
L = np.zeros((n,n))
for i in range (0,n)꞉
L[i,0꞉i+1]=A1[i,0꞉i+1]
U= A1 ‑ L + np.diag(np.ones(n))
return [L,U]
U[0,0] = A[0,0]
for i in range(1,n)꞉
U[0][i] = A[0][i]
L[i][0] = A[i][0]/U[0][0]
for i in range(1,n)꞉
s = 0
for k in range(i)꞉
s = s+L[i][k]*U[k][i]
U[i][i] = A[i][i]‑s
for j in range(i+1,n)꞉
s = 0
for k in range(i)꞉
s = s+L[i][k]*U[k][j]
U[i][j] = A[i][j]‑s
s = 0
for k in range(i)꞉
s = s+L[j][k]*U[k][i]
L[j][i] = (A[j][i]‑s)/U[i][i]
return L,U
A=np.array([[4.,6.,2.],[6.,10.,5.],[2.,5.,14.]])
print('Décomposition LLT de Cholesky de A ꞉')
[L,sym,chol]=L_Cholesky(A)
if chol==1 & sym==1꞉
print('LU ꞉')
print('A=',A)
print('L=')
print(L)
print('U=')
#U=transposée de L
U=L.T
print(U)
print('||A‑LU||=',np.linalg.norm(A‑L.dot(U)))
y=Descente(L,b)
print('y=',y)
x=Remontee(U,y)
print('x=',x)
print(A.dot(x))
print('||Ax‑b||=',np.linalg.norm(A.dot(x)‑b))
A= [[ 4. ‑1. 1.]
[ 4. ‑8. 1.]
[‑2. 1. 5.]]
Décomposition LU de Doolittle de A ꞉
LU ꞉
A= [[ 4. ‑1. 1.]
[ 4. ‑8. 1.]
[‑2. 1. 5.]]
L=
[[ 1. 0. 0. ]
[ 1. 1. 0. ]
[‑0.5 ‑0.07142857 1. ]]
U=
[[ 4. ‑1. 1. ]
[ 0. ‑7. 0. ]
[ 0. 0. 5.5]]
||A‑LU||= 0.0
y= [ 7. ‑28. 16.5]
x= [2. 4. 3.]
[ 7. ‑21. 15.]
||Ax‑b||= 0.0
Décomposition LU de Crout de A ꞉
LU ꞉
A= [[ 4. ‑1. 1.]
[ 4. ‑8. 1.]
[‑2. 1. 5.]]
L=
[[ 4. 0. 0. ]
[ 4. ‑7. 0. ]
[‑2. 0.5 5.5]]
U=
[[ 1. ‑0.25 0.25]
[ 0. 1. 0. ]
[ 0. 0. 1. ]]
||A‑LU||= 0.0
y= [1.75 4. 3. ]
x= [2. 4. 3.]
[ 7. ‑21. 15.]
||Ax‑b||= 0.0
Décomposition LLT de Cholesky de A ꞉
LU ꞉
A= [[ 4. 6. 2.]
[ 6. 10. 5.]
[ 2. 5. 14.]]
L=
[[2. 0. 0.]
[3. 1. 0.]
[1. 2. 3.]]
U=
[[2. 3. 1.]
[0. 1. 2.]
[0. 0. 3.]]
||A‑LU||= 0.0
y= [ 3.5 ‑31.5 24.83333333]
x= [ 69.69444444 ‑48.05555556 8.27777778]
[ 7. ‑21. 15.]
||Ax‑b||= 6.355287432313019e‑14
1. Ecrire une fonction qui teste si une matrice A est symétrique et définie positive
In [14]: def test(A)꞉
[L,sym,chol]=L_Cholesky(A)
if sym==0꞉
print("la matrice n'est pas symétrique")
else꞉
print("la matrice est symétrique")
if chol==0꞉
print("la matrice n'est pas définie positive")
else꞉
print("la matrice est définie positive")
return
print('Exemple 1')
A=np.array([[4.,6.,2.],[6.,10.,5.],[2.,5.,14.]])
test(A)
print('EXEMPLE 2')
A=np.array([[‑2.,6.,2.],[6.,10.,5.],[2.,5.,14.]])
test(A)
Exemple 1
la matrice est symétrique
la matrice est définie positive
EXEMPLE 2
la matrice n'admet pas de decomposition Cholesky
la matrice est symétrique
la matrice n'est pas définie positive
A=np.array([[4,‑1,1],[4,‑8,1],[‑2,1,5]],dtype = 'float64')
print(determinant(A))
print(np.linalg.det(A))
‑154.0
‑154.00000000000006
Méthodes itératives
Objet ꞉ En utilisant Python, résoudre un système d’équations linéaires par les méthodes itératives
In [16]: def Jacobi(A,b,x0,eps,itmax)꞉
x = x0 #on initialise avec x0
M = np.diag(np.diag(A)) #M=D la matrice diagonale formée par la diagonale de A
N = M ‑ A #puisque N = L+U, ‑L et ‑U étant les parties sous‑diagonales et sur‑di
err = np.linalg.norm(A.dot(x) ‑ b) # l'erreur initiale est ||Ax0 ‑ b||
it = 0
while (err > eps and it < itmax)꞉ #on continue d'itérer tant qu'on n'a pas atteint
x = Descente(M,N.dot(x) + b) #on actualise x en trouvant la solution y de My =
err = np.linalg.norm(A.dot(x) ‑ b) #on actualise l'erreur
it = it + 1 #on actualise le paramètre d'itération
return [x,it] #on renvoie la solution approchée et le nombre d'itérations nécessai
1. Comparer le nombre des itérations et la qualité de la solution de cette méthode en variant les tests
d’arrêts.
In [20]: def Jacobi2(A,b,x0,eps,itmax)꞉
1. Tracer le nombre d’itérations en fonction du paramètre w ∈]0, 2[ avec un test d’arrêt fixé
In [23]: import matplotlib.pyplot as plt
lomega=np.arange(0.1,2,0.01)
lit=[]
n=len(lomega)
for i in range(0,n)꞉
[x,it]=Relaxation(A,b,x0,lomega[i],eps,itmax)
lit.append(it)
plt.plot(lomega,np.array(lit),'r+',label="Nombre d'itérations vs Omega")
plt.xlabel(' Omega ')
plt.ylabel(" Nombre d'itérations ")
plt.show()