newton
C NEWTON SOURCE CHAT 06/06/01 21:18:06 5450 $ x2,y2) C--------------------------------------------------------------------- C Gestion simultanée de plusieurs Newton imbriqués, la jacobienne C étant calculée numériquement. C--------------------------------------------------------------------- C C--------------------------- C Parametres Entree/Sortie : C--------------------------- C C E/S XX : Contient X(I) en entrée et X(I+1) en sortie C E/ YY : Contient F(X(I)) C E/ DXX : Incrément initial C E/ EPSS : Test de convergence pour Newton C E/ NMAX : Nombre d'itérations maximum C E/ M : Rang des variables à considérer C /S NFIN : Flag de succès 0=continuer 1=convergence C 2=non convergence 3=fonction non nulle C C--------------------- C Variables internes : C--------------------- C Pour chaque rang M C NIT(M) : nombre d'itérations déjà réalisée C NITER(M) : indicateur de premier passage 1=premier 2=suivant C X1(M) : valeur de la variable à l'itération précédante C X2(M) : ibid à l'itération courante C Y1(M) : valeur de la fonction à l'itération précédante C Y2(M) : ibid à l'itération courante C Lorsque le newton du rang M a convergé, on réinitialise NIT(M) à 0 C et NITER(M) à 1 afin de pouvoir réaliser des newtons emboités. C C---------------------------------------------------------------------- C Utilisation : Au premier appel, donner X(0), F(X(0)), un incrément et C le rang à initialiser. Aux appels suivant, fournir X(I), F(X(I)) et C le rang à considérer. La subroutine renvoie X(I+1) et un indicateur C de convergence. C---------------------------------------------------------------------- C C Langage : FORTRAN C C Auteurs : F.DABBENE et E.STUDER 02/99 C C--------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) DIMENSION X1(*),Y1(*),X2(*),Y2(*) DIMENSION NIT(*),NITER(*) * SAVE * DATA NIT/9*0/ * DATA NITER/9*1/ C C- Initialisation C GOTO (10,20) NITER(M) 10 CONTINUE C-> Premier passage X1(M) = XX Y1(M) = YY XX = XX + DXX NITER(M) = 2 NFIN = 0 RETURN 20 CONTINUE C-> Passages suivants X2(M) = XX Y2(M) = YY NIT(M) = NIT(M) + 1 DY21 = YY - Y1(M) AYY = ABS(YY) C C- Test de convergence et gestion ad-hoc C EPS2 = 10.D0 * EPSS IF ((AYY.LE.EPSS).OR.(DY21.EQ.0.D0.AND.AYY.LE.EPS2)) THEN C-> OK NFIN = 1 NITER(M) = 1 NIT(M) = 0 ELSE IF (NIT(M).GT.NMAX) THEN C-> Iteration max atteint NFIN = 2 NITER(M) = 1 NIT(M) = 0 ELSE IF (DY21.EQ.0.D0.AND.AYY.GT.EPS2) THEN C-> Convergence problématique : on converge mais f(x)>EPS2>0 NFIN = 3 NITER(M) = 1 NIT(M) = 0 ELSE C-> Calcul du nouvel itéré et mise à jour pour le pas suivant XX = XX - Y2(M)*(XX-X1(M))/(Y2(M)-Y1(M)) X1(M) = X2(M) Y1(M) = Y2(M) NFIN = 0 ENDIF ENDIF ENDIF C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales