# -*- coding: utf-8 -*-
"""
Created on Wed Feb 14 23:06:10 2018

@author: jaramillo
"""

#%% On importe les modules NumPy et Scipy
import numpy as np
from scipy import linalg as LA

#Nous pouvons introduire une matrice comme un array
A = np.array([[1,2], [3,4]])
print(A)
print(A.shape) ##nous donne la taille de la matrice
print("")
#%%
#On introduit un vector et une nouvelle matrice,
B =  np.array([[5,6], [7,8]])
print(B)
print("")
b = np.array([[1],[2]])
print(b)
print(b.shape)
print("")
#on peut definir des produits matricielles de la mani`ere
#suivante
AB = np.dot(A,B)
print(AB)
Ab = np.dot(A,b)
print(Ab)

#%% matrix
#Une approche alternative en NumPy, plus adaptée à la notation
#mathématique, utilise la notion de matrix
A_M = np.matrix([[1,2], [3,4]])
print(A_M)
print(A_M.shape)
print("")
B_M =  np.matrix([[5,6], [7,8]])
print(B_M)
print("")
b_M = np.matrix([[1],[2]])
print(b_M.shape)
print(b_M)
print("")
#on peut definir des produits matricielles de la mani`ere
#suivante
AB_M = A_M*B_M
print(AB_M)
Ab_M = A_M*b_M
print(Ab_M)


#%% calcul d'inverses
AI = LA.inv(A)
AI_M = LA.inv(A_M)
print(AI)
print(AI_M)
#%% calcul de transposées
AT = np.transpose(A)
AT_M = np.transpose(A_M)
print("")
print(AT)
print(AT_M)




#%%Exercice 1 : 
#
#i) Calculer les déterminants, transposé, trace de la matrice A
#
#ii) Définir une matrice A (inversible) et un vecteur b et résoudre Ax=b.
#Vérifier le calcul en calculant A^{-1}b



#%% Exercice 2 : Visualisation d'une matrice
# Construire une fonction " visualisation_matrice(A) " en utilisant comme
# point de départ les lignes suivantes

from matplotlib import pyplot as plt
plt.close()
plt.imshow(A, interpolation='nearest', cmap=plt.cm.gray_r)
plt.colorbar()
plt.show()



def visualisation_matrice(A):
    "Visualisation qualitative d'une matrice"


#%% Appliquer cette fonction à la matrice aléatoire de taille ndim x ndim
ndim = 25
A= np.random.rand(ndim,ndim)


#%%Calcul de valeurs propres et vecteurs propres avec python
A = np.array([[1, 2], [3, 4]])
valeurs_propres, vecteurs_propres = LA.eig(A)

print(valeurs_propres)
print(vecteurs_propres)
  
#%% Exercice 3 : Construire une fonction python qui détermine si une matrice est diagonalisable
def test_diagonalisable(A, epsilon):
    "test_diagonalisable(A, epsilon) calcule le determinant de une matrice de vecteurs propres de A et calcule son determinante pour verifier s'ils sont linéairement indépendents  "
   

#%% Exercice 4 : Application a la matrice
## Construction de la matrice
# ⎛ 0 1 0   ... 0 ⎞
# ⎜ 0 0 1   ... 0 ⎟
# ⎜ 0 0 0 1 ... 0 ⎟
# ⎜      ...      ⎟
# ⎜ 0 0 0 0 ... 1 ⎟
# ⎝ 0 0 0 0 ... 0 ⎠
#Montrer, de manière mathématique et en utilisant la fonction "test_diagonalisable",
#que cette matrice n'est pas diagonalisable.


#%% Exercice 5 : Matrices du Laplacien 1-D: répondre aux questions dans l'exercice 5.
# i) Définir une fonction en python qui construit la matrice ∆_n.
# ii) Pour une matrice ∆_n, avec un choix de $n$ arbitraire,
#      déterminer avec la fonction construite en python si elle est diagonalisable.
#iii) Afficher la structure qualitative de la matrice  $\Delta_n$ avec la fonction
#     visualisation_matrice(A).
#iv) Calculer et afficher les valeurs propres de ∆_n.
#v) Montrer graphiquement a distribution de valeurs propres.
#vi) Explorer l'effet sur la distribution de valeurs propre de l'addition
#      des matrices epsilon B, avec epsilon petit (EXERCICE D'EXPLORATION !)




#%% Exercice 6 : Méthode la puissance.
# 1. Construire une fonction qui rends la valeur propre avec plus grande valeur absolue
#2. Comparer le résultat avec celui obtenu avec la fonction eig() pour une matrice aléatoire
#de taille 25 x 25



#%% Exercice 7 : Decomposition QR
# Déterminer avec python la décomposition QR de la matrice ∆_7 .
#Montrer (numériquement que les vecteurs colonne de la matrice Q sont ortho-
#gonaux. Raisonner si les vecteurs lignes doivent être orthogonaux.



#%% Exercice 8 : Méthode QR pour le calcul de valeurs propres
# Répondre aux points dans l'exercice 8. 
# Pour exporter la figure en pdf, utiliser
plt.close()
plt.imshow(A, interpolation='nearest', cmap=plt.cm.gray_r)
plt.colorbar()
plt.savefig("matrix_QR.pdf")







 


