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