fin de projet

This commit is contained in:
Laureηt 2021-12-17 17:12:31 +01:00
parent 99ce6be786
commit 484273f683
No known key found for this signature in database
GPG key ID: D88C6B294FD40994
5 changed files with 523 additions and 182 deletions

View file

@ -5,20 +5,62 @@
"metadata": {}, "metadata": {},
"source": [ "source": [
"<center>\n", "<center>\n",
"<h1> TP-Projet d'optimisation numérique </h1>\n", "<h1>\n",
"<h1> Année 2020-2021 - 2e année département Sciences du Numérique </h1>\n", "TP-Projet d'optimisation numérique <br/>\n",
"<h1> Nom: FAINSIN </h1>\n", "2ème année département Sciences du Numérique <br/>\n",
"<h1> Prénom: Laurent </h1> \n", "2021-2022 <br/>\n",
"FAINSIN Laurent\n",
"</h1>\n",
"</center>" "</center>"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 30,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Status\u001b[22m\u001b[39m `~/.julia/environments/v1.7/Project.toml`\n",
" \u001b[90m [0c46a032] \u001b[39mDifferentialEquations v6.20.0\n",
" \u001b[90m [bd48cda9] \u001b[39mGraphRecipes v0.5.8\n",
" \u001b[90m [86223c79] \u001b[39mGraphs v1.4.1\n",
" \u001b[90m [91a5bcdd] \u001b[39mPlots v1.25.1\n",
" \u001b[90m [a6016688] \u001b[39mTestOptinum v0.1.0 `https://github.com/mathn7/TestOptinum.git#master`\n",
" \u001b[90m [37e2e46d] \u001b[39mLinearAlgebra\n",
" \u001b[90m [d6f4376e] \u001b[39mMarkdown\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n",
"\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n",
"\u001b[32m ✓ \u001b[39mTestOptinum\n",
" 1 dependency successfully precompiled in 2 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n",
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n",
"\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n",
"\u001b[32m ✓ \u001b[39mTestOptinum\n",
" 1 dependency successfully precompiled in 2 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n",
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Project.toml`\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.7/Manifest.toml`\n",
"\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n",
"\u001b[32m ✓ \u001b[39mTestOptinum\n",
" 1 dependency successfully precompiled in 2 seconds (262 already precompiled, 2 skipped during auto due to previous errors)\n"
]
}
],
"source": [ "source": [
"include(\"../test/imports_boilerplate.jl\")" "include(\"../test/imports_boilerplate.jl\");\n",
"afficher = true;"
] ]
}, },
{ {
@ -26,20 +68,121 @@
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Algorithme de Newton\n", "# Algorithme de Newton\n",
"## Implémentation \n", "\n",
"### Implémentation \n",
" \n", " \n",
"1. Coder lalgorithme de Newton local tel que décrit dans la section *Algorithme de Newton* (fichier `Algorithme_De_Newton.jl`)\n", "1. Coder lalgorithme de Newton local tel que décrit dans la section *Algorithme de Newton* (fichier `Algorithme_De_Newton.jl`)\n",
"\n",
"2. Tester lalgorithme 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." "2. Tester lalgorithme 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", "cell_type": "code",
"execution_count": null, "execution_count": 31,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct0 au point initial sol_exacte :\u001b[22m\u001b[39m\n",
" * xsol = -1.5707963267948966\n",
" * f(xsol) = -1.0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = -1.5707963267948966\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct0 au point initial x001 :\u001b[22m\u001b[39m\n",
" * xsol = -1.5707963267949088\n",
" * f(xsol) = -1.0\n",
" * nb_iters = 3\n",
" * flag = 0\n",
" * sol_exacte = -1.5707963267948966\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct0 au point initial x002 :\u001b[22m\u001b[39m\n",
" * xsol = 1.5707963267948966\n",
" * f(xsol) = 1.0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = -1.5707963267948966\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct1 au point initial sol_exacte :\u001b[22m\u001b[39m\n",
" * xsol = [1, 1, 1]\n",
" * f(xsol) = 0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct1 au point initial x011 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0000000000000002, 1.0, 0.9999999999999998]\n",
" * f(xsol) = 9.860761315262648e-32\n",
" * nb_iters = 1\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct1 au point initial x012 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0, 0.9999999999999996, 0.9999999999999982]\n",
" * f(xsol) = 1.1832913578315177e-29\n",
" * nb_iters = 1\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct1 au point initial sol_exacte :\u001b[22m\u001b[39m\n",
" * xsol = [1, 1, 1]\n",
" * f(xsol) = 0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct2 au point initial x021 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9999999999999999, 0.9999999999814724]\n",
" * f(xsol) = 3.4326461875363225e-20\n",
" * nb_iters = 6\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct2 au point initial x022 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0, 1.0]\n",
" * f(xsol) = 0.0\n",
" * nb_iters = 5\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : algorithme de Newton appliqué à fct2 au point initial x022 :\u001b[22m\u001b[39m\n",
" * xsol = [-4.99999958629818e9, 8.673617379884035e-19]\n",
" * f(xsol) = 6.249997931491155e40\n",
" * nb_iters = 1\n",
" * flag = 3\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : stagnation x de Newton appliqué à fct0 au point initial [0.9999, 0.9999, 0.9999] :\u001b[22m\u001b[39m\n",
" * xsol = [0.999899999, 0.999899999, 0.999899999]\n",
" * f(xsol) = 1.8000360001799175e-7\n",
" * nb_iters = 1\n",
" * flag = 1\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : stagnation f(x) de Newton appliqué à fct2 au point initial [100.0, 100.0] :\u001b[22m\u001b[39m\n",
" * xsol = [1.0000000000000073, 0.9999999975412127]\n",
" * f(xsol) = 6.045706979316412e-16\n",
" * nb_iters = 4\n",
" * flag = 2\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : itermax de Newton appliqué à fct2 au point initial x021 :\u001b[22m\u001b[39m\n",
" * xsol = [0.7631148711762008, -3.1750338547475616]\n",
" * f(xsol) = 1411.8451793091335\n",
" * nb_iters = 2\n",
" * flag = 3\n",
" * sol_exacte = [1, 1]\n",
"\u001b[0m\u001b[1mTest Summary: | \u001b[22m\u001b[32m\u001b[1mPass \u001b[22m\u001b[39m\u001b[36m\u001b[1mTotal\u001b[22m\u001b[39m\n",
"L'algo de Newton | \u001b[32m 24 \u001b[39m\u001b[36m 24\u001b[39m\n"
]
}
],
"source": [ "source": [
"tester_algo_newton(false, Algorithme_De_Newton)" "# les fonctions de l'annexe A + f0 sont dans les tests\n",
"tester_algo_newton(afficher, Algorithme_De_Newton);"
] ]
}, },
{ {
@ -48,140 +191,356 @@
"source": [ "source": [
"## Interprétation \n", "## Interprétation \n",
"\n", "\n",
"Justifier\n", "### Justifier\n",
"\n", "\n",
"1. les résultats obtenus pour l'exemple $f_0$ ci-dessus;\n", "1. les résultats obtenus pour l'exemple $f_0$ ci-dessus;\n",
"\n",
"2. que lalgorithme implémenté converge en une itération pour $f_{1}$;\n", "2. que lalgorithme implémenté converge en une itération pour $f_{1}$;\n",
"3. que lalgorithme puisse ne pas converger pour $f_{2}$ avec certains points initiaux.\n",
"\n", "\n",
"3. que lalgorithme puisse ne pas converger pour $f_{2}$ avec certains points initiaux." "### Vos réponses?\n",
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vos réponses?\n",
"La méthode de Newton repose sur la recherche des solutions de $\\nabla f(x) = 0$, cet algorithme recherche donc les extremums de $f$ et non uniquement ses minimas.\n", "La méthode de Newton repose sur la recherche des solutions de $\\nabla f(x) = 0$, cet algorithme recherche donc les extremums de $f$ et non uniquement ses minimas.\n",
"\n", "\n",
"\n",
"1.\n", "1.\n",
" 1. Dans le cas où $x_0 = x_{sol}$, les tests de convergence arretent l'algorithme (et rien ne se passe)\n", " 1. Dans le cas où $x_0 = x_{sol}$, les tests de convergence arretent l'algorithme (et rien ne se passe, on a déjà la solution)\n",
" \n",
" 2. Dans le cas où $x_0 = \\frac{1-\\pi}{2}$, l'algorithme trouve une racine de $cos(x)$ en seulement 2 itérations.\n", " 2. Dans le cas où $x_0 = \\frac{1-\\pi}{2}$, l'algorithme trouve une racine de $cos(x)$ en seulement 2 itérations.\n",
" \n",
" 3. Dans le cas où $x_0 = \\frac\\pi2$, l'algorithme tombe immédiatement sur une racine de $cos(x)$, il s'arrête mais la solution est un maximum et non un minimum.\n", " 3. Dans le cas où $x_0 = \\frac\\pi2$, l'algorithme tombe immédiatement sur une racine de $cos(x)$, il s'arrête mais la solution est un maximum et non un minimum.\n",
"\n", "\n",
"2. \n", "2. \n",
" 1. $x_0 = x_{sol}$, donc la convergence en une itération est cohérent.\n", " 1. $x_0 = x_{sol}$, donc la convergence en une itération est cohérent.\n",
" \n",
" 2. $x_0 = [1, 0, 0]$, $\\nabla^2f(x_0) \\setminus \\nabla f (x_0) ~= [0, -1, -1]$. Ainsi après une itération, on retombe sur $[1, 1, 1]$, qui est un minimum de f1.\n", " 2. $x_0 = [1, 0, 0]$, $\\nabla^2f(x_0) \\setminus \\nabla f (x_0) ~= [0, -1, -1]$. Ainsi après une itération, on retombe sur $[1, 1, 1]$, qui est un minimum de f1.\n",
" \n",
" 3. $x_0 = [10, 3, -2.2]$, on a le même scénario que précédemment : $\\nabla^2f(x_0) \\setminus \\nabla f (x_0) ~= [9, 2, -3.2]$.\n", " 3. $x_0 = [10, 3, -2.2]$, on a le même scénario que précédemment : $\\nabla^2f(x_0) \\setminus \\nabla f (x_0) ~= [9, 2, -3.2]$.\n",
"\n", "\n",
"3. $f_2$ ne peut pas converger dans le cas où $x_0= [0, \\frac1{200} + 10^{-12}]$ puisque à partir d'une certaine itération, la hessienne possède des coefficients trop grand et devient numériquement non inversible." "3. $f_2$ ne peut pas converger dans le cas où $x_0= [0, \\frac1{200} + 10^{-12}]$ puisqu'à partir d'une certaine itération, la hessienne possède des coefficients trop grand et devient numériquement non inversible."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Régions de confiance avec pas de cauchy \n", "# Régions de confiance\n",
"\n", "\n",
"## Implémentation \n", "## Pas de Cauchy\n",
"\n", "\n",
"1. Coder l'algorithme du pas de Cauchy dun sous-problème de\n", "### Implémentation\n",
"régions de confiance (fichier `Pas_De_Cauchy.jl`). Tester sur les quadratiques proposées en Annexe B.\n",
"\n", "\n",
"2. Coder l'algorithme de régions de confiance (fichier `Regions_De_Confiance.jl`). Tester sur les problèmes de lAnnexe A." "Coder l'algorithme du pas de Cauchy dun sous-problème de régions de confiance (fichier `Pas_De_Cauchy.jl`).\n",
"Tester sur les quadratiques proposées en Annexe B."
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 32,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 1 :\u001b[22m\u001b[39m\n",
" * sol = [0, 0]\n",
" * sol_exacte = [0, 0]\n",
" * flag = 0\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 2 :\u001b[22m\u001b[39m\n",
" * sol = [-0.9230769230769234, -0.30769230769230776]\n",
" * sol_exacte = [-0.9230769230769234, -0.30769230769230776]\n",
" * flag = 1\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 3 :\u001b[22m\u001b[39m\n",
" * sol = [-0.8538149682454623, -0.2846049894151541]\n",
" * sol_exacte = [-0.8538149682454623, -0.2846049894151541]\n",
" * flag = -1\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 4 :\u001b[22m\u001b[39m\n",
" * sol = [5.000000000000001, -2.5000000000000004]\n",
" * sol_exacte = [5.000000000000001, -2.5000000000000004]\n",
" * flag = 1\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 5 :\u001b[22m\u001b[39m\n",
" * sol = [4.47213595499958, -2.23606797749979]\n",
" * sol_exacte = [4.47213595499958, -2.23606797749979]\n",
" * flag = -1\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 6 :\u001b[22m\u001b[39m\n",
" * sol = [-4.743416490252569, -1.5811388300841895]\n",
" * sol_exacte = [-4.743416490252569, -1.5811388300841895]\n",
" * flag = -1\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : Cauchy 7 :\u001b[22m\u001b[39m\n",
" * sol = [-2.23606797749979, -4.47213595499958]\n",
" * sol_exacte = [-2.23606797749979, -4.47213595499958]\n",
" * flag = -1\n",
"\u001b[0m\u001b[1mTest Summary: | \u001b[22m\u001b[32m\u001b[1mPass \u001b[22m\u001b[39m\u001b[36m\u001b[1mTotal\u001b[22m\u001b[39m\n",
"Pas de Cauchy | \u001b[32m 7 \u001b[39m\u001b[36m 7\u001b[39m\n"
]
}
],
"source": [ "source": [
"tester_pas_de_cauchy(false, Pas_De_Cauchy)" "# les quadratiques de l'annexe B sont dans les tests\n",
"tester_pas_de_cauchy(afficher, Pas_De_Cauchy);"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Interprétation \n", "### Interprétation \n",
"\n", "\n",
"1. Quelle relation lie la fonction test $f_1$ et son modèle de Taylor à lordre 2 ? Comparer alors les performances de Newton et RC-Pas de Cauchy sur cette fonction.\n", "1. Quelle relation lie la fonction test $f_1$ et son modèle de Taylor à lordre 2 ? Comparer alors les performances de Newton et RC-Pas de Cauchy sur cette fonction.\n",
"\n", "\n",
"2. Le rayon initial de la région de confiance est un paramètre important dans lanalyse de la performance de lalgorithme. Sur quel(s) autre(s) paramètre(s) peut-on jouer pour essayer daméliorer cette performance ? Étudier linfluence dau moins deux de ces paramètres." "2. Le rayon initial de la région de confiance est un paramètre important dans lanalyse de la performance de lalgorithme. Sur quel(s) autre(s) paramètre(s) peut-on jouer pour essayer daméliorer cette performance ? Étudier linfluence dau moins deux de ces paramètres.\n",
] "\n",
}, "### Vos réponses ?\n",
{ "\n",
"cell_type": "markdown", "| Point | Newton | RC-Cauchy |\n",
"metadata": {}, "| :-------- | :----: | :-------: |\n",
"source": [ "| $x_{sol}$ | 0 | 0 |\n",
"## Vos réponses?\n", "| $x_{011}$ | 1 | 26 |\n",
"| $x_{012}$ | 1 | 28 |\n",
"\n",
"1. Si on note $q_1$ le modèle de Taylor à l'ordre 2 de $f_1$, alors $m^1_k(x_k+s) = q_1(s) = f_1(x_k) + g_1^T s + \\frac12 s^T H_k s$.\n", "1. Si on note $q_1$ le modèle de Taylor à l'ordre 2 de $f_1$, alors $m^1_k(x_k+s) = q_1(s) = f_1(x_k) + g_1^T s + \\frac12 s^T H_k s$.\n",
"On observe que RC-Cauchy est plus lent que la méthode de Newton sur la fonction $f1$.\n",
"\n", "\n",
"2. Pour essayer d'améliorer les performances de l'algorithme des régions de confiance avec Cauchy, on peut aussi essayer d'agrandir $\\Delta_{max}$ pour que l'algorithme converge plus rapidement, dans le cas où on observe un grand nombre d'itérations lors de la résolution." "2. Pour essayer d'améliorer les performances de l'algorithme des régions de confiance avec Cauchy, on peut aussi essayer d'agrandir $\\Delta_{max}$ pour que l'algorithme converge plus rapidement dans les cas où on observe un grand nombre d'itérations lors de la résolution."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Régions de confiance avec gradient conjugué tronqué\n", "## Gradient conjugué tronqué\n",
"\n", "\n",
"## Implémentation \n", "### Implémentation \n",
"\n", "\n",
"1. Implémenter lalgorithme du Gradient Conjugué Tronqué, en se basant sur le cours (fichier `Gradient_Conjugue_Tronque.jl`).\n", "Implémenter lalgorithme 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 lAnnexe C.\n", "On validera les résultats sur les fonctions de lAnnexe C."
"\n",
"2. Intégrer finalement lalgorithme 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", "cell_type": "code",
"execution_count": null, "execution_count": 33,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
"source": [
"tester_gct(false, Gradient_Conjugue_Tronque)"
]
},
{ {
"cell_type": "code", "name": "stdout",
"execution_count": null, "output_type": "stream",
"metadata": {}, "text": [
"outputs": [], "--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 1 :\u001b[22m\u001b[39m\n",
" * sol = [0.0, 0.0]\n",
" * sol_exacte = [0.0, 0.0]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 2 :\u001b[22m\u001b[39m\n",
" * sol = [-0.4743416490252569, -0.15811388300841897]\n",
" * sol_exacte = [-0.4743416490252569, -0.15811388300841897]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 3 :\u001b[22m\u001b[39m\n",
" * sol = [-0.8740776099190263, -0.8221850958502243]\n",
" * sol_exacte = [-0.8740776099190263, -0.8221850958502244]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 4 :\u001b[22m\u001b[39m\n",
" * sol = [-0.8571428571428571, -0.9999999999999998]\n",
" * sol_exacte = [-0.8571428571428571, -1.0]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 5 :\u001b[22m\u001b[39m\n",
" * sol = [-0.447213595499958, -0.894427190999916]\n",
" * sol_exacte = [-0.4472135954999579, -0.8944271909999159]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 6 :\u001b[22m\u001b[39m\n",
" * sol = [-0.5, 0.0]\n",
" * sol_exacte = [-0.5, -0.0]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 7 :\u001b[22m\u001b[39m\n",
" * sol = [9.102342582478453, -4.140937032991381]\n",
" * sol_exacte = [9.102342582478453, -4.140937032991381]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 8 :\u001b[22m\u001b[39m\n",
" * sol = [0.0, 0.0]\n",
" * sol_exacte = [0.0, 0.0]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 9 :\u001b[22m\u001b[39m\n",
" * sol = [1.9059020876695598, -2.3167946029410578]\n",
" * sol_exacte = [1.9059020876695578, -2.3167946029410595]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : GCT 10 :\u001b[22m\u001b[39m\n",
" * sol = [-0.5, 0.0]\n",
" * sol_exacte = [-0.5, 0.0]\n",
"\u001b[0m\u001b[1mTest Summary: | \u001b[22m\u001b[32m\u001b[1mPass \u001b[22m\u001b[39m\u001b[36m\u001b[1mTotal\u001b[22m\u001b[39m\n",
"Gradient-CT | \u001b[32m 11 \u001b[39m\u001b[36m 11\u001b[39m\n"
]
}
],
"source": [ "source": [
"tester_regions_de_confiance(true, Regions_De_Confiance)" "# les quadratiques de l'annexe C sont dans les tests\n",
"tester_gct(afficher, Gradient_Conjugue_Tronque);"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"## Interprétation \n", "### Interprétation \n",
"\n", "\n",
"1. Comparer la décroissance obtenue avec celle du pas de Cauchy, en retournant, dans\n", "1. Comparer la décroissance obtenue avec celle du pas de Cauchy, en retournant, dans un premier temps le dernier itéré admissible à courbure positive (cest à dire, que si lune ou lautre des deux conditions (b) ou (d) sont rencontrées dans lalgorithme 3, alors on ne calcule pas ``σ_{j}`` et on retourne le dernier itéré ``s_{j}`` directement).\n",
"un premier temps le dernier itéré admissible à courbure positive (cest à dire, que si\n",
"lune ou lautre des deux conditions (b) ou (d) sont rencontrées dans lalgorithme 3,\n",
"alors on ne calcule pas ``σ_{j}`` et on retourne le dernier itéré ``s_{j}`` directement).\n",
"\n", "\n",
"2. Comparer la décroissance obtenue avec celle du pas de Cauchy, en imposant la sortie\n", "2. Comparer la décroissance obtenue avec celle du pas de Cauchy, en imposant la sortie dans lalgorithme 3 au bout dune itération seulement. Que remarquez vous ?\n",
"dans lalgorithme 3 au bout dune itération seulement. Que remarquez vous ?\n",
"\n", "\n",
"3. Comparer la décroissance obtenue avec celle du pas de Cauchy dans le cas général.\n", "3. Comparer la décroissance obtenue avec celle du pas de Cauchy dans le cas général.\n",
"\n", "\n",
"4. Quels sont les avantages et inconvénients des deux approches ?" "4. Quels sont les avantages et inconvénients des deux approches ?\n",
"\n",
"### Vos réponses ?\n",
"\n",
"1. \n",
"\n",
"| Solution | RC-Cauchy | RC-GCT |\n",
"| :-------: | :-----------------: | :-----------------: |\n",
"| [1, 1, 1] | [1, 1, 1] | [1, 1, 1] |\n",
"| [1, 1, 1] | [1.51, 0.85, 0.68] | [1.0, 1.0, 1.0] |\n",
"| [1, 1, 1] | [8.41, 2.02, -2.93] | [4.66, 0.62, -3.12] |\n",
"| [1, 1] | [-1.05, 1.05] | [-1.17, 1.38] |\n",
"| [1, 1] | [8.00, 0.09] | [5.46, 3.19] |\n",
"| [1, 1] | [0.04, -0.01] | [0.0, 0.005] |\n",
"\n",
"2. Si on limite à une itération, on observe que l'algorithme des régions de confiance avec GCT converge plus rapidement.\n",
"\n",
"Test | RC-Cauchy | RC-GCT |\n",
"| :----- | :-------: | :----: |\n",
"| test 1 | 0 | 0 |\n",
"| test 2 | 26 | 1 |\n",
"| test 3 | 28 | 3 |\n",
"| test 4 | 3988 | 31 |\n",
"| test 5 | 864 | 44 |\n",
"| test 6 | 3198 | 19 |\n",
"3. Dans le cas général on remarque que RC-GCT est nettement plus efficace que RC-Cauchy. \n",
"\n",
"4. Cauchy est plus simple mais moins efficace, et GCT est plus efficace mais nécéssite plus de calculs par itération."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"1. dqzd\n", "## Implémentation\n",
"2. dzqd\n", "\n",
"3. 3dqzdzd\n", "1. Coder l'algorithme de régions de confiance (fichier `Regions_De_Confiance.jl`). Tester sur les problèmes de lAnnexe A.\n",
"4. dqzd" "2. Intégrer finalement lalgorithme du Gradient Conjugué Tronqué dans le code de régions de confiance, et appliquer ce code pour résoudre les exemples proposés en Annexe A."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 1 au point initial sol_exacte :\u001b[22m\u001b[39m\n",
" * xsol = [1, 1, 1]\n",
" * f(xsol) = 0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 1 au point initial x011 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0000558873349883, 0.999992420017735, 0.9999289527004819]\n",
" * f(xsol) = 9.090411079109608e-9\n",
" * nb_iters = 26\n",
" * flag = 2\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 1 au point initial x012 :\u001b[22m\u001b[39m\n",
" * xsol = [1.000049795462743, 0.9999961002424803, 0.9999424049876057]\n",
" * f(xsol) = 6.0401046516733e-9\n",
" * nb_iters = 28\n",
" * flag = 2\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 2 au point initial x021 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9975992881487654, 0.9951970760634036]\n",
" * f(xsol) = 5.768693455998473e-6\n",
" * nb_iters = 3988\n",
" * flag = 2\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 2 au point initial x022 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9961677295964368, 0.9923393628804894]\n",
" * f(xsol) = 1.4697922911344958e-5\n",
" * nb_iters = 864\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance (itermax) avec cauchy appliqué à fonction 2 au point initial x022 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9906938429133161, 0.981448447768753]\n",
" * f(xsol) = 8.667134381048603e-5\n",
" * nb_iters = 10\n",
" * flag = 3\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec cauchy appliqué à fonction 2 au point initial x023 :\u001b[22m\u001b[39m\n",
" * xsol = [0.998024983312937, 0.9960352320641266]\n",
" * f(xsol) = 3.935418178353333e-6\n",
" * nb_iters = 3198\n",
" * flag = 2\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à sol_exacte au point initial x011 :\u001b[22m\u001b[39m\n",
" * xsol = [1, 1, 1]\n",
" * f(xsol) = 0\n",
" * nb_iters = 0\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à fonction 1 au point initial x011 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0000000000000007, 1.0, 1.0]\n",
" * f(xsol) = 2.0214560696288428e-30\n",
" * nb_iters = 1\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à fonction 1 au point initial x012 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9999999999999996, 1.0000000000000002, 1.0000000000000004]\n",
" * f(xsol) = 4.930380657631324e-31\n",
" * nb_iters = 3\n",
" * flag = 0\n",
" * sol_exacte = [1, 1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à fonction 2 au point initial x021 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9999996743780089, 0.9999993478371609]\n",
" * f(xsol) = 1.0611413038132374e-13\n",
" * nb_iters = 31\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à fonction 2 au point initial x022 :\u001b[22m\u001b[39m\n",
" * xsol = [1.0000035183009863, 1.0000066949336202]\n",
" * f(xsol) = 2.4053014026923312e-11\n",
" * nb_iters = 44\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"--------------------------------------------------------------------------------\n",
"\u001b[34m\u001b[1mRésultats de : régions de confiance avec gct appliqué à fonction 2 au point initial x023 :\u001b[22m\u001b[39m\n",
" * xsol = [0.9999999999998994, 0.9999999999996207]\n",
" * f(xsol) = 3.1813581453548166e-24\n",
" * nb_iters = 19\n",
" * flag = 0\n",
" * sol_exacte = [1, 1]\n",
"\u001b[0m\u001b[1mTest Summary: | \u001b[22m\u001b[32m\u001b[1mPass \u001b[22m\u001b[39m\u001b[36m\u001b[1mTotal\u001b[22m\u001b[39m\n",
"La méthode des RC | \u001b[32m 13 \u001b[39m\u001b[36m 13\u001b[39m\n"
]
}
],
"source": [
"# les fonctions de l'annexe A sont dans les tests\n",
"tester_regions_de_confiance(afficher, Regions_De_Confiance);"
] ]
}, },
{ {
@ -190,91 +549,21 @@
"source": [ "source": [
"# Lagrangien augmenté\n", "# Lagrangien augmenté\n",
"\n", "\n",
"## Implémentation\n", "### Implémentation\n",
"\n",
"1. Choisir des critères darrêt pour la convergence de l'algorithme.\n", "1. Choisir des critères darrêt pour la convergence de l'algorithme.\n",
"\n", "2. Implémenter l'algorithme du lagrangien augmenté, en utilisant les différentes méthodes qui ont été vues en première partie pour la résolution de la suite de problémes sans contraintes (fichier `Lagrangien_Augmente.jl`)\n",
"2.Implémenter l'algorithme du lagrangien augmenté, en utilisant les différentes méthodes\n", "3. Tester les différentes variantes sur les problèmes en Annexe D."
"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", "cell_type": "code",
"execution_count": null, "execution_count": 36,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"function afficher_resultats(algo,nom_fct,point_init,xmin,fxmin,flag,sol_exacte,nbiters)\n", "# les fonctions de l'annexe D sont dans les tests\n",
"\tprintln(\"-------------------------------------------------------------------------\")\n", "tester_lagrangien_augmente(afficher, Lagrangien_Augmente);"
"\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",
"fct1(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_fct1(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_fct1(x) = [6 2 4; 2 8 2; 4 2 6]\n",
"\n",
"contrainte1(x) = x[1] + x[3] - 1\n",
"grad_contrainte1(x) = [1; 0; 1]\n",
"hess_contrainte1(x) = [0 0 0; 0 0 0; 0 0 0]\n",
"\n",
"x01 = [0; 1; 1]\n",
"x02 = [0.5; 1.25; 1]\n",
"x03 = [1; 0]\n",
"x04 = [sqrt(3) / 2; sqrt(3) / 2]\n",
"pts2 = Pts_avec_contraintes(x01, x02, x03, x04)\n",
"\n",
"# sol_fct1_augm = [0.5 ; 1.25 ; 0.5]\n",
"\n",
"algo = \"newton\"\n",
"xmin, fxmin, flag, nbiters = Lagrangien_Augmente(algo, fct1, contrainte1, grad_fct1, hess_fct1, grad_contrainte1, hess_contrainte1, pts2.x01, options)\n",
"afficher_resultats(\"Lagrangien augmenté avec \" * algo, \"fonction 1\", \"x01\", xmin, fxmin, flag, sol_fct1_augm, nbiters)\n",
"\n",
"algo = \"cauchy\"\n",
"xmin, fxmin, flag, nbiters = Lagrangien_Augmente(algo, fct1, contrainte1, grad_fct1, hess_fct1, grad_contrainte1, hess_contrainte1, pts2.x01, options)\n",
"afficher_resultats(\"Lagrangien augmenté avec \" * algo, \"fonction 1\", \"x01\", xmin, fxmin, flag, sol_fct1_augm, nbiters)\n",
"\n",
"algo = \"gct\"\n",
"xmin, fxmin, flag, nbiters = Lagrangien_Augmente(algo, fct1, contrainte1, grad_fct1, hess_fct1, grad_contrainte1, hess_contrainte1, pts2.x01, options)\n",
"afficher_resultats(\"Lagrangien augmenté avec \" * algo, \"fonction 1\", \"x01\", xmin, fxmin, flag, sol_fct1_augm, nbiters)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tester_lagrangien_augmente(true, Lagrangien_Augmente)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for algo in [\"newton\" \"cauchy\" \"gct\"]\n",
" for tau in [0.01; 0.1; 1; 10; 100; 1000]\n",
" options = [1e-8 1e-5 1 10 10 tau]\n",
" xmin, fxmin, flag, nbiters = Lagrangien_Augmente(algo, fct1, contrainte1, grad_fct1, hess_fct1, grad_contrainte1, hess_contrainte1, zeros(3), options)\n",
" println(\"algo=\" * algo * \", tau=\" * string(tau) * \" \\t--> iter=\" * string(nbiters) * \" fxmin=\" * string(fxmin) * \" flag=\" * string(flag))\n",
" end\n",
"end"
] ]
}, },
{ {
@ -290,8 +579,7 @@
"source": [ "source": [
"1. Commenter les résultats obtenus, en étudiant notamment les valeurs de $\\lambda_k$ et $\\mu_k$.\n", "1. Commenter les résultats obtenus, en étudiant notamment les valeurs de $\\lambda_k$ et $\\mu_k$.\n",
"2. Étudier l'influence du paramètre $\\tau$ dans la performance de l'algorithme.\n", "2. Étudier l'influence du paramètre $\\tau$ dans la performance de l'algorithme.\n",
"3. **Supplémentaire** : \n", "3. **Supplémentaire** : Que proposez-vous comme méthode pour la résolution des problèmes avec des contraintes à la fois d'égalité et d'inégalité ? Implémenter (si le temps le permet) ce nouvel algorithme"
"Que proposez-vous comme méthode pour la résolution des problèmes avec des contraintes à la fois d'égalité et d'inégalité ? Implémenter (si le temps le permet) ce nouvel algorithme"
] ]
}, },
{ {
@ -319,8 +607,8 @@
"1. On observe que lorsque:\n", "1. On observe que lorsque:\n",
" - l'algorithme converge (flag = 0), alors $\\lambda_k$ tend vers $2 \\times f(x_{min})$.\n", " - l'algorithme converge (flag = 0), alors $\\lambda_k$ tend vers $2 \\times f(x_{min})$.\n",
" - l'algorithme ne converge pas (flag = 1), alors $\\mu_k$ tend vers 0. \n", " - l'algorithme ne converge pas (flag = 1), alors $\\mu_k$ tend vers 0. \n",
"\n", "2. Il semblerait que plus $\\tau$ est élevé, plus l'algorithme converge rapidement.\n",
"2. Il semblerait que plus $\\tau$ est élevé, plus l'algorithme converge rapidement" "3. "
] ]
} }
], ],

