From 4498d1af32a7133752928ae20172be37ca202ef6 Mon Sep 17 00:00:00 2001
From: Olivier Cots <olivier.cots@irit.fr>
Date: Mon, 12 May 2025 21:20:57 +0200
Subject: [PATCH] up direct-indirect

---
 tp/direct-indirect.ipynb | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/tp/direct-indirect.ipynb b/tp/direct-indirect.ipynb
index 003ebfa..7272224 100644
--- a/tp/direct-indirect.ipynb
+++ b/tp/direct-indirect.ipynb
@@ -59,7 +59,7 @@
     "\n",
     "✏️ **Exercice 1.**\n",
     "\n",
-    "1. Appliquez le PMP. Que pouvez-vous dire du contrôle maximisant ? \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 ?"
    ]
   },
@@ -80,11 +80,11 @@
     "Méthode directe\n",
     "</div>\n",
     "\n",
-    "Avant de définir la méthode directe, on propose une réécriture du problème. Notez que ce n'est pas une obligation en soi de la méthode mais cela simplifie les choses.\n",
+    "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.\n",
     "\n",
     "✏️ **Exercice 2.** \n",
     "\n",
-    "- Mettez le problème sous forme de Mayer (cf. cours). Vous nommerez la nouvelle variable d'état associée au coût $c(\\cdot)$."
+    "- Mettre le problème sous forme de Mayer (cf. cours). Vous nommerez la nouvelle variable d'état associée au coût $c(\\cdot)$."
    ]
   },
   {
@@ -101,7 +101,7 @@
     "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.\n",
     "2. On discrétise l'état, le contrôle et le coût sur cette grille et on note \n",
     "$$\n",
-    "X = \\{ (x_i, u_i, c_i) ~|~ i \\in \\{1, \\dots, N+1\\}\\}\n",
+    "\\{ (x_i, u_i, c_i) ~|~ i \\in \\{1, \\dots, N+1\\}\\}\n",
     "$$ \n",
     "l'ensemble des variables d'optimisation du problème discrétisé.\n",
     "\n",
@@ -110,12 +110,12 @@
     "x^*_i \\approx x^*(t_i), \\quad u^*_i \\approx u^*(t_i), \\quad c^*_i \\approx c^*(t_i), \\quad \\forall i \\in \\{1, \\dots, N+1\\}.\n",
     "$$\n",
     "\n",
-    "✏️ ️**Exercice 3.** Définissez pour le problème discrétisé : \n",
+    "✏️ ️**Exercice 3.** Définir pour le problème discrétisé : \n",
     "\n",
-    "1. l'objectif à minimiser en fonction d'une ou plusieurs composantes de $X$ bien choisies.\n",
-    "2. les contraintes d'inégalités associées au contrôle.\n",
-    "3. les contraintes initiales et finales associées à la variable d'état.\n",
-    "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)).\n"
+    "1. L'objectif à minimiser.\n",
+    "2. Les contraintes d'inégalités associées au contrôle.\n",
+    "3. Les contraintes initiales et finales associées à la variable d'état et la contrainte de condition initiale pour le coût.\n",
+    "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)).\n"
    ]
   },
   {
@@ -125,7 +125,7 @@
    "source": [
     "✏️ ️**Exercice 4.** \n",
     "\n",
-    "- Modifiez le code suivant afin de résoudre le problème par la méthode directe que vous venez de décrire.\n",
+    "- Modifier le code suivant afin de résoudre le problème par la méthode directe que vous venez de décrire.\n",
     "\n",
     "**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."
    ]
@@ -139,7 +139,7 @@
     "# Création du modèle JuMP, Utilisation de Ipopt comme solver\n",
     "sys = Model(optimizer_with_attributes(Ipopt.Optimizer, \"print_level\" => 5))\n",
     "set_optimizer_attribute(sys,\"tol\",1e-8)\n",
-    "set_optimizer_attribute(sys,\"constr_viol_tol\",1e-6)\n",
+    "set_optimizer_attribute(sys,\"constr_viol_tol\",1e-8)\n",
     "set_optimizer_attribute(sys,\"max_iter\",1000)\n",
     "\n",
     "#######\n",
@@ -161,8 +161,8 @@
     "Δt = (tf-t0)/N  # pas de temps\n",
     "\n",
     "@variables(sys, begin\n",
-    "    ...                # coût\n",
-    "    ...                # état\n",
+    "    ...       # coût\n",
+    "    ...       # état\n",
     "    ...       # control\n",
     "end)\n",
     "\n",
@@ -258,9 +258,9 @@
    "source": [
     "✏️ ️**Exercice 5.** \n",
     "\n",
-    "1. Commentez les résultats. \n",
-    "2. Modifiez la tolérance de l'optimiseur ainsi que le nombre de points de discrétisation. Commentaires.\n",
-    "3. Décrivez la structure du contrôle optimal en fonction du temps."
+    "1. Commenter les résultats. \n",
+    "2. Modifier la tolérance de l'optimiseur ainsi que le nombre de points de discrétisation. Commentaires.\n",
+    "3. Décrire la structure du contrôle optimal en fonction du temps."
    ]
   },
   {
@@ -280,12 +280,12 @@
     "Méthode de tir indirect\n",
     "</div>\n",
     "\n",
-    "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.\n",
+    "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.\n",
     "\n",
     "✏️ ️️**Exercice 6.** \n",
     "\n",
     "1. Donner la fonction de commutation.\n",
-    "2. En dérivant deux fois par rapport au temps la fonction de commutations, 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.\n",
+    "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.\n",
     "3. Remplir le code ci-dessous: il faut fournir les 3 contrôles pour définir les flots, puis écrire la fonction de tir.\n",
     "\n",
     "**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.\n"
-- 
GitLab