agreg1
C AGREG1 SOURCE FD218221 25/03/11 21:15:02 12187 SUBROUTINE AGREG1(MLREEL,ICAS,XP,IROBU,AGR) C Application d'une fonction d'agregation sur un C objet LISTREEL C Entrees : C --------- C MLREEL : Pointeur vers le LISTREEL (suppose actif) C ICAS : Entier, code de la fonction C = 1 'SOMM' Somme C = 2 'PROD' Produit C = 3 'MOYE' Moyenne arithmetique (moment d'ordre 1) C = 4 'MOHA' Moyenne harmonique C = 5 'MOGE' Moyenne geometrique C = 6 'VARI' Variance (moment centre d'ordre 2) C = 7 'ECTY' Ecart type C = 8 'ASYM' Coefficient d'asymetrie (moment centre reduit d'ordre 3) C = 9 'KURT' Kurtosis (moment centre reduit d'ordre 4) C = 10 'MEDI' Mediane C = 11 'PMOM' Moment d'ordre P C = 12 'PMOY' Moyenne generalise d'ordre P C = 13 'PNOR' Norme generalisee d'ordre P C = 14 'LEHM' Fonction de Lehmer d'ordre P C = 15 'KSL' Fonction de Kreisselmeir Steinhauser inferieure d'ordre P (MellowMax) C = 16 'KSU' Fonction de Kreisselmeir Steinhauser superieure d'ordre P (LogSumExp) C = 17 'BOLT' Fonction de Boltzmann d'ordre P C XP : Flottant, parametre pour les fonctions 'PMOY' 'PMOM' 'PNOR' 'LEHM' C 'KSL' 'KSL' 'BOLT' C IROB : Entier, pour calcul robuste au overflow C = 0 pour un calcul "naif" C = autre chose pour un calcul "robuste" en normalisant les valeurs avec C la norme infinie ou bien le maximum, selon la fonction choisie C Sorties : C --------- C AGR : Flottant, valeur de la fonction d'agregation C Typages implicites habituels IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) C Les includes necessaires -INC CCREEL -INC SMLREEL C Quelques objets LOGICAL ROBU C Taille du LISTREEL C Initialisation du resultat AGR=0.D0 C Cas trivial non traite IF (NX.LT.1) THEN RETURN ENDIF C Calcul robuste ? ROBU=.FALSE. IF (IROBU.NE.0) THEN ROBU=.TRUE. IF (ICAS.GE.12) THEN VINF=ABS(VMAX) VPMAX=XP*VMAX ENDIF ENDIF C Cas de la P moyenne avec P=0 --> on utilise MOGE (moyenne geometrique) IF ((ICAS.EQ.12).AND.(ABS(XP).LT.XPETIT)) THEN ICAS=5 ENDIF C Somme (aussi utilise pour la moyenne, la variance, l'ecart type, C l'asymetrie, le kurtosis) IF ((ICAS.EQ.1).OR.(ICAS.EQ.3).OR.(ICAS.EQ.6).OR.(ICAS.EQ.7).OR. & (ICAS.EQ.8).OR.(ICAS.EQ.9)) THEN SUM=0.D0 DO I=1,NX SUM=SUM+XI ENDDO IF (ICAS.EQ.1) AGR=SUM ENDIF C Produit (aussi utilise pour la moyenne geometrique) IF ((ICAS.EQ.2).OR.(ICAS.EQ.5)) THEN XPRO=1.D0 DO I=1,NX XPRO=XPRO*XI ENDDO IF (ICAS.EQ.2) AGR=XPRO ENDIF C Moyenne (aussi utilise pour la variance, l'ecart type, l'asymetrie, le kurtosis) IF ((ICAS.EQ.3).OR.(ICAS.EQ.6).OR.(ICAS.EQ.7).OR.(ICAS.EQ.8).OR. & (ICAS.EQ.9)) THEN XMOY=SUM/NX IF (ICAS.EQ.3) AGR=XMOY ENDIF C Moyenne harmonique IF (ICAS.EQ.4) THEN DO I=1,NX AGR=AGR+(1.D0/XI) ENDDO AGR=NX/AGR ENDIF C Moyenne geometrique IF (ICAS.EQ.5) THEN AGR=XPRO**(1.D0/NX) ENDIF C Variance (aussi utilise pour l'ecart type, l'asymetrie, le kurtosis) IF ((ICAS.EQ.6).OR.(ICAS.EQ.7).OR.(ICAS.EQ.8).OR. & (ICAS.EQ.9)) THEN VAR=0.D0 DO I=1,NX XM=XI-XMOY VAR=VAR+(XM*XM) ENDDO VAR=VAR/NX IF (ICAS.EQ.6) AGR=VAR ENDIF C Ecart type (aussi utilise pour l'asymetrie, le kurtosis) IF ((ICAS.EQ.7).OR.(ICAS.EQ.8).OR.(ICAS.EQ.9)) THEN SIG=SQRT(VAR) IF (ICAS.EQ.7) AGR=SIG ENDIF C Coefficient d'asymetrie IF (ICAS.EQ.8) THEN AGR=0.D0 DO I=1,NX AGR=AGR+(((XI-XMOY)/SIG)**3) ENDDO AGR=AGR/NX ENDIF C Kurtosis IF (ICAS.EQ.9) THEN AGR=0.D0 DO I=1,NX AGR=AGR+(((XI-XMOY)/SIG)**4) ENDDO AGR=AGR/NX ENDIF C Mediane IF (ICAS.EQ.10) THEN C Tri des valeurs en ordre croissant (par insertion) C Obtention de la valeur mediane IF (MOD(NX,2).EQ.0) THEN ELSE ENDIF ENDIF C Moment d'ordre P IF (ICAS.EQ.11) THEN AGR=0.D0 DO I=1,NX AGR=AGR+(XI**XP) ENDDO ENDIF C P moyenne (aussi utlise pour LEHM) IF ((ICAS.EQ.12).OR.(ICAS.EQ.14)) THEN SUMP=0.D0 DO I=1,NX IF (ROBU) XI=XI/VINF SUMP=SUMP+(XI**XP) ENDDO IF (ICAS.EQ.12) THEN AGR=(SUMP/NX)**(1.D0/XP) IF (ROBU) AGR=VINF*AGR ENDIF ENDIF C P norme IF (ICAS.EQ.13) THEN AGR=0.D0 DO I=1,NX IF (ROBU) XI=XI/VINF AGR=AGR+((ABS(XI))**XP) ENDDO AGR=AGR**(1.D0/XP) IF (ROBU) AGR=VINF*AGR ENDIF C Fonction de Lehmer IF (ICAS.EQ.14) THEN XPM1=XP-1.D0 SUMPM1=0.D0 DO I=1,NX IF (ROBU) XI=XI/VINF SUMPM1=SUMPM1+(XI**XPM1) ENDDO AGR=SUMP/SUMPM1 IF (ROBU) AGR=VINF*AGR ENDIF C Fonctions de Kreisselmeir Steinhauser (aussi utilise pour Boltzmann) IF ((ICAS.EQ.15).OR.(ICAS.EQ.16).OR.(ICAS.EQ.17)) THEN SUMEP=0.D0 DO I=1,NX IF (ROBU) XI=XI-VMAX SUMEP=SUMEP+(EXP(XP*XI)) ENDDO ENDIF IF ((ICAS.EQ.15).OR.(ICAS.EQ.16)) THEN IF (ICAS.EQ.15) AGR=(LOG(SUMEP/NX))/XP IF (ICAS.EQ.16) AGR=(LOG(SUMEP))/XP IF (ROBU) AGR=VMAX+AGR ENDIF C Moyenne de Boltzmann IF (ICAS.EQ.17) THEN SUMXEP=0.D0 DO I=1,NX IF (ROBU) XI=XI-VMAX SUMXEP=SUMXEP+(XI*EXP(XP*XI)) ENDDO AGR=SUMXEP/SUMEP IF (ROBU) AGR=VMAX+AGR ENDIF RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales