55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
"""
|
|
Ici, on implémente gauss
|
|
"""
|
|
import numpy as np
|
|
from ex1 import resolve_up
|
|
|
|
|
|
def gauss(A: np.array, b: np.array) -> (np.array, np.array):
|
|
n = len(A)
|
|
for k in range(n): # k = pivot
|
|
for i in range(k+1, n): # i = ligne en dessous du pivot
|
|
g = A[i, k] / A[k, k] # multiplication pour éliminer A[i, k]
|
|
A[i, k:] -= g * A[k, k:] # row operation on A
|
|
b[i] -= g * b[k] # same row operation on b
|
|
|
|
return A, b # matrice triangularisé et le b modifié
|
|
|
|
|
|
def cholesky(A: np.array) -> np.array:
|
|
L = np.zeros(A)
|
|
L = np.sqrt(A[0, 0])
|
|
m = len(A)
|
|
# first column
|
|
for i in range(1, m):
|
|
L[i, 0] = A[i, 0] / L[0, 0]
|
|
|
|
# généralisation k = 2, ..., m
|
|
for k in range(1, m):
|
|
# diagonale
|
|
L[k, k] = np.sqrt(A[k, k] - np.sum(L[k, :k]**2))
|
|
for i in range(k+1, m):
|
|
for j in range(k-1):
|
|
L[i,k] = (A[i,k] - np.sum(L[i, j] * L[k, j])) / L[k, k]
|
|
return L
|
|
|
|
|
|
if __name__ == '__main__':
|
|
A = np.array([
|
|
[1, 1, 1, 1],
|
|
[1, 5, 5, 5],
|
|
[1, 5, 14, 14],
|
|
[1, 5, 14, 15]
|
|
], dtype=np.float64)
|
|
|
|
b = np.array([1, 0, 0, 0], dtype=np.float64)
|
|
|
|
A_triangle, b_gauss = gauss(A, b)
|
|
print(f"A triangulsarisée:\n {A_triangle}")
|
|
|
|
x = resolve_up(A, b_gauss)
|
|
print(f"x={x}")
|
|
|
|
L = cholesky(A)
|
|
print(f"L\n {L}")
|