1
subroutine qnbd(indqn,simul,n,x,f,g,imp,io,zero,
2
& napmax,itmax,epsf,epsg,epsx,df0,binf,bsup,nfac,
3
& trav,ntrav,itrav,nitrav,izs,rzs,dzs)
5
c code de minimisation d une fonction reguliere sous contraintes
6
c de bornes , aux normes modulopt
8
c f. bonnans , inria , 1986
10
c principe de l algorithme : quasi-newton + projection
11
c details dans le rapport inria n. 242,1983
12
c cette version permet de tester plusieurs variantes de l algorithme
13
c en modifiant certains parametres internes (cf comment dans le code)
14
c taille memoire necessaire de l ordre de n**2/2
15
c pour les problemes de grande taille le code gcbd est mieux adapte
17
c!sous programmes appeles
18
c zqnbd optimiseur effectif
20
c calmaj mise a jour du hessien
21
c ajour mise a jour des facteurs de choleski
22
c rlbd,satur recherche lineaire avec bornes
26
c subroutine qnbd(indqn,simul,n,x,f,g,imp,io,zero,
27
c & napmax,itmax,epsf,epsg,epsx,df0,binf,bsup,nfac,
28
c & trav,ntrav,itrav,nitrav,izs,rzs,dzs)
30
c indqn indicateur de qnbd es
31
c en entree =1 standard
32
c =2 dh et indic initialises au debut de trav et itrav
33
c ifac,f,g initialises
35
c si < 0 incapacite de calculer un point meilleur que le point initial
36
c si = 0 arret demande par l utilisateur
37
c si > 0 on fournit un point meilleur que le point de depart
38
c < -10 parametres d entree non convenables
39
c = -6 arret lors du calcul de la direction de descente et iter=1
40
c = -5 arret lors du calcul de l approximation du hessien iter=1
41
c = -3 anomalie de simul : indic negatif en un point ou
42
c f et g ont ete precedemment calcules
43
c = -2 echec de la recherche lineaire a la premiere iteration
44
c = -1 f non definie au point initial
50
c = 6 pente dans la direction opposee au gradient trop petite
51
c = 7 arret lors du calcul de la direction de descente
52
c = 8 arret lors du calcul de l approximation du hessien
53
c = 10 arret par echec de la recherche lineaire , cause non precisee
54
c = 11 idem avec indsim < 0
55
c = 12 un pas trop petit proche d un pas trop grand
56
c ceci peut resulter d une erreur dans le gradient
57
c = 13 trop grand nombre d appels dans une recherche lineaire
58
c simul voir les normes modulopt
60
c binf,bsup bornes inf,sup,de dim n e
61
c x variables a optimiser (controle) es
62
c f valeur du critere s
64
c zero proche zero machine e
65
c napmax nombre maximum d appels de simul e
66
c itmax nombre maximum d iterations de descente e
67
c itrav vect travail dim nitrav=2n , se decompose en indic et izig
68
c nfac nombre de variables factorisees (e si indqn=2) s
69
c imp facteur d impression e
70
c varie de 0 (pas d impressions) a 3 (nombreuses impressions)
71
c io numero du fichier de resultats e
72
c epsx vect dim n precision sur x e
73
c epsf critere arret sur f e
74
c epsg arret si sup a norm2(g+)/n e
75
c trav vect travail dim ntrav
76
c il faut ntrav > n(n+1)/2 +6n
77
c df0>0 decroissance f prevue (prendre 1. par defaut) e
78
c izs,rzs,dzs : cf normes modulopt es
80
c indications sur les variables internes a qnbd et zqnbd
81
c izig sert a la memorisation des contraintes (actif si izag>1)
82
c si i ne change pas d ens on enleve 1 a izig (positif)
83
c sinon on ajoute izag
84
c factorisation seulement si izig est nul
85
c dh estimation hessien dim n(n+1)/2 rangee en troismorceaux es
86
c indic(i) nouvel indice de l indice i
87
c indic vect dim n ordre de rangement des indices es
88
c pas necessaire de l initialiser si indqn=1
90
c parametres de la recherche lineaire
91
c amd,amf param. du test de wolfe . (.7,.1)
92
c napm nombre max d appels dans la rl (=15)
94
implicit double precision (a-h,o-z)
96
double precision dzs(*)
97
dimension binf(n),bsup(n),x(n),g(n),epsx(n)
98
dimension trav(ntrav),itrav(nitrav),izs(*)
101
if(imp.ge.1)write(io,1010)
102
1010 format(' *********** qnbd ****************')
105
c parametres caracteristiques de l algorithme
106
c si les parametres sont nuls l algorithme est celui du rr 242
107
c ig=1 test sur grad(i) pour relach var
108
c in=1 limite le nombre de factorisations par iter a n/10
109
c irel=1 test sur decroissance grad pour rel a iter courante
110
c epsrel taux de decroissance permettant le relachement (cf irit)
111
c iact blocage variables dans ib (gestion contraintes actives)
112
c ieps1 =1 eps1 egal a zero
113
c note eps1 correspond a eps(xk)
122
c decoupage du vecteur trav
129
if(imp.gt.0)write(io,110)ntrav,n5
130
110 format(' qnbd : ntrav=',i8,' devrait valoir ',i8)
135
if(nitrav.lt.2*n) then
137
if(imp.gt.0)write(io,111)nitrav,ni2
138
111 format(' qnbd : nitrav=',i8,'devrait valoir',i8)
142
call zqnbd(indqn,simul,trav(1),n,binf,bsup,x,f,g,zero,napmax,
143
&itmax,itrav,itrav(ni1),nfac,imp,io,epsx,epsf,epsg,trav(n1),
144
&trav(n2),trav(n3),trav(n4),df0,ig,in,irel,izag,iact,
145
&epsrel,ieps1,izs,rzs,dzs)