Skip to content
Snippets Groups Projects
Commit cffae80f authored by sophie-mauran's avatar sophie-mauran
Browse files

essai de resolution du conflit

parents a54c27f0 a07000a1
No related branches found
No related tags found
2 merge requests!5Refonte ok,!4Feature/refonte notebook
This commit is part of merge request !4. Comments created here will be created in the context of that merge request.
@doc doc""" @doc doc"""
# Objet #### Objet
Cette fonction implémente l'algorithme de Newton pour résoudre un problème d'optimisation sans contrainte Cette fonction implémente l'algorithme de Newton pour résoudre un problème d'optimisation sans contrainte
# Syntaxe #### Syntaxe
```julia ```julia
xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option) xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
``` ```
# Entrées : #### Entrées :
- f : (Function) la fonction à minimiser - f : (Function) la fonction à minimiser
- gradf : (Function) le gradient de la fonction f - gradf : (Function) le gradient de la fonction f
- hessf : (Function) la Hessienne de la fonction f - hessf : (Function) la Hessienne de la fonction f
...@@ -18,7 +18,7 @@ xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option) ...@@ -18,7 +18,7 @@ xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
- Tol_abs : la tolérence absolue - Tol_abs : la tolérence absolue
- Tol_rel : la tolérence relative - Tol_rel : la tolérence relative
# Sorties: #### Sorties:
- xmin : (Array{Float,1}) une approximation de la solution du problème : ``\min_{x \in \mathbb{R}^{n}} f(x)`` - xmin : (Array{Float,1}) une approximation de la solution du problème : ``\min_{x \in \mathbb{R}^{n}} f(x)``
- f_min : (Float) ``f(x_{min})`` - f_min : (Float) ``f(x_{min})``
- flag : (Integer) indique le critère sur lequel le programme à arrêter - flag : (Integer) indique le critère sur lequel le programme à arrêter
...@@ -28,7 +28,7 @@ xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option) ...@@ -28,7 +28,7 @@ xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
- 3 : nombre maximal d'itération dépassé - 3 : nombre maximal d'itération dépassé
- nb_iters : (Integer) le nombre d'itérations faites par le programme - nb_iters : (Integer) le nombre d'itérations faites par le programme
# Exemple d'appel #### Exemple d'appel
```@example ```@example
f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2 f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)] gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
......
@doc doc""" @doc doc"""
# Objet #### Objet
Cette fonction calcule une solution approchée du problème Cette fonction calcule une solution approchée du problème
```math ```math
...@@ -8,12 +8,12 @@ Cette fonction calcule une solution approchée du problème ...@@ -8,12 +8,12 @@ Cette fonction calcule une solution approchée du problème
par l'algorithme du gradient conjugué tronqué par l'algorithme du gradient conjugué tronqué
# Syntaxe #### Syntaxe
```julia ```julia
sk = Gradient_Conjugue_Tronque(fk,gradfk,hessfk,option) sk = Gradient_Conjugue_Tronque(fk,gradfk,hessfk,option)
``` ```
# Entrées : #### Entrées :
- gradfk : (Array{Float,1}) le gradient de la fonction f appliqué au point xk - gradfk : (Array{Float,1}) le gradient de la fonction f appliqué au point xk
- hessfk : (Array{Float,2}) la Hessienne de la fonction f appliqué au point xk - hessfk : (Array{Float,2}) la Hessienne de la fonction f appliqué au point xk
- options : (Array{Float,1}) - options : (Array{Float,1})
...@@ -22,10 +22,10 @@ sk = Gradient_Conjugue_Tronque(fk,gradfk,hessfk,option) ...@@ -22,10 +22,10 @@ sk = Gradient_Conjugue_Tronque(fk,gradfk,hessfk,option)
- tol : la tolérance pour la condition d'arrêt sur le gradient - tol : la tolérance pour la condition d'arrêt sur le gradient
# Sorties: #### Sorties:
- s : (Array{Float,1}) le pas s qui approche la solution du problème : ``min_{||s||< \delta_{k}} q(s)`` - s : (Array{Float,1}) le pas s qui approche la solution du problème : ``min_{||s||< \delta_{k}} q(s)``
# Exemple d'appel: #### Exemple d'appel:
```julia ```julia
gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)] gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200] hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]
......
@doc doc""" @doc doc"""
# Objet #### Objet
Résolution des problèmes de minimisation sous contraintes d'égalités par l'algorithme du lagrangien augmenté Résolution des problèmes de minimisation sous contraintes d'égalités par l'algorithme du lagrangien augmenté
# Syntaxe #### Syntaxe
```julia ```julia
Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte, Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte,
hess_contrainte,x0,options) hess_contrainte,x0,options)
``` ```
# Entrées #### Entrées
- algo : (String) l'algorithme sans contraintes à utiliser: - algo : (String) l'algorithme sans contraintes à utiliser:
- "newton" : pour l'algorithme de Newton - "newton" : pour l'algorithme de Newton
- "cauchy" : pour le pas de Cauchy - "cauchy" : pour le pas de Cauchy
...@@ -28,7 +28,7 @@ Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte, ...@@ -28,7 +28,7 @@ Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte,
4. lambda0 : la deuxième composante du point de départ du Lagrangien 4. lambda0 : la deuxième composante du point de départ du Lagrangien
5. mu0,tho : valeurs initiales des variables de l'algorithme 5. mu0,tho : valeurs initiales des variables de l'algorithme
# Sorties #### Sorties
- xmin : (Array{Float,1}) une approximation de la solution du problème avec contraintes - xmin : (Array{Float,1}) une approximation de la solution du problème avec contraintes
- fxmin : (Float) ``f(x_{min})`` - fxmin : (Float) ``f(x_{min})``
- flag : (Integer) indicateur du déroulement de l'algorithme - flag : (Integer) indicateur du déroulement de l'algorithme
...@@ -39,7 +39,7 @@ Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte, ...@@ -39,7 +39,7 @@ Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte,
- muk : (Float) valeur de mu_k à la sortie - muk : (Float) valeur de mu_k à la sortie
- lambdak : (Float) valeur de lambda_k à la sortie - lambdak : (Float) valeur de lambda_k à la sortie
# Exemple d'appel #### Exemple d'appel
```julia ```julia
using LinearAlgebra using LinearAlgebra
f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2 f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
...@@ -54,7 +54,7 @@ hess_contrainte(x) = [2 0;0 2] ...@@ -54,7 +54,7 @@ hess_contrainte(x) = [2 0;0 2]
output = Lagrangien_Augmente(algo,f,contrainte,gradf,hessf,grad_contrainte,hess_contrainte,x0,options) output = Lagrangien_Augmente(algo,f,contrainte,gradf,hessf,grad_contrainte,hess_contrainte,x0,options)
``` ```
# Tolérances des algorithmes appelés #### Tolérances des algorithmes appelés
Pour les tolérances définies dans les algorithmes appelés (Newton et régions de confiance), prendre les tolérances Pour les tolérances définies dans les algorithmes appelés (Newton et régions de confiance), prendre les tolérances
par défaut définies dans ces algorithmes. par défaut définies dans ces algorithmes.
......
@doc doc""" @doc doc"""
# Objet #### Objet
Cette fonction calcule une solution approchée du problème Cette fonction calcule une solution approchée du problème
```math ```math
\min_{||s||< \delta_{k}} q_k(s) = s^{t}g + (1/2)s^{t}Hs \min_{||s||< \delta_{k}} q_k(s) = s^{t}g + (1/2)s^{t}Hs
``` ```
par le calcul du pas de Cauchy par le calcul du pas de Cauchy
# Syntaxe #### Syntaxe
```julia ```julia
s1, e1 = Pas_De_Cauchy(gradient,Hessienne,delta) s1, e1 = Pas_De_Cauchy(gradient,Hessienne,delta)
``` ```
# Entrées #### Entrées
- gradfk : (Array{Float,1}) le gradient de la fonction f appliqué au point ``x_k`` - gradfk : (Array{Float,1}) le gradient de la fonction f appliqué au point ``x_k``
- hessfk : (Array{Float,2}) la Hessienne de la fonction f appliqué au point ``x_k`` - hessfk : (Array{Float,2}) la Hessienne de la fonction f appliqué au point ``x_k``
- delta : (Float) le rayon de la région de confiance - delta : (Float) le rayon de la région de confiance
# Sorties #### Sorties
- s : (Array{Float,1}) une approximation de la solution du sous-problème - s : (Array{Float,1}) une approximation de la solution du sous-problème
- e : (Integer) indice indiquant l'état de sortie: - e : (Integer) indice indiquant l'état de sortie:
si g != 0 si g != 0
...@@ -28,7 +28,7 @@ s1, e1 = Pas_De_Cauchy(gradient,Hessienne,delta) ...@@ -28,7 +28,7 @@ s1, e1 = Pas_De_Cauchy(gradient,Hessienne,delta)
sinon sinon
e <- 0 e <- 0
# Exemple d'appel #### Exemple d'appel
```julia ```julia
g1 = [0; 0] g1 = [0; 0]
H1 = [7 0 ; 0 2] H1 = [7 0 ; 0 2]
......
@doc doc""" @doc doc"""
# Objet #### Objet
Minimise une fonction de R^n à valeurs dans R en utilisant l'algorithme des régions de confiance. Minimise une fonction de R^n à valeurs dans R en utilisant l'algorithme des régions de confiance.
La solution approchées des sous-problèmes quadratiques est calculé La solution approchées des sous-problèmes quadratiques est calculé
par le pas de Cauchy ou le pas issu de l'algorithme du gradient conjugue tronqué par le pas de Cauchy ou le pas issu de l'algorithme du gradient conjugue tronqué
# Syntaxe #### Syntaxe
```julia ```julia
xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option) xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option)
``` ```
# Entrées : #### Entrées :
- algo : (String) string indicant la méthode à utiliser pour calculer le pas - algo : (String) string indicant la méthode à utiliser pour calculer le pas
- "gct" : pour l'algorithme du gradient conjugué tronqué - "gct" : pour l'algorithme du gradient conjugué tronqué
...@@ -31,7 +31,7 @@ xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option) ...@@ -31,7 +31,7 @@ xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option)
- Tol_abs : la tolérence absolue - Tol_abs : la tolérence absolue
- Tol_rel : la tolérence relative - Tol_rel : la tolérence relative
# Sorties: #### Sorties:
- xmin : (Array{Float,1}) une approximation de la solution du problème : ``min_{x \in \mathbb{R}^{n}} f(x)`` - xmin : (Array{Float,1}) une approximation de la solution du problème : ``min_{x \in \mathbb{R}^{n}} f(x)``
- fxmin : (Float) ``f(x_{min})`` - fxmin : (Float) ``f(x_{min})``
...@@ -42,7 +42,7 @@ xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option) ...@@ -42,7 +42,7 @@ xk, nb_iters, f(xk), flag = Regions_De_Confiance(algo,f,gradf,hessf,x0,option)
- 3 : nombre maximal d'itération dépassé - 3 : nombre maximal d'itération dépassé
- nb_iters : (Integer)le nombre d'iteration qu'à fait le programme - nb_iters : (Integer)le nombre d'iteration qu'à fait le programme
# Exemple d'appel #### Exemple d'appel
```julia ```julia
algo="gct" algo="gct"
f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2 f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
......
This diff is collapsed.
%% Cell type:markdown id: tags:
<center>
<h1> TP-Projet d'optimisation numérique </h1>
<h1> Algorithme de Newton </h1>
</center>
%% Cell type:markdown id: tags:
## Implémentation
1. Coder l’algorithme de Newton local en respectant la spécification ci-dessous (fichier `Algorithme_De_Newton.jl`)
%% Cell type:code id: tags:
``` julia
using LinearAlgebra
using Documenter
using Markdown
include("Algorithme_De_Newton.jl")
@doc Algorithme_De_Newton
```
%% Output
# Objet
Cette fonction implémente l'algorithme de Newton pour résoudre un problème d'optimisation sans contrainte
# Syntaxe
```julia
xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
```
# Entrées :
* f : (Function) la fonction à minimiser
* gradf : (Function) le gradient de la fonction f
* hessf : (Function) la Hessienne de la fonction f
* x0 : (Array{Float,1}) première approximation de la solution cherchée
* options : (Array{Float,1})
* max_iter : le nombre maximal d'iterations
* Tol_abs : la tolérence absolue
* Tol_rel : la tolérence relative
# Sorties:
* xmin : (Array{Float,1}) une approximation de la solution du problème : $\min_{x \in \mathbb{R}^{n}} f(x)$
* f*min : (Float) ``f(x*{min})``
* flag : (Integer) indique le critère sur lequel le programme à arrêter
* 0 : Convergence
* 1 : stagnation du xk
* 2 : stagnation du f
* 3 : nombre maximal d'itération dépassé
* nb_iters : (Integer) le nombre d'itérations faites par le programme
# Exemple d'appel
```@example
f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]
x0 = [1; 0]
options = []
xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f,gradf,hessf,x0,options)
```
\section{Objet}
Cette fonction implémente l'algorithme de Newton pour résoudre un problème d'optimisation sans contrainte
\section{Syntaxe}
\begin{verbatim}
xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
\end{verbatim}
\section{Entrées :}
\begin{itemize}
\item f : (Function) la fonction à minimiser
\item gradf : (Function) le gradient de la fonction f
\item hessf : (Function) la Hessienne de la fonction f
\item x0 : (Array\{Float,1\}) première approximation de la solution cherchée
\item options : (Array\{Float,1\})
\begin{itemize}
\item max\_iter : le nombre maximal d'iterations
\item Tol\_abs : la tolérence absolue
\item Tol\_rel : la tolérence relative
\end{itemize}
\end{itemize}
\section{Sorties:}
\begin{itemize}
\item xmin : (Array\{Float,1\}) une approximation de la solution du problème : $\min_{x \in \mathbb{R}^{n}} f(x)$
\item f\emph{min : (Float) ``f(x}\{min\})``
\item flag : (Integer) indique le critère sur lequel le programme à arrêter
\begin{itemize}
\item 0 : Convergence
\item 1 : stagnation du xk
\item 2 : stagnation du f
\item 3 : nombre maximal d'itération dépassé
\end{itemize}
\item nb\_iters : (Integer) le nombre d'itérations faites par le programme
\end{itemize}
\section{Exemple d'appel}
\begin{verbatim}
f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]
x0 = [1; 0]
options = []
xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f,gradf,hessf,x0,options)
\end{verbatim}
 Objet
 ≡≡≡≡≡≡≡
