import numpy as np
import matplotlib.pyplot as plt
On rappelle l'algorithme de recherche de la plus grande valeur propre de $A\in M_n(\mathbb{C})$. On pose $x_0\in\mathbb{C}^n$ puis $$x_{k+1}=\frac{Ax_k}{\Vert A x_{k}\Vert_2}.$$ Quand on arrête le processus à $k_0$, on pose alors $x_1=\frac{x_{k_0}}{\Vert x_{k_0}\Vert_2}$ et $$\lambda_1=\frac{\langle Ax_{k_0},x_{k_0}\rangle}{\Vert x_{k_0}\Vert_2^2}.$$
On considère la matrice $$A=\begin{pmatrix} 2&-1&0& 0&\ldots&0\\ -1&2&-1 &0&\ddots&\vdots\\ 0&\ddots&\ddots&\ddots&\ddots&0\\ 0&\ddots&\ddots&\ddots&\ddots&0\\ \vdots&\ddots&0&-1 &2&-1\\ 0&\dots&0&0&-1&2 \end{pmatrix}.$$
### Construction de A
eig
pour trouver une approximation des valeurs propres $\lambda_1>\dots>\lambda_n$ de la matrice $A$. Recopier $\lambda_1$ et $\lambda_n$.###valeurs propres de A
####méthode de la puissance
###autre initialisation
####Evolution du temps de calculs en fonction de n
Pourquoi cet algorithme doit permettre de trouver $\lambda_n$ ? Reprendre la question 3. pour calculer $\lambda_n$ en implémentant l'algorithme précédent.
###méthode de la pusisance inverse
###matrice customisée
8.Reprendre les questions 3, 5 et 6 avec cette matrice. Pourquoi le nombre d'itérations est-il plus élevé ? (Comparer par exemple les valeurs propres de cette matrice par rapport à celle de la question 3.).
## Question 3. 5 et 6
On revient maintenant sur l matrice $$A=\begin{pmatrix} 2&-1&0& 0&\ldots&0\\ -1&2&-1 &0&\ddots&\vdots\\ 0&\ddots&\ddots&\ddots&\ddots&0\\ 0&\ddots&\ddots&\ddots&\ddots&0\\ \vdots&\ddots&0&-1 &2&-1\\ 0&\dots&0&0&-1&2 \end{pmatrix},$$ avec $n=10$. On souhaite estimer l'ensemble des valeurs propre de $A$. Pour cela on remarquera que comme $A$ est symétrique, ses vecteurs propres forment une base orthonormée. Ainsi, on peut facilement montrer que, en notant $v_{1} , \ldots , v_{n}$ des vecteurs propres unitaires asociés à $\lambda_{1}> ...> \lambda_{n}$, la matrice $$ A^{(1)} = A - \lambda_{1} v_{1}v_{1}^{T} $$ a $0 , \lambda_{2} , \ldots , \lambda_{n}$ comme valeurs propres, et $v_{1} , \ldots v_{n}$ comme vecteurs propres associés. De manière générale, la matrice $$ A^{(\ell)} = A - \sum_{i=1}^{\ell}\lambda_{i} v_{i}v_{i}^{T} = A^{(\ell-1)} - \lambda_{\ell}v_{\ell}v_{\ell}^{T} $$ a pour valeurs propres $0 , \ldots , 0 , \lambda_{\ell +1} , \ldots , \lambda_{n}$ et pour vecteurs propres $v_{1} , \ldots v_{n}$. Estimer toutes les valeurs propres. Pour assurer que l'intialisation vérifie les bonnes propriétés, on prendra $x_{0}= w/\|w\|$ avec $w$ tiré selon une loi normale grâce à la fonction np.random.normal. On pourra également utiliser la fonction np.outer pour le produit de vecteurs. Enfin, on pourra utiliser la fonction suivante:
def pow_method(A, x0, tol=1e-6, max_iter=1000):
x = x0
for i in range(max_iter):
Ax = np.dot(A, x)
xnew = Ax / np.linalg.norm(Ax)
if np.linalg.norm(xnew - x) < tol:
break
x=xnew
lambda_max = np.dot(x, A @ x)/np.linalg.norm(x)**2
return lambda_max, xnew/np.linalg.norm(xnew)