Fattorizzazione Lu: pivot parziale. Funzione
import numpy as np
def fattLu(A):
n = A.shape[0]
P = np.eye(n) #stampa matrice con 1 sulla diagonale
L = np.zeros([n, n]) #matrice con tuti zero
A0 = np.copy(A) #creo la copia della matrice originale
i= 0
while (i < n):
t = np.argmax(np.abs(A0[:,0]))
t = t+i
print(t)
A0[[i, t], :] = A0[[t,i], :] #copio
print(A0) #ora scambiate righe della U
P[[i,t],:] = P[[t, i],:] #applico P e calcolo L
L[i+1:n,i] = (A0[i+1:n,i] / A0[i,i])
print(L) #gli zeri sulla U
A0[i+1:n,i] = 0 #rimane la sottomatrice
A0[i+1:n,i+1:n] = A0[i+1:n,i+1:n]-L[i+1:n,i]*A0[i,i+1:n]
i=i+1
print("\n Stampo A, P e L\n")
print(A)
print("\n")
print(" ")
print(P)
print(" \n")
print(L)
print(" \n")
print(A0)
A = np.array([
[-2, 1, 2, -3],
[-1, 2, 1, 3],
[-2, 4, 2, -6],
[-1, -4, 3, 4]
])
fattLu(A)