Cette fonction implémente l'algorithme de Newton pour résoudre un problème
d'optimisation sans contrainte
 Syntaxe
 ≡≡≡≡≡≡≡≡≡
 xk,f_min,flag,nb_iters = Algorithme_de_Newton(f,gradf,hessf,x0,option)
 Entrées :
 ≡≡≡≡≡≡≡≡≡≡≡
• f : (Function) la fonction à minimiser
• gradf : (Function) le gradient de la fonction f
• hessf : (Function) la Hessienne de la fonction f
• x0 : (Array{Float,1}) première approximation de la solution
cherchée
• options : (Array{Float,1})
• max_iter : le nombre maximal d'iterations
• Tol_abs : la tolérence absolue
• Tol_rel : la tolérence relative
 Sorties:
 ≡≡≡≡≡≡≡≡≡≡
• xmin : (Array{Float,1}) une approximation de la solution du
problème : \min_{x \in \mathbb{R}^{n}} f(x)
• fmin : (Float) ``f(x{min})``
• flag : (Integer) indique le critère sur lequel le programme à
arrêter
• 0 : Convergence
• 1 : stagnation du xk
• 2 : stagnation du f
• 3 : nombre maximal d'itération dépassé
• nb_iters : (Integer) le nombre d'itérations faites par le
programme
 Exemple d'appel
 ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
 f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
 gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
 hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]
 x0 = [1; 0]
 options = []
 xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f,gradf,hessf,x0,options)