View file

@ -123,11 +123,23 @@ hess_contrainte2(x) = [2 0; 0 2]
# Affichage les sorties de l'algorithme des Régions de confiance # Affichage les sorties de l'algorithme des Régions de confiance
function afficher_resultats(algo, nom_fct, point_init, xmin, fxmin, flag, sol_exacte, nbiters) function afficher_resultats(algo, nom_fct, point_init, xmin, fxmin, flag, sol_exacte, nbiters)
println("---------------------------------------------------------------------------------") println("-"^80)
printstyled("Résultats de : " * algo * " appliqué à " * nom_fct * " au point initial ", point_init, " :\n", bold = true, color = :blue) printstyled("Résultats de : " * algo * " appliqué à " * nom_fct * " au point initial ", point_init, " :\n", bold = true, color = :blue)
println(" * xsol = ", xmin) println(" * xsol = ", xmin)
println(" * f(xsol) = ", fxmin) println(" * f(xsol) = ", fxmin)
println(" * nb_iters = ", nbiters) println(" * nb_iters = ", nbiters)
println(" * flag = ", flag) println(" * flag = ", flag)
println(" * sol_exacte : ", sol_exacte) println(" * sol_exacte = ", sol_exacte)
end
function afficher_resultats_gct(algo, sol, sol_exacte)
println("-"^80)
printstyled("Résultats de : " * algo, " :\n", bold = true, color = :blue)
println(" * sol = ", sol)
println(" * sol_exacte = ", sol_exacte)
end
function afficher_resultats_cauchy(algo, flag, sol, sol_exacte)
afficher_resultats_gct(algo, sol, sol_exacte)
println(" * flag = ", flag)
end end

