"✏️ **Exercice 1.** On supposera $p^0 = -1$, on se place dans le cas normal.\n",
"\n",
"1. Calculer le contrôle maximisant donné par le principe du maximum de Pontryagin (on pourra l'écrire comme une [fonction multivaluée](https://fr.wikipedia.org/wiki/Fonction_multivaluée)) .\n",
"2. Peut-on appliquer simplement la méthode de tir simple vu au TP précédent ?"
Le but est de résoudre par une méthode de tir, un problème de contrôle optimal dont le contrôle est discontinu. On se propose de résoudre dans un premier temps, le problème par une méthode directe, afin de déterminer la structure optimale et une bonne approximation de la solution pour faire converger la méthode de tir.
%% Cell type:code id: tags:
``` julia
usingJuMP,Ipopt# pour la méthode directe
usingDifferentialEquations,NLsolve,ForwardDiff# pour la méthode indirecte
usingPlots# pour les graphiques
include("utils.jl");# fonctions utilitaires
```
%% Cell type:markdown id: tags:
<div style="width:95%;
margin:10px;
padding:8px;
color:white;
background-color: rgb(46, 109, 4);
border-radius:10px;
font-weight:bold;
font-size:1.5em;
text-align:center;">
Introduction
</div>
On considère le problème de contrôle optimal suivant :
✏️ **Exercice 1.** On supposera $p^0 = -1$, on se place dans le cas normal.
1. Calculer le contrôle maximisant donné par le principe du maximum de Pontryagin (on pourra l'écrire comme une [fonction multivaluée](https://fr.wikipedia.org/wiki/Fonction_multivaluée)) .
2. Peut-on appliquer simplement la méthode de tir simple vu au TP précédent ?
%% Cell type:markdown id: tags:
<div style="width:95%;
margin:10px;
padding:8px;
color:white;
background-color: rgb(46, 109, 4);
border-radius:10px;
font-weight:bold;
font-size:1.5em;
text-align:center;">
Méthode directe
</div>
Avant de définir la méthode directe, on propose une réécriture du problème. Ce n'est pas une obligation mais cela simplifie l'écriture.
✏️ **Exercice 2.**
- Mettre le problème sous forme de Mayer (cf. cours). Vous nommerez la nouvelle variable d'état associée au coût $c(\cdot)$.
%% Cell type:markdown id: tags:
**Description de la méthode directe.**
L'idée principale est de transformer le problème de contrôle optimal (de dimension infinie) en un problème d'optimisation de dimension finie.
Pour cela :
1. On définit une grille uniforme en temps $(t_1, \dots, t_{N+1})$ où $t_1 = 0$ et $t_{N+1} = t_f$ avec $\Delta t = (t_f - t_0)/N$ le pas de discrétisation.
2. On discrétise l'état, le contrôle et le coût sur cette grille et on note
$$
\{ (x_i, u_i, c_i) ~|~ i \in \{1, \dots, N+1\}\}
$$
l'ensemble des variables d'optimisation du problème discrétisé.
Si l'on note $(x^*(\cdot), u^*(\cdot), c^*(\cdot))$ la solution du problème de contrôle optimal et $\{ (x^*_i, u^*_i, c^*_i) ~|~ i \in \{1, \dots, N+1\}\}$ la solution du problème discrétisé, on s'attend à avoir
✏️ ️**Exercice 3.** Définir pour le problème discrétisé :
1. L'objectif à minimiser.
2. Les contraintes d'inégalités associées au contrôle.
3. Les contraintes initiales et finales associées à la variable d'état et la contrainte de condition initiale pour le coût.
4. Les contraintes de dynamique sur l'état et le coût, en utilisant le schéma d'intégration de Crank-Nicolson (ou [règle des Trapèzes](https://fr.wikipedia.org/wiki/M%C3%A9thode_des_trap%C3%A8zes)).
%% Cell type:markdown id: tags:
✏️ ️**Exercice 4.**
- Modifier le code suivant afin de résoudre le problème par la méthode directe que vous venez de décrire.
**Remarque.** Vous pouvez vous inspirer de cet [exemple](https://ct.gitlabpages.inria.fr/gallery/goddard-j/goddard.html) pour le code. Notez que dans cet exemple, la fonction `@NLexpressions` est utilisée mais n'est pas nécessaire ici donc vous pouvez ou non l'utiliser.
%% Cell type:code id: tags:
``` julia
# Création du modèle JuMP, Utilisation de Ipopt comme solver
2. Modifier la tolérance de l'optimiseur ainsi que le nombre de points de discrétisation. Commentaires.
3. Décrire la structure du contrôle optimal en fonction du temps.
%% Cell type:markdown id: tags:
<div style="width:95%;
margin:10px;
padding:8px;
color:white;
background-color: rgb(46, 109, 4);
border-radius:10px;
font-weight:bold;
font-size:1.5em;
text-align:center;">
Méthode de tir indirect
</div>
D'après la condition de maximisation du hamiltonien et la structure optimale de la solution, nous avons besoin de définir 3 fonctions permettant de calculer les flots des systèmes hamiltoniens associés aux contrôles +1, -1 et au contrôle dit **singulier** qui apparaît lorsque la **fonction de commutation** reste nulle sur un intervalle de temps non réduit à un singleton. La fonction de commutation est la fonction qui détermine la valeur du contrôle en fonction du signe de celle-ci.
✏️ ️️**Exercice 6.**
1. Donner la fonction de commutation.
2. En dérivant deux fois par rapport au temps la fonction de commutation, trouver une condition vérifiée par l'état et une condition vérifiée par le contrôle le long d'un arc singulier, c'est-à-dire le long d'un arc où la fonction de commutation est constante égale à 0.
3. Remplir le code ci-dessous: il faut fournir les 3 contrôles pour définir les flots, puis écrire la fonction de tir.
**Remarque.** La fonction de tir à 3 variables inconnues. Il faut donc trouver 3 équations. La condition terminale en est une. L'annulation de la fonction de commutation au premier temps de commutation en est une autre. La question 2 aide à trouver la dernière condition.
%% Cell type:code id: tags:
``` julia
# système pseudo-hamiltonien
function hv(x,p,u)
return[u,2x]
end
# systèmes hamiltoniens
hv_min(x,p)=hv(x,p,NaN)## REMPLACER NaN par la bonne valeur
hv_max(x,p)=hv(x,p,NaN)## REMPLACER NaN par la bonne valeur
hv_sin(x,p)=hv(x,p,NaN)## REMPLACER NaN par la bonne valeur
# flots
fmin=Flow(hv_min)
fmax=Flow(hv_max)
fsin=Flow(hv_sin)
# fonction de tir
function shoot(p0,t1,t2)
# integration
x1,p1=fmin(t0,x0,p0,t1)# x1, p1 sont des scalaires
x2,p2=fsin(t1,x1,p1,t2)
x3,p3=fmax(t2,x2,p2,tf)
# conditions
s=zeros(eltype(p0),3)
s[1]=NaN## REMPLACER NaN par la bonne expression
s[2]=NaN## REMPLACER NaN par la bonne expression
s[3]=NaN## REMPLACER NaN par la bonne expression
returns
end;
```
%% Cell type:markdown id: tags:
4. Trouver (remplir le code ci-dessous) à partir de la solution de la méthode directe, une bonne initialisation pour la fonction de tir.