diff --git a/src/TP-Projet.ipynb b/src/TP-Projet.ipynb new file mode 100644 index 0000000..eb387da --- /dev/null +++ b/src/TP-Projet.ipynb @@ -0,0 +1,343 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "

TP-Projet d'optimisation numérique

\n", + "

Année 2020-2021 - 2e année département Sciences du Numérique

\n", + "

Nom:

\n", + "

Prénom:

\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Algorithme de Newton\n", + "## Implémentation \n", + " \n", + "1. Coder l’algorithme de Newton local tel que décrit dans la section *Algorithme de Newton* (fichier `Algorithme_De_Newton.jl`)\n", + "\n", + "2. Tester l’algorithme sur les fonctions $f_{1}$ , $f_{2}$ avec les points initiaux $x_{011}$ , $x_{012}$ (pour $f_{1}$ ) et $x_{021}$ , $x_{022}$ , $x_{023}$ (pour $f_{2}$ ) donnés en Annexe A." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-------------------------------------------------------------------------\n", + "\u001b[34m\u001b[1mRésultats de : Newton appliqué à f2 au point initial [0.0, 0.0050000000010000005]:\u001b[22m\u001b[39m\n", + " * xsol = [-4.999999586298179e9, 2.499999586298196e19]\n", + " * f(xsol) = 2.499999587298196e19\n", + " * nb_iters = 1\n", + " * flag = 3\n", + " * sol_exacte : [1, 1]\n", + "hess_f2(xmin) = [1.9999996690385565e22 1.9999998345192715e12; 1.9999998345192715e12 200.0]\n", + "cond(H) = 7.036873253299342e35\n", + "-------------------------------------------------------------------------\n", + "\u001b[34m\u001b[1mRésultats de : Newton appliqué à f2 au point initial [0.0, 0.0050000000010000005]:\u001b[22m\u001b[39m\n", + " * xsol = [-5.00000310473568e9, 2.5000031047354057e19]\n", + " * f(xsol) = 2.5015352823034896e19\n", + " * nb_iters = 2\n", + " * flag = 3\n", + " * sol_exacte : [1, 1]\n", + "hess_f2(xmin) = [2.0000024837898096e22 2.000001241894272e12; 2.000001241894272e12 200.0]\n", + "cond(H) = 4.0441857223131525e32\n", + "-------------------------------------------------------------------------\n", + "\u001b[34m\u001b[1mRésultats de : Newton appliqué à f2 au point initial [0.0, 0.0050000000010000005]:\u001b[22m\u001b[39m\n", + " * xsol = [-5.00000310271359e9, 2.5000031027145523e19]\n", + " * f(xsol) = 2.500003103714553e19\n", + " * nb_iters = 3\n", + " * flag = 3\n", + " * sol_exacte : [1, 1]\n", + "hess_f2(xmin) = [2.0000024821716417e22 2.0000012410854358e12; 2.0000012410854358e12 200.0]\n", + "cond(H) = Inf\n" + ] + }, + { + "ename": "SingularException", + "evalue": "SingularException(2)", + "output_type": "error", + "traceback": [ + "SingularException(2)", + "", + "Stacktrace:", + " [1] checknonsingular at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/factorization.jl:19 [inlined]", + " [2] checknonsingular at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/factorization.jl:21 [inlined]", + " [3] lu!(::Array{Float64,2}, ::Val{true}; check::Bool) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/lu.jl:85", + " [4] #lu#142 at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/lu.jl:273 [inlined]", + " [5] lu at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/lu.jl:272 [inlined] (repeats 2 times)", + " [6] \\(::Array{Float64,2}, ::Array{Float64,1}) at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/generic.jl:1116", + " [7] Algorithme_De_Newton(::typeof(f2), ::typeof(grad_f2), ::typeof(hess_f2), ::Array{Float64,1}, ::Array{Float64,1}) at /Users/gergaud/ENS/optinum/TP/OptinumProf/src/Algorithme_De_Newton.jl:61", + " [8] top-level scope at ./In[28]:70" + ] + } + ], + "source": [ + "#using Pkg; Pkg.add(\"LinearAlgebra\"); Pkg.add(\"Markdown\")\n", + "# using Documenter\n", + "using LinearAlgebra\n", + "using Markdown # Pour que les docstrings en début des fonctions ne posent\n", + " # pas de soucis. Ces docstrings sont utiles pour générer \n", + " # la documentation sous GitHub\n", + "include(\"Algorithme_De_Newton.jl\")\n", + "\n", + "# Affichage les sorties de l'algorithme des Régions de confiance\n", + "function my_afficher_resultats(algo,nom_fct,point_init,xmin,fxmin,flag,sol_exacte,nbiters)\n", + "\tprintln(\"-------------------------------------------------------------------------\")\n", + "\tprintstyled(\"Résultats de : \",algo, \" appliqué à \",nom_fct, \" au point initial \", point_init, \":\\n\",bold=true,color=:blue)\n", + "\tprintln(\" * xsol = \",xmin)\n", + "\tprintln(\" * f(xsol) = \",fxmin)\n", + "\tprintln(\" * nb_iters = \",nbiters)\n", + "\tprintln(\" * flag = \",flag)\n", + "\tprintln(\" * sol_exacte : \", sol_exacte)\n", + "end\n", + "\n", + "# Fonction f0\n", + "# -----------\n", + "f0(x) = sin(x)\n", + "# la gradient de la fonction f0\n", + "grad_f0(x) = cos(x)\n", + "# la hessienne de la fonction f0\n", + "hess_f0(x) = -sin(x)\n", + "sol_exacte = -pi/2\n", + "x0 = -pi/2+0.5\n", + "options = []\n", + "xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f0,grad_f0,hess_f0,x0,options)\n", + "#my_afficher_resultats(\"Newton\",\"f0\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + "\n", + "# Fonction f1\n", + "# -----------\n", + "f1(x) = 2*(x[1]+x[2]+x[3]-3)^2 + (x[1]-x[2])^2 + (x[2]-x[3])^2\n", + "# la gradient de la fonction fct1\n", + "function grad_f1(x)\n", + " y1 = 4*(x[1]+x[2]+x[3]-3) + 2*(x[1]-x[2])\n", + " y2 = 4*(x[1]+x[2]+x[3]-3) - 2*(x[1]-x[2]) +2*(x[2]-x[3])\n", + " y3 = 4*(x[1]+x[2]+x[3]-3) - 2*(x[2]-x[3])\n", + " return [y1;y2;y3]\n", + "end\n", + "# la hessienne de la fonction fct1\n", + "hess_f1(x) = [6 2 4;2 8 2;4 2 6]\n", + "sol_exacte = [1;1;1]\n", + "options = []\n", + "x0 = [1; 0; 0]\n", + "xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f1,grad_f1,hess_f1,x0,options)\n", + "#my_afficher_resultats(\"Newton\",\"f1\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + "x0 = [10; 3; -2.2]\n", + "xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f1,grad_f1,hess_f1,x0,options)\n", + "#my_afficher_resultats(\"Newton\",\"f1\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + "\n", + "f2(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2\n", + "grad_f2(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]\n", + "hess_f2(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]\n", + "sol_exacte = [1;1]\n", + "options = []\n", + "x0 = [-1.2; 1]\n", + "x0 = sol_exacte\n", + "xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f2,grad_f2,hess_f2,x0,options)\n", + "#my_afficher_resultats(\"Newton\",\"f2\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + "x0 = [10.; 0]\n", + "xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f2,grad_f2,hess_f2,x0,options)\n", + "#my_afficher_resultats(\"Newton\",\"f2\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + "x0 = [0 ; 1/200+1/1.e12]\n", + "options = [1 ; sqrt(eps()) ; 1e-15]\n", + "for i in 1:5\n", + " options[1] = i\n", + " xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f2,grad_f2,hess_f2,x0,options)\n", + " my_afficher_resultats(\"Newton\",\"f2\",x0,xmin,f_min,flag,sol_exacte,nb_iters)\n", + " H = hess_f2(xmin)\n", + " println(\"hess_f2(xmin) = \",H)\n", + " println(\"cond(H) = \", cond(H))\n", + "end\n", + "println(grad_f2(x0))\n", + "println(hess_f2(x0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interprétation \n", + "\n", + "justifier que\n", + "\n", + "1. l’algorithme implémenté converge en une itération pour $f_{1}$;\n", + "\n", + "2. l’algorithme puisse ne pas converger pour $f_{2}$ avec certains points initiaux." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vos réponses?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Régions de confiance avec pas de cauchy \n", + "\n", + "## Implémentation \n", + "\n", + "1. Coder l'algorithme du pas de Cauchy d’un sous-problème de\n", + "régions de confiance (fichier `Pas_De_Cauchy.jl`). Tester sur les quadratiques proposées en Annexe B.\n", + "\n", + "2. Coder l'algorithme de régions de confiance (fichier `Regions_De_Confiance.jl`). Tester sur les problèmes de l’Annexe A." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Vos tests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interprétation \n", + "\n", + "1. Quelle relation lie la fonction test $f_1$ et son modèle de Taylor à l’ordre 2 ? Comparer alors les performances de Newton et RC-Pas de Cauchy sur cette fonction.\n", + "\n", + "2. Le rayon initial de la région de confiance est un paramètre important dans l’analyse\n", + "de la performance de l’algorithme. Sur quel(s) autre(s) paramètre(s) peut-on jouer\n", + "pour essayer d’améliorer cette performance ? Étudier l’influence d’au moins deux de\n", + "ces paramètres." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vos réponses?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Régions de confiance avec gradient conjugué tronqué\n", + "\n", + "## Implémentation \n", + "\n", + "1. Implémenter l’algorithme du Gradient Conjugué Tronqué, en se basant sur le cours (fichier `Gradient_Conjugue_Tronque.jl`).\n", + "On validera les résultats sur les fonctions de l’Annexe C.\n", + "\n", + "2. Intégrer finalement l’algorithme du Gradient Conjugué Tronqué dans le code de\n", + "régions de confiance, et appliquer ce code pour résoudre les exemples proposés en\n", + "Annexe A." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Vos tests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interprétation \n", + "\n", + "1. Comparer la décroissance obtenue avec celle du pas de Cauchy, en retournant, dans\n", + "un premier temps le dernier itéré admissible à courbure positive (c’est à dire, que si\n", + "l’une ou l’autre des deux conditions (b) ou (d) sont rencontrées dans l’algorithme 3,\n", + "alors on ne calcule pas ``σ_{j}`` et on retourne le dernier itéré ``s_{j}`` directement).\n", + "\n", + "2. Comparer la décroissance obtenue avec celle du pas de Cauchy, en imposant la sortie\n", + "dans l’algorithme 3 au bout d’une itération seulement. Que remarquez vous ?\n", + "\n", + "3. Comparer la décroissance obtenue avec celle du pas de Cauchy dans le cas général.\n", + "\n", + "4. Quels sont les avantages et inconvénients des deux approches ?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vos réponses?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lagrangien augmenté\n", + "\n", + "## Implémentation\n", + "1.Choisir des critères d’arrêt pour la convergence de l'algorithme.\n", + "\n", + "2.Implémenter l'algorithme du lagrangien augmenté, en utilisant les différentes méthodes\n", + "qui ont été vues en première partie pour la résolution de la suite de problémes sans\n", + "contraintes (fichier `Lagrangien_Augmente.jl`)\n", + " \n", + "3.Tester les différentes variantes sur les problèmes en Annexe D.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Vos tests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interprétation\n", + " 1.Commenter les résultats obtenus, en étudiant notamment les valeurs de $\\lambda_k$ et $\\mu_k$.\n", + " \n", + " 2.Étudier l'influence du paramètre $\\tau$ dans la performance de l'algorithme.\n", + " \n", + " 3.**Supplémentaire** : \n", + " Que proposez-vous comme méthode pour la résolution des problèmes avec\n", + " des contraintes à la fois d'égalité et d'inégalité ? Implémenter (si le temps le permet)\n", + " ce nouvel algorithme\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vos réponses?\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.4.1", + "language": "julia", + "name": "julia-1.4" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.4.1" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}