Problème: minimisation de l'énergie de Dirichlet sous contraintes

$\newcommand{\Rsp}{\mathbb{R}} \newcommand{\nr}[1]{\Vert#1\Vert}$ Dans toute la suite, on supposera que $n=30$. La solution du problème de minimisation (P) a été calculée et est stockée dans le vecteur xsol (ce qui permettra d'étudier la vitesse de convergence des deux algorithmes considérés):

In [7]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

n = 30
i1 = 10
i2 = 20
t = np.linspace(0,1,n)

# solution exacte du problème
xsol = np.zeros(30)
xsol[0:11] = np.linspace(0,1,12)[1:]
xsol[10:21] = np.linspace(1,-1,11)
xsol[20:30] = np.linspace(-1,0,11)[:-1]
plt.plot(xsol)
Out[7]:
[<matplotlib.lines.Line2D at 0x7f1842ede358>]

Première approche: gradient projeté

QN1. Calculer la matrice $G$ décrite dans le sujet. Écrire une fonction projK calculant la projection d'un vecteur $x \in \Rsp^n$ sur le convexe $K$.

In [10]:
 

QN2 Implémenter l'algorithme de gradient projeté décrit dans la première partie du sujet:

  • Le pas de temps $\tau$ sera choisi égal à $0.5$
  • On effectuera $N = 500$ itérations, et on tracera la courbe d'erreur $k \mapsto \nr{x^{(k)} - xsol}$ en échelle logarithmique.
In [ ]:
 

QN3 Illustrer l'instabilité de l'algorithme pour $\tau > .5$.

In [ ]:
 

Deuxième approche: algorithme d'Uzawa

QN4. Calculer la matrice $B$ décrite dans le sujet. Écrire une fonction projP calculant la projection d'un vecteur $\lambda \in \Rsp^2$ sur $\Rsp_+^{2}$.

In [ ]:
 

QN5 Implémenter l'algorithme d'Uzawa décrit dans la deuxième partie du sujet:

  • Le pas de temps $\tau$ sera choisi égal à $1/\Lambda,$ où $\Lambda$ est la plus grande valeur propre de la matrice $R = B(G^T G)^{-1} B^T$ (on rappelle np.linalg.eigh(B)[0] permet de calculer les valeurs propres d'une matrice symétrique B)..
  • On effectuera $N = 80$ itérations, et on tracera la courbe d'erreur $k \mapsto \nr{x^{(k)} - xsol}$ en échelle logarithmique.
In [ ]: