##

import numpy as np
import scipy as sp


list_A = [[1,2,3],
          [4,5,6],
          [6,7,9]]

A = np.array(list_A, dtype=float)

print(f"La matrice A vaut :\n{A}\n")

det_A = np.linalg.det(A)

print(f"det(A) vaut :\n{det_A}\n")

assert det_A != 0, "Attention, A est singulière !"

# Si on arrive ici, on a traversé assert donc A est inversible !

TOTO = sp.linalg.lu(A)

P = TOTO[0]

print(f"P :\n{TOTO[0]}\n")

L = TOTO[1]

print(f"L :\n{TOTO[1]}\n")

U = TOTO[2]

print(f"U :\n{TOTO[2]}\n")


# print(sp.linalg.lu(A))
# print(sp.linalg.lu_factor(A))

# print(f"Vérification : \n{P@L@U-A}\n") # Ok : PLU = A !

print("Avec lu_factor :\n") # ????

TOTO = sp.linalg.lu_factor(A)

M = TOTO[0]

print(f"M :\n{TOTO[0]}\n")

# L = TOTO[1]
#
# print(f"L :\n{TOTO[1]}\n")

##

import numpy as np
import scipy as sp
from time import time

ini_time = time()

list_A = [[1,2,3],
          [4,5,6],
          [6,7,9]]

A = np.array(list_A, dtype=float)

print(f"La matrice A vaut :\n{A}\n")

mad = sp.linalg.lu_factor(A)

b = np.array([1,2,3], dtype=float)

X = sp.linalg.lu_solve(mad, b)

print(X)

print(f"Vérification : {A@X-b}")

print(f"Duration = {time()-ini_time}s")

#Autre méthode

ini_time = time()

inv_A = np.linalg.inv(A)
X = inv_A @ b

print(X)

print(f"Vérification : {A@X-b}")

print(f"Duration = {time()-ini_time}s")


#Autre méthode

ini_time = time()

X = np.linalg.solve(A,b)

print(X)

print(f"Vérification : {A@X-b}")

print(f"Duration = {time()-ini_time}s")





