View file

@ -25,55 +25,92 @@ function tester_gct(afficher::Bool, Gradient_Conjugue_Tronque::Function)
Hess = [7 0; 0 2] Hess = [7 0; 0 2]
delta = 1 delta = 1
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [0.0; 0.0], atol = tol_test) sol = [0.0; 0.0]
if afficher
afficher_resultats_gct("GCT 1", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
# le cas de test 2 H definie positive # le cas de test 2 H definie positive
grad = [6; 2] grad = [6; 2]
Hess = [7 0; 0 2] Hess = [7 0; 0 2]
delta = 0.5 # sol = pas de Cauchy delta = 0.5 # sol = pas de Cauchy
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, -delta * grad / norm(grad), atol = tol_test) sol = -delta * grad / norm(grad)
if afficher
afficher_resultats_gct("GCT 2", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
delta = 1.2 # saturation à la 2ieme itération delta = 1.2 # saturation à la 2ieme itération
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [-0.8740776099190263, -0.8221850958502244], atol = tol_test) sol = [-0.8740776099190263, -0.8221850958502244]
if afficher
afficher_resultats_gct("GCT 3", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
delta = 3 # sol = min global delta = 3 # sol = min global
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, -Hess \ grad, atol = tol_test) sol = -Hess \ grad
if afficher
afficher_resultats_gct("GCT 4", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
# le cas test 2 bis matrice avec 1 vp < 0 et 1 vp > 0 # le cas test 2 bis matrice avec 1 vp < 0 et 1 vp > 0
grad = [1, 2] grad = [1, 2]
Hess = [1 0; 0 -1] Hess = [1 0; 0 -1]
delta = 1.0 # g^T H g < 0 première direction concave delta = 1.0 # g^T H g < 0 première direction concave
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, -delta * grad / norm(grad), atol = tol_test) sol = -delta * grad / norm(grad)
if afficher
afficher_resultats_gct("GCT 5", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
grad = [1, 0] grad = [1, 0]
delta = 0.5 # g^T H g > 0 sol pas de Cauchy delta = 0.5 # g^T H g > 0 sol pas de Cauchy
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, -delta * grad / norm(grad), atol = tol_test) sol = -delta * grad / norm(grad)
if afficher
afficher_resultats_gct("GCT 6", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
grad = [2, 1] # g^T H g > 0 sol à l'itération 2, saturation grad = [2, 1] # g^T H g > 0 sol à l'itération 2, saturation
delta = 6 delta = 6
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [0.48997991959774634, 5.979959839195494], atol = tol_test) || isapprox(s, [-4.489979919597747, -3.979959839195493], atol = tol_test) @test isapprox(s, [0.48997991959774634, 5.979959839195494], atol = tol_test) || isapprox(s, [-4.489979919597747, -3.979959839195493], atol = tol_test)
# le cas de test 3 # le cas de test 3
grad = [-2; 1] grad = [-2; 1]
Hess = [-2 0; 0 10] Hess = [-2 0; 0 10]
delta = 10 delta = 10
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [9.102342582478453; -4.140937032991381], atol = tol_test) sol = [9.102342582478453; -4.140937032991381]
if afficher
afficher_resultats_gct("GCT 7", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
# le cas de test 4 # le cas de test 4
grad = [0; 0] grad = [0; 0]
Hess = [-2 0; 0 10] Hess = [-2 0; 0 10]
delta = 1 delta = 1
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [0.0; 0.0], atol = tol_test) sol = [0.0; 0.0]
if afficher
afficher_resultats_gct("GCT 8", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
# le cas de test 5 # le cas de test 5
grad = [2; 3] grad = [2; 3]
Hess = [4 6; 6 5] Hess = [4 6; 6 5]
delta = 3 delta = 3
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [1.9059020876695578; -2.3167946029410595], atol = tol_test) sol = [1.9059020876695578; -2.3167946029410595]
if afficher
afficher_resultats_gct("GCT 9", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
# le cas de test 6 # le cas de test 6
# Le pas de Cauchy conduit à un gradient nul en 1 itération # Le pas de Cauchy conduit à un gradient nul en 1 itération
@ -81,6 +118,10 @@ function tester_gct(afficher::Bool, Gradient_Conjugue_Tronque::Function)
Hess = [4 0; 0 -15] Hess = [4 0; 0 -15]
delta = 2 delta = 2
s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol]) s = Gradient_Conjugue_Tronque(grad, Hess, [delta; max_iter; tol])
@test isapprox(s, [-0.5; 0.0], atol = tol_test) sol = [-0.5; 0.0]
if afficher
afficher_resultats_gct("GCT 10", s, sol)
end
@test isapprox(s, sol, atol = tol_test)
end end
end end

