Download newton.eso

Back to the list

   1 : C NEWTON    SOURCE    CHAT      06/06/01    21:18:06     5450           
   2 :       SUBROUTINE NEWTON(XX,YY,DXX,EPSS,NMAX,M,NFIN,nit,niter,x1,y1,
   3 :      $ x2,y2)
   4 : C---------------------------------------------------------------------
   5 : C Gestion simultanée de plusieurs Newton imbriqués, la jacobienne
   6 : C étant calculée numériquement.
   7 : C---------------------------------------------------------------------
   8 : C
   9 : C---------------------------
  10 : C Parametres Entree/Sortie :
  11 : C---------------------------
  12 : C
  13 : C E/S XX      : Contient X(I) en entrée et X(I+1) en sortie
  14 : C E/  YY      : Contient F(X(I))
  15 : C E/  DXX     : Incrément initial
  16 : C E/  EPSS    : Test de convergence pour Newton
  17 : C E/  NMAX    : Nombre d'itérations maximum
  18 : C E/  M       : Rang des variables à considérer
  19 : C  /S NFIN    : Flag de succès 0=continuer 1=convergence
  20 : C               2=non convergence 3=fonction non nulle
  21 : C
  22 : C---------------------
  23 : C Variables internes :
  24 : C---------------------
  25 : C Pour chaque rang M
  26 : C    NIT(M)   : nombre d'itérations déjà réalisée
  27 : C    NITER(M) : indicateur de premier passage 1=premier 2=suivant
  28 : C    X1(M)    : valeur de la variable à l'itération précédante
  29 : C    X2(M)    : ibid à l'itération courante
  30 : C    Y1(M)    : valeur de la fonction à l'itération précédante
  31 : C    Y2(M)    : ibid à l'itération courante
  32 : C Lorsque le newton du rang M a convergé, on réinitialise NIT(M) à 0
  33 : C et NITER(M) à 1 afin de pouvoir réaliser des newtons emboités.
  34 : C
  35 : C----------------------------------------------------------------------
  36 : C Utilisation : Au premier appel, donner X(0), F(X(0)), un incrément et
  37 : C le rang à initialiser. Aux appels suivant, fournir X(I), F(X(I)) et
  38 : C le rang à considérer. La subroutine renvoie X(I+1) et un indicateur
  39 : C de convergence.
  40 : C----------------------------------------------------------------------
  41 : C
  42 : C Langage : FORTRAN
  43 : C
  44 : C Auteurs : F.DABBENE et E.STUDER 02/99
  45 : C
  46 : C---------------------------------------------------------------------
  47 :       IMPLICIT INTEGER(I-N)
  48 :       IMPLICIT REAL*8 (A-H,O-Z)
  49 :       DIMENSION X1(*),Y1(*),X2(*),Y2(*)
  50 :       DIMENSION NIT(*),NITER(*)
  51 : *      SAVE
  52 : *      DATA NIT/9*0/                                                             
  53 : *      DATA NITER/9*1/                                                           
  54 : C
  55 : C- Initialisation
  56 : C
  57 :       GOTO (10,20) NITER(M)
  58 :  10   CONTINUE
  59 : C-> Premier passage
  60 :       X1(M)    = XX
  61 :       Y1(M)    = YY
  62 :       XX       = XX + DXX
  63 :       NITER(M) = 2
  64 :       NFIN     = 0
  65 :       RETURN                                                                    
  66 :  20   CONTINUE
  67 : C-> Passages suivants
  68 :       X2(M)  = XX
  69 :       Y2(M)  = YY
  70 :       NIT(M) = NIT(M) + 1
  71 :       DY21   = YY - Y1(M)
  72 :       AYY    = ABS(YY)
  73 : C
  74 : C- Test de convergence et gestion ad-hoc
  75 : C
  76 :       EPS2   = 10.D0 * EPSS
  77 :       IF ((AYY.LE.EPSS).OR.(DY21.EQ.0.D0.AND.AYY.LE.EPS2)) THEN
  78 : C-> OK
  79 :          NFIN     = 1
  80 :          NITER(M) = 1
  81 :          NIT(M)   = 0
  82 :       ELSE
  83 :          IF (NIT(M).GT.NMAX) THEN
  84 : C-> Iteration max atteint
  85 :             NFIN     = 2
  86 :             NITER(M) = 1
  87 :             NIT(M)   = 0
  88 :          ELSE
  89 :             IF (DY21.EQ.0.D0.AND.AYY.GT.EPS2) THEN
  90 : C-> Convergence problématique : on converge mais f(x)>EPS2>0
  91 :                NFIN     = 3
  92 :                NITER(M) = 1
  93 :                NIT(M)   = 0
  94 :             ELSE
  95 : C-> Calcul du nouvel itéré et mise à jour pour le pas suivant
  96 :                XX    = XX - Y2(M)*(XX-X1(M))/(Y2(M)-Y1(M))
  97 :                X1(M) = X2(M)
  98 :                Y1(M) = Y2(M)
  99 :                NFIN  = 0
 100 :             ENDIF
 101 :          ENDIF
 102 :       ENDIF
 103 : C
 104 :       RETURN                                                                    
 105 :       END                                                                       
 106 :  
 107 :  
 108 :  
 109 :  

© Cast3M 2003 - All rights reserved.
Disclaimer