def test_forme_bidiagonale(epsilon): n = rd.randint(1,20) m = rd.randint(1,20) M = np.asmatrix(np.random.rand(n,m)) M = 100 * M result = p2.forme_bidiagonale (M) test_0_bidiagonale(result[1],epsilon) for i in range (n): for j in range (m): assert (np.abs(M[i,j] - (result[0]*result[1]*result[2])[i,j])<epsilon)
def compression_matrice (Mat, k): taille_x = Mat.shape[0] taille_y = Mat.shape[1] assert (k < min(taille_x, taille_y)) print "Mise sous forme bidiagonale" (Ql, BD, Qr) = p2.forme_bidiagonale(Mat) print "Diagonalisation" (U,S,V,_) = p3.SVD_preliminaire(BD) (U,S) = p3.organisation(U,S) nouveau_U = np.asmatrix(Ql*(U[:,0:k])) nouveau_S = np.asmatrix(S[0:k,0:k]) nouveau_V = np.asmatrix((V[0:k,:])*Qr) return (nouveau_U, nouveau_S, nouveau_V)
def QR_optimise (A): taille_x = A.shape[0] taille_y = A.shape[1] taille_max = max(taille_x, taille_y) AprimTest = mat_identity(taille_x, taille_y) AprimTest[:,:]=A[:,:] tQ = mat_identity(taille_x, taille_y) for i in range (taille_x - 1): (Grot,Aprim,_) = p2.forme_bidiagonale( (AprimTest[i:i+2, i:i+2])) Grot = Grot.T G = mat_identity(taille_x, taille_x) AprimTest[i:i+2,i:i+2]=Aprim G[i:i+2, i:i+2] = Grot tQ = G*tQ Q = np.transpose(tQ) return (Q, AprimTest)
def test_SVD (n, len_matrix, activate_plot = False, optimise = False): if(n <= 0): print("Erreur, veuillez entrer un nombre de test strictement positif\n") return "FAILED" else : Matrix_list = [] Compare_list_S = [] Compare_list_V = [] Compare_list_U = [] x = range(0,n) for i in range(0,n): Matrix_list.append(p2.forme_bidiagonale(rand_square_Matrix(len_matrix, 0,100))[2]) if (optimise == False): for i in range(0,n): Compare_list_U.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[0]) - (p3.SVD_preliminaire(Matrix_list[i])[0]))) Compare_list_S.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[1]) - (p3.SVD_preliminaire(Matrix_list[i])[1]))) Compare_list_V.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[2]) - (p3.SVD_preliminaire(Matrix_list[i])[2]))) if(activate_plot == True): mp.plot(x,Compare_list_U) mp.title("Comparaison entre U implemente et celui du svd de numpy") mp.show() mp.plot(x,Compare_list_S) mp.title("Comparaison entre S implemente et celui du svd de numpy") mp.show() mp.plot(x,Compare_list_V) mp.title("Comparaison entre V implemente et celui du svd de numpy") mp.show() else : Compare_list_U.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[0]) - (SVD_optimise(Matrix_list[i])[0]))) Compare_list_S.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[1]) - (SVD_optimise(Matrix_list[i])[1]))) Compare_list_V.append(np.linalg.norm((np.linalg.svd(Matrix_list[i])[2]) - (SVD_optimise(Matrix_list[i])[2]))) if(activate_plot == True): mp.plot(x,Compare_list_U) mp.title("Comparaison entre U implemente et celui du svd de numpy") mp.show() mp.plot(x,Compare_list_S) mp.title("Comparaison entre S implemente et celui du svd de numpy") mp.show() mp.plot(x,Compare_list_V) mp.title("Comparaison entre V implemente et celui du svd de numpy") mp.show() return "PASSED"
def test_QR_optimise (n, len_matrix, activate_plot = False): if(n <= 0): print("Erreur, veuillez entrer un nombre de test strictement positif\n") return "FAILED" else : Matrix_list = [] Compare_list_Q = [] Compare_list_R = [] x = range(0,n) for i in range(0,n): Matrix_list.append(p2.forme_bidiagonale(rand_square_Matrix(len_matrix, 0,100))[2]) for i in range(0,n): Compare_list_Q.append(np.linalg.norm((np.linalg.qr(Matrix_list[i])[0]) - (p3.QR_optimise(Matrix_list[i])[0]))) Compare_list_R.append(np.linalg.norm((np.linalg.qr(Matrix_list[i])[1]) - (p3.QR_optimise(Matrix_list[i])[1]))) if(activate_plot == True): mp.plot(x,Compare_list_Q) mp.title("Comparaison entre Q implemente et celui de numpy") mp.show() mp.plot(x,Compare_list_R) mp.title("Comparaison entre R implemente et celui de numpy") mp.show() return "PASSED"