View file

@ -23,9 +23,9 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = [0; 0] sol = [0; 0]
if afficher if afficher
println("Cauchy 1= ", sol) afficher_resultats_cauchy("Cauchy 1", e, s, sol)
end end
@test (e == 0) && (isapprox(s, [0; 0], atol = tol_erreur)) @test (e == 0) && (isapprox(s, sol, atol = tol_erreur))
end end
@testset "quad 2, non saturé" begin @testset "quad 2, non saturé" begin
@ -35,7 +35,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(norm(g)^2 / (g' * H * g)) * g sol = -(norm(g)^2 / (g' * H * g)) * g
if afficher if afficher
println("Cauchy 2= ", sol) afficher_resultats_cauchy("Cauchy 2", e, s, sol)
end end
@test (e == 1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == 1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end
@ -46,7 +46,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(delta / norm(g)) * g sol = -(delta / norm(g)) * g
if afficher if afficher
println("Cauchy 3= ", sol) afficher_resultats_cauchy("Cauchy 3", e, s, sol)
end end
@test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end
@ -57,7 +57,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(norm(g)^2 / (g' * H * g)) * g sol = -(norm(g)^2 / (g' * H * g)) * g
if afficher if afficher
println("Cauchy 4= ", sol) afficher_resultats_cauchy("Cauchy 4", e, s, sol)
end end
@test (e == 1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == 1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end
@ -68,7 +68,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(delta / norm(g)) * g sol = -(delta / norm(g)) * g
if afficher if afficher
println("Cauchy 5= ", sol) afficher_resultats_cauchy("Cauchy 5", e, s, sol)
end end
@test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end
@ -79,7 +79,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(delta / norm(g)) * g sol = -(delta / norm(g)) * g
if afficher if afficher
println("Cauchy 6= ", sol) afficher_resultats_cauchy("Cauchy 6", e, s, sol)
end end
@test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end
@ -90,7 +90,7 @@ function tester_pas_de_cauchy(afficher::Bool, Pas_De_Cauchy::Function)
s, e = Pas_De_Cauchy(g, H, delta) s, e = Pas_De_Cauchy(g, H, delta)
sol = -(delta / norm(g)) * g sol = -(delta / norm(g)) * g
if afficher if afficher
println("Cauchy 7= ", sol) afficher_resultats_cauchy("Cauchy 7", e, s, sol)
end end
@test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776] @test (e == -1) && (isapprox(s, sol, atol = tol_erreur)) # sol = [-0.9230769230769234; -0.30769230769230776]
end end

View file

@ -76,7 +76,7 @@ function tester_regions_de_confiance(afficher::Bool, Regions_De_Confiance::Funct
# cas de test max_iter # cas de test max_iter
x_min22, fmin22, flag22, nb_iters22 = Regions_De_Confiance("cauchy", fct2, grad_fct2, hess_fct2, pts1.x022, options_max_iter) x_min22, fmin22, flag22, nb_iters22 = Regions_De_Confiance("cauchy", fct2, grad_fct2, hess_fct2, pts1.x022, options_max_iter)
if (afficher) if (afficher)
afficher_resultats("régions de confiance avec " * "cauchy", "fonction 2", "x022", x_min22, fmin22, flag22, sol_exacte_fct2, nb_iters22) afficher_resultats("régions de confiance (itermax) avec " * "cauchy", "fonction 2", "x022", x_min22, fmin22, flag22, sol_exacte_fct2, nb_iters22)
end end
@test flag22 == 3 @test flag22 == 3