%% Cell type:markdown id: tags:
2. Vérifier que les tests ci-dessous passent.
%% Cell type:code id: tags:
``` julia
using Test
# Tolérance pour les tests d'égalité
tol_erreur = sqrt(eps())
## ajouter les fonctions de test
include("../test/fonctions_de_tests.jl")
include("../test/tester_algo_newton.jl")
include("../src/Algorithme_De_Newton.jl")
affiche = false
@testset "Test algo newton" begin
# Tester l'algorithme de Newton
tester_algo_newton(affiche,Algorithme_De_Newton)
end;
```
%% Output
Test Summary: | Pass Total
Test algo newton |  14  14
%% Cell type:code id: tags:
``` julia
#using Pkg; Pkg.add("LinearAlgebra"); Pkg.add("Markdown")
# using Documenter
using LinearAlgebra
using Markdown # Pour que les docstrings en début des fonctions ne posent
# pas de soucis. Ces docstrings sont utiles pour générer
# la documentation sous GitHub
include("Algorithme_De_Newton.jl")
# Affichage les sorties de l'algorithme des Régions de confiance
function my_afficher_resultats(algo,nom_fct,point_init,xmin,fxmin,flag,sol_exacte,nbiters)
println("-------------------------------------------------------------------------")
printstyled("Résultats de : ",algo, " appliqué à ",nom_fct, " au point initial ", point_init, ":\n",bold=true,color=:blue)
println(" * xsol = ",xmin)
println(" * f(xsol) = ",fxmin)
println(" * nb_iters = ",nbiters)
println(" * flag = ",flag)
println(" * sol_exacte : ", sol_exacte)
end
# Fonction f0
# -----------
f0(x) = sin(x)
# la gradient de la fonction f0
grad_f0(x) = cos(x)
# la hessienne de la fonction f0
hess_f0(x) = -sin(x)
sol_exacte = -pi/2
options = []
x0 = sol_exacte
xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f0,grad_f0,hess_f0,x0,options)
my_afficher_resultats("Newton","f0",x0,xmin,f_min,flag,sol_exacte,nb_iters)
x0 = -pi/2+0.5
xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f0,grad_f0,hess_f0,x0,options)
my_afficher_resultats("Newton","f0",x0,xmin,f_min,flag,sol_exacte,nb_iters)
x0 = pi/2
xmin,f_min,flag,nb_iters = Algorithme_De_Newton(f0,grad_f0,hess_f0,x0,options)
my_afficher_resultats("Newton","f0",x0,xmin,f_min,flag,sol_exacte,nb_iters)
```
%% Output
-------------------------------------------------------------------------
Résultats de : Newton appliqué à f0 au point initial -1.5707963267948966:
* xsol = -1.5707963267948966
* f(xsol) = -1.0
* nb_iters = 0
* flag = 0
* sol_exacte : -1.5707963267948966
-------------------------------------------------------------------------
Résultats de : Newton appliqué à f0 au point initial -1.0707963267948966:
* xsol = -1.0707963267948966
* f(xsol) = -0.8775825618903726
* nb_iters = 0
* flag = 0
* sol_exacte : -1.5707963267948966
-------------------------------------------------------------------------
Résultats de : Newton appliqué à f0 au point initial 1.5707963267948966:
* xsol = 1.5707963267948966
* f(xsol) = 1.0
* nb_iters = 0
* flag = 0
* sol_exacte : -1.5707963267948966
%% Cell type:markdown id: tags:
## Interprétation
1. Justifier les résultats obtenus pour l'exemple $f_0$ ci-dessus;
2. Soit $$ f_{1} : \mathbf{R}^3 \rightarrow \mathbf{R}$$ $$ (x_1,x_2, x_3) \mapsto 2 (x_1 +x_2 + x_3 -3)^2 + (x_1-x_2)^2 + (x_2 - x_3)^2$$ Justifier que l’algorithme implémenté converge en une itération pour $f_{1}$;
3. Soit $$ f_{2} : \mathbf{R}^2 \rightarrow \mathbf{R}$$ $$ (x_1,x_2) \mapsto 100(x_2-x_1^2)^2 + (1-x_1)^2 $$ que l’algorithme puisse ne pas converger pour $f_{2}$ avec certains points initiaux.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment