à finir
This commit is contained in:
parent
55c6b06375
commit
0df2af52fd
|
@ -1,33 +1,33 @@
|
||||||
@doc doc"""
|
@doc doc"""
|
||||||
Résolution des problèmes de minimisation sous contraintes d'égalités
|
Résolution des problèmes de minimisation sous cs d'égalités
|
||||||
|
|
||||||
# Syntaxe
|
# Syntaxe
|
||||||
```julia
|
```julia
|
||||||
Lagrangien_Augmente(algo,fonc,contrainte,gradfonc,hessfonc,grad_contrainte,
|
Lagrangien_Augmente(algo,f,c,gradf,hessf,grad_c,
|
||||||
hess_contrainte,x0,options)
|
hess_c,x0,options)
|
||||||
```
|
```
|
||||||
|
|
||||||
# Entrées
|
# Entrées
|
||||||
* **algo** : (String) l'algorithme sans contraintes à utiliser:
|
* **algo** : (String) l'algorithme sans cs à 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
|
||||||
- **"gct"** : pour le gradient conjugué tronqué
|
- **"gct"** : pour le gradient conjugué tronqué
|
||||||
* **fonc** : (Function) la fonction à minimiser
|
* **f** : (Function) la ftion à minimiser
|
||||||
* **contrainte** : (Function) la contrainte [x est dans le domaine des contraintes ssi ``c(x)=0``]
|
* **c** : (Function) la c [x est dans le domaine des cs ssi ``c(x)=0``]
|
||||||
* **gradfonc** : (Function) le gradient de la fonction
|
* **gradf** : (Function) le gradient de la ftion
|
||||||
* **hessfonc** : (Function) la hessienne de la fonction
|
* **hessf** : (Function) la hessienne de la ftion
|
||||||
* **grad_contrainte** : (Function) le gradient de la contrainte
|
* **grad_c** : (Function) le gradient de la c
|
||||||
* **hess_contrainte** : (Function) la hessienne de la contrainte
|
* **hess_c** : (Function) la hessienne de la c
|
||||||
* **x0** : (Array{Float,1}) la première composante du point de départ du Lagrangien
|
* **x0** : (Array{Float,1}) la première composante du point de départ du Lagrangien
|
||||||
* **options** : (Array{Float,1})
|
* **options** : (Array{Float,1})
|
||||||
1. **epsilon** : utilisé dans les critères d'arrêt
|
1. **epsilon** : utilisé dans les critères d'arrêt
|
||||||
2. **tol** : la tolérance utilisée dans les critères d'arrêt
|
2. **tol** : la tolérance utilisée dans les critères d'arrêt
|
||||||
3. **itermax** : nombre maximal d'itération dans la boucle principale
|
3. **itermax** : nombre maximal d'itération dans la boucle principale
|
||||||
4. **lambda0** : la deuxième composante du point de départ du Lagrangien
|
4. **lambda_0** : la deuxième composante du point de départ du Lagrangien
|
||||||
5. **mu0,tho** : valeurs initiales des variables de l'algorithme
|
5. **mu_0,tau** : 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 cs
|
||||||
* **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
|
||||||
- **0** : convergence
|
- **0** : convergence
|
||||||
|
@ -44,36 +44,88 @@ hessf(x)=[-400*(x[2]-3*x[1]^2)+2 -400*x[1];-400*x[1] 200]
|
||||||
algo = "gct" # ou newton|gct
|
algo = "gct" # ou newton|gct
|
||||||
x0 = [1; 0]
|
x0 = [1; 0]
|
||||||
options = []
|
options = []
|
||||||
contrainte(x) = (x[1]^2) + (x[2]^2) -1.5
|
c(x) = (x[1]^2) + (x[2]^2) -1.5
|
||||||
grad_contrainte(x) = [2*x[1] ;2*x[2]]
|
grad_c(x) = [2*x[1] ;2*x[2]]
|
||||||
hess_contrainte(x) = [2 0;0 2]
|
hess_c(x) = [2 0;0 2]
|
||||||
output = Lagrangien_Augmente(algo,f,contrainte,gradf,hessf,grad_contrainte,hess_contrainte,x0,options)
|
output = Lagrangien_Augmente(algo,f,c,gradf,hessf,grad_c,hess_c,x0,options)
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
function Lagrangien_Augmente(algo, fonc::Function, contrainte::Function, gradfonc::Function,
|
function Lagrangien_Augmente(algo, f::Function, c::Function, gradf::Function, hessf::Function, grad_c::Function, hess_c::Function, x0, options)
|
||||||
hessfonc::Function, grad_contrainte::Function, hess_contrainte::Function, x0, options)
|
|
||||||
|
|
||||||
if options == []
|
if options == []
|
||||||
epsilon = 1e-8
|
epsilon = 1e-8
|
||||||
tol = 1e-5
|
tol = 1e-5
|
||||||
itermax = 1000
|
itermax = 1000
|
||||||
lambda0 = 2
|
lambda_0 = 2
|
||||||
mu0 = 100
|
mu_0 = 100
|
||||||
tho = 2
|
tau = 2
|
||||||
else
|
else
|
||||||
epsilon = options[1]
|
epsilon = options[1]
|
||||||
tol = options[2]
|
tol = options[2]
|
||||||
itermax = options[3]
|
itermax = options[3]
|
||||||
lambda0 = options[4]
|
lambda_0 = options[4]
|
||||||
mu0 = options[5]
|
mu_0 = options[5]
|
||||||
tho = options[6]
|
tau = options[6]
|
||||||
end
|
end
|
||||||
|
|
||||||
n = length(x0)
|
n = length(x0)
|
||||||
xmin = zeros(n)
|
flag = -1
|
||||||
fxmin = 0
|
|
||||||
flag = 0
|
|
||||||
iter = 0
|
|
||||||
|
|
||||||
return xmin, fxmin, flag, iter
|
L(x, lambda, mu) = f(x) + lambda' * c(x) + mu / 2 * norm(c(x))^2
|
||||||
|
gradL(x, lambda, mu) = gradf(x) + lambda' * grad_c(x) + mu / 2 * c(x) # à vérifier
|
||||||
|
|
||||||
|
eta_chap_0 = 0.1258925
|
||||||
|
alpha = 0.1
|
||||||
|
beta = 0.9
|
||||||
|
epsilon_0 = 1 / mu_0
|
||||||
|
eta_0 = eta_chap_0 / (mu_0^alpha)
|
||||||
|
|
||||||
|
k = 0
|
||||||
|
x_k = x_0
|
||||||
|
lambda_k = lambda_0
|
||||||
|
mu_k = mu_0
|
||||||
|
|
||||||
|
while true
|
||||||
|
|
||||||
|
# a
|
||||||
|
if algo == "newton"
|
||||||
|
x_k1, _, _, _ = Algorithme_De_Newton(L, gradL, hessL, x_k, options)
|
||||||
|
# A FINIR
|
||||||
|
elseif algo == "cauchy"
|
||||||
|
s_k = Gradient_Conjugue_Tronque(gradf(x_k), hessf(x_k), [delta_k max_iter Tol_rel])
|
||||||
|
elseif algo == "gct"
|
||||||
|
s_k, e_k = Pas_De_Cauchy(gradf(x_k), hessf(x_k), delta_k)
|
||||||
|
end
|
||||||
|
|
||||||
|
if norm(c_k1) <= eta_k # b
|
||||||
|
lambda_k1 = lambda_k + mu_k * c(x_k1)
|
||||||
|
mu_k1 = mu_k
|
||||||
|
epsilon_k1 = epsilon_k / mu_k
|
||||||
|
eta_k1 = eta_k / (mu_k^beta)
|
||||||
|
else # c
|
||||||
|
lambda_k1 = lambda_k
|
||||||
|
mu_k1 = tau * mu_k
|
||||||
|
epsilon_k1 = epsilon_0 / mu_k1
|
||||||
|
eta_k1 = eta_chap_0 / (mu_k1^alpha)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if norm(gradL(x_k, lambda_k, 0)) <= max(tol * norm(gradL(x_0, lambda_0, 0)), epsilon) && norm(c(x_k)) <= max(tol * norm(c(x_0), epsilon))
|
||||||
|
flag = 0
|
||||||
|
break
|
||||||
|
elseif k >= max_iter
|
||||||
|
flag = 3
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
k += 1
|
||||||
|
x_k = x_k1
|
||||||
|
lambda_k = lambda_k1
|
||||||
|
mu_k = mu_k1
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
xmin = xkp1
|
||||||
|
f_min = f(xmin)
|
||||||
|
return xmin, f_min, flag, k
|
||||||
end
|
end
|
||||||
|
|
|
@ -816,6 +816,15 @@
|
||||||
" ce nouvel algorithme\n"
|
" ce nouvel algorithme\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# TODO\n",
|
||||||
|
"COMPLETER LES TESTS pour avoir tous les flags, tous les if \\\n",
|
||||||
|
"répondre aux question"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
Loading…
Reference in a new issue