Exemples d'appels

Dans les exemples suivants appliqués sur les fonctions :

  1. Algorithme_De_Newton
  2. Pas_De_Cauchy
  3. Gradient_Conjugue_Tronque
  4. Regions_De_Confiance
  5. Lagrangien_Augmente

nous allons utiliser la fonction suivante : $\\$ $\begin{aligned}\hspace*{1.5cm} f: \mathbb{R}^{2} \quad &\rightarrow \mathbb{R} \\ \hspace*{1.5cm} \left(x_{1}, x_{2}\right) &\rightarrow 100\left(x_{2}-x_{1}^{2}\right)^{2}+\left(1-x_{1}\right)^{2} \end{aligned} \\$ dont le gradient est : $\hspace*{0.5cm}$ $\nabla f(x) = \left[\begin{array}{l} -400 x_{1}(x_{2}-x_{1}^{2})-2(1-x_{1}) & 200 (x_{2}-x_{1}^{2}) \end{array}\right]^{T} \\$ et la hessienne est : $\hspace*{0.5cm}$ $\nabla^2 f(x) = \left[ \begin{array}{cc} -400 (x_{2}-3 x_{1}^{2})+2 & -400 x_{1} \\ -400 x_{1} & 200 \end{array}\right]$

using OptinumProf
using LinearAlgebra
using Plots

Voici la fonction $f$

f(x)=100*(x[2]-x[1]^2)^2+(1-x[1])^2
x, y = -1.5:0.1:1, -2:0.1:3.5
z = Plots.Surface((x,y)->f([x,y]), x, y)
Plots.surface(x,y,z,camera=(85,43))

Ici on trace la norme de $\nabla f$

gradf(x)=[-400*x[1]*(x[2]-x[1]^2)-2*(1-x[1]) ; 200*(x[2]-x[1]^2)]
z = Plots.Surface((x,y)->norm(gradf([x,y])), x, y)
Plots.surface(x,y,z,camera=(85,43))

Et $\nabla^2 f$

hessf(x)=[-400*(x[2]-3*x[1]^2)+2  -400*x[1];-400*x[1]  200]
options = []
nothing # masquer la sortie

L'Algorithme de Newton

x0 = [1; 0]
output = Algorithme_De_Newton(f,gradf,hessf,x0,options)
println(output) # (xmin,f_min,flag,nb_iters)
([1.0, 1.0], 0.0, 0, 1)

Le pas de Cauchy

xk = [0; 0.5]
delta1 = 1
output = Pas_De_Cauchy(gradf(xk),hessf(xk),delta1)
println(output) # (sk, e)
([0.010007963153408747, -0.5003981576704374], 1)

Algorithme du Gradient Conjugué Tronqué

# deltak = options[1]
# max_iter = options[2]
# tol = options[3]
options = [1,5,1e-3]
xk = [0; 0.5]
sk = Gradient_Conjugue_Tronque(gradf(xk),hessf(xk),options)
println(sk)
[0.8558967421837433, -0.5171467554952414]

L'Algorithme des régions de confiance

algo="gct" # ou cauchy
x0 = [1; 0]
options = []
output = Regions_De_Confiance(algo,f,gradf,hessf,x0,options)
println(output)  # (xmin, fxmin, flag,nb_iters)
([1.0, 1.0], 0.0, 0, 2)

Algorithme du Lagrangien augmenté pour contraintes d’égalité

Dans cet exemple nous allons prendre la contrainte suivante : $\\$ $c(x) = x_{1}^2 + x_{2}^2 -1.5 = 0 \\$ dont le gradient est : $\hspace*{0.5cm}$ $\left[\begin{array}{l} 2x_{1} & 2 x_{2} \end{array}\right]^{T} \\$ et la hessienne est :$\hspace*{0.5cm}$ $\left[ \begin{array}{cc} 2 & 0 \\ 0 & 2 \end{array}\right]$

algo = "gct" # ou newton|gct
options = []
contrainte(x) =  (x[1]^2) + (x[2]^2) -1.5
grad_contrainte(x) = [2*x[1] ;2*x[2]]
hess_contrainte(x) = [2 0;0 2]
output = Lagrangien_Augmente(algo,f,contrainte,gradf,hessf,grad_contrainte,hess_contrainte,x0,options)
println(output) # (xmin1,fxmin1,flag,nbiters)
([0.9072339558154577, 0.8227554477306978], 0.008615651535155151, 0, 2)