Télécharger asymp.eso

Retour à la liste

Numérotation des lignes :

asymp
  1. C ASYMP SOURCE FD218221 26/10/07 21:15:05 12662
  2. SUBROUTINE ASYMP(ITER,N,M,XVAL,XOLD1,XOLD2,XMIN,XMAX,
  3. & RAA0EPS,RAAEPS,DF0DX,DFDX,
  4. & ASYINIT,ASYDECR,ASYINCR,ASYMIN,ASYMAX,
  5. & LOW,UPP,RAA0,RAA)
  6.  
  7. C ----------------------------------------------------------------------
  8. C Ce code est une adaptation en FORTRAN/ESOPE de l'algorithme de la GC-MMA
  9. C (Methode des Asymptotes Mobiles Globalement Convergente) propose initialement
  10. C en langage Matlab par K. Svarberg (sources : https://www.smoptit.se/)
  11. C ----------------------------------------------------------------------
  12. C Cette subroutine met a jour les asymptotes et les parametres de courbure
  13. C des fonctions objectif et contraintes definissant les sous problemes convexes
  14. C pour la GC-MMA
  15. C
  16. C Entrees :
  17. C ---------
  18. C ITER = Numero de l'iteration courante
  19. C N = Nombre de variables x_j
  20. C M = Nombre de contraintes
  21. C XVAL = Vecteur (N) des variables x_j courantes
  22. C XOLD1 = XVAL, a 1 iteration precedente (a condition que iter>1)
  23. C XOLD2 = XVAL, a 2 iterations precedentes (a condition que iter>2)
  24. C XMIN/XMAX = Vecteurs (N) des bornes inferieures/superieures pour les variables x_j
  25. C RAA0EPS = Scalaire minimum pour RAA0
  26. C RAAEPS = Vecteur (M) minimum pour RAA
  27. C DF0DX = Vecteur (N) des valeurs du gradient de la fonction objectif f_0,
  28. C par rapport aux variables x_j, calcules en XVAL
  29. C DFDX = Matrice (M x N) des valeurs du gradient des fonctions contraintes f_i,
  30. C par rapport aux variables x_j, calcules en XVAL
  31. C DFDX(i,j) = gradient de f_i par rapport a x_j
  32. C ASYINIT = Scalaire pour calculer la distance initiale entre les asymptotes
  33. C ASYDECR = Scalaire pour decroitre de la distance entre les asymptotes
  34. C ASYINCR = Scalaire pour incrementer la distance entre les asymptotes
  35. C ASYMIN = Scalaire pour calculer la distance minimale entre les asymptotes
  36. C ASYMAX = Scalaire pour calculer la distance maximale entre les asymptotes
  37. C LOW/UPP = Vecteurs (N) des asymptotes inferieures/superieures du sous-probleme
  38. C
  39. C Sorties :
  40. C ---------
  41. C LOW/UPP = Vecteurs (N) mis a jour
  42. C RAA0 = Scalaire valeur approchee de la fonction objectif par le sous probleme
  43. C RAA = Vecteur (M) des valeurs approchees des fonctions contraintes par le sous probleme
  44. C ----------------------------------------------------------------------
  45.  
  46. IMPLICIT INTEGER(I-N)
  47. IMPLICIT REAL*8(A-H,O-Z)
  48.  
  49. C Arguments
  50. INTEGER ITER,N,M
  51. REAL*8 XVAL(N),XOLD1(N),XOLD2(N),XMIN(N),XMAX(N),RAA0EPS,RAAEPS(M)
  52. REAL*8 DF0DX(N),DFDX(M,N),ASYINIT,ASYDECR,ASYINCR,ASYMIN,ASYMAX
  53. REAL*8 LOW(N),UPP(N)
  54. REAL*8 RAA0,RAA(M)
  55.  
  56. C Constante locale
  57. PARAMETER (XMAMIEPS=1.0D-5)
  58.  
  59. C Calcul de RAA0 et RAA
  60. RAA0 = 0.0D0
  61. DO 10 I = 1,N
  62. XMAMI = MAX(XMAX(I)-XMIN(I),XMAMIEPS)
  63. RAA0 = RAA0 + ABS(DF0DX(I)) * XMAMI
  64. 10 CONTINUE
  65. RAA0 = MAX(RAA0EPS,(0.1D0 / DBLE(N)) * RAA0)
  66.  
  67. DO 20 J = 1,M
  68. RAAJ = 0.0D0
  69. DO 21 I = 1,N
  70. XMAMI = MAX(XMAX(I)-XMIN(I),XMAMIEPS)
  71. RAAJ = RAAJ + ABS(DFDX(J,I)) * XMAMI
  72. 21 CONTINUE
  73. RAA(J) = MAX(RAAEPS(I),(0.1D0 / DBLE(N)) * RAAJ)
  74. 20 CONTINUE
  75.  
  76.  
  77. C Mise a jour de LOW et UPP
  78. IF (ITER.LE.2) THEN
  79. DO 30 I = 1,N
  80. XMAMI = MAX(XMAX(I)-XMIN(I),XMAMIEPS)
  81. LOW(I) = XVAL(I) - ASYINIT * XMAMI
  82. UPP(I) = XVAL(I) + ASYINIT * XMAMI
  83. 30 CONTINUE
  84.  
  85. ELSE
  86. DO 40 I = 1, N
  87. XMAMI = MAX(XMAX(I)-XMIN(I),XMAMIEPS)
  88. DXX = (XVAL(I) - XOLD1(I)) * (XOLD1(I) - XOLD2(I))
  89. IF (DXX.GT.0.0D0) THEN
  90. FACTOR = ASYINCR
  91. ELSEIF (DXX.LT.0.0D0) THEN
  92. FACTOR = ASYDECR
  93. ELSE
  94. FACTOR = 1.0D0
  95. ENDIF
  96. LOW(I) = XVAL(I) - FACTOR * (XOLD1(I) - LOW(I))
  97. LOW(I) = MAX(LOW(I), XVAL(I) - ASYMAX * XMAMI)
  98. LOW(I) = MIN(LOW(I), XVAL(I) - ASYMIN * XMAMI)
  99. UPP(I) = XVAL(I) + FACTOR * (UPP(I) - XOLD1(I))
  100. UPP(I) = MIN(UPP(I), XVAL(I) + ASYMAX * XMAMI)
  101. UPP(I) = MAX(UPP(I), XVAL(I) + ASYMIN * XMAMI)
  102. 40 CONTINUE
  103. ENDIF
  104.  
  105. RETURN
  106. END
  107.  
  108.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales