IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

fortran calcul Biais entre 2 fichiers [Débutant(e)]


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut fortran calcul Biais entre 2 fichiers
    Je viens de débuter un stage dans le domaine de la modélisation ...et je n'ai pas encore toutes les bases en programmation.Je me permets de poster mon message sur ce forum en espérant que vous pourriez m'aider.

    Je dois comparer 2 fichiers en calculant le biais:

    B = 1/n.Σi (Mi -Oi) Avec Mi la valeur donnée par le model a la date i
    Et Oi la valeur donné par le fichier observation à la meme date i.

    Mes 2 fichiers:
    -Un fichier.txt (Observation.txt) dans lequel se trouve les données observations:
    avec la date, l'heure et la concentration d'un polluant à cet heure sur une période comme ce qui suit:
    2012081801 47
    2012081802 45
    2012081804 43
    2012081805 40
    -Un fichier .txt (Model.txt) dans lequel se trouve les données fournies par un model:
    2012081801 67.254
    2012081802 62.861
    2012081803 62.427
    2012081804 63.149
    2012081805 63.076

    je ne sais pas trop comment m'y prendre, En vous remerciant par avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Bienvenue greendiamond

    D'après les extraits des fichiers montrés, je comprends que :
    • A chaque observation dans le premier fichier correspond une valeur du modèle dans le second,
    • Les deux fichiers ont le même nombre de lignes,
    • Les données sont classées dans le même ordre dans les chaque fichier.

    Si les trois hypothèses sont vérifiées, le problème est simple.

    Connais-tu n (le nombre de valeurs d'observation) ?
    Si oui tu peux directement déclarer déclarer des tableaux O et M de dimension n.
    Sinon il faut parcourir une première fois l'un des fichier, pour déterminer le déterminer et ensuite allouer dynamiquement O et M.

    Il faut après initialiser les tableaux à partir des données lues. Le traitement est le même pour chaque fichier : lire la seconde valeur de la ligne courante et l'affecter à un élément du tableau (les dates ne sont pas utilisées d'après ce que j'ai compris).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open(unit=11,nom_du_fichier)
    do i = 1, n
    read(11,*) date, tableau(i)
    enddo
    close(11)
    Le FORTRAN 90 permet la manipulation globale des tableaux. Ainsi d'après ta formule, le biais s'obtient :
    On préfère utiliser un forme quadratique pour estimer l'erreur.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut Dardanos,

    Tout d'abord je te remercie pour le temps que tu as consacré pour me répondre...

    Oui les données sont bien dans le même ordre. Cependant, le souci est qu'il me manque des données dans le fichier observation,
    par exemple dans l'exemple du début de fichier (observation) que j'ai copié, il me manque la concentration correspondant à 3h pour le 18 aout 2012 (2012081803).
    Mais comment lui dire de passer à la ligne suivante quand n'y a pas la même date (exple: 2012081803) dans les 2 fichiers?

    Donc pour n je devrais certainement prendre le nombre de ligne qu'il y a dans mon premier fichier (le fichier observation.txt).

    Oui je commence avec les biais qui me semble le plus simple, puis ensuite j'adapterais pour calculer le RMSE (root mean square error) ainsi que la corrélation de Pearson.

    En te remerciant

  4. #4
    Invité
    Invité(e)
    Par défaut
    je copie ici, ce que j'ai commencé.....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    program Calc_Bias
     
    !!   Calcul du Biais
    	implicit none
     
    !! variables
     
          character (len=10) :: datechO 					! 2012081801 date + heure fichier observation
          character (len=10) :: datechM					! 2012081801 date + heure fichier modele
          real  :: concO							!Concentration d'ozone Observation (ug/m3)
          real  :: ConcM							!Concentration d'ozone Modele (ug/m3)	
          real  :: B                                                            ! biais
          real  :: difference	             		                    				
     
    !!    local variables
          integer :: nlines                                     
     
     
     
    !!      ouverture du fichier observation
     
    		open(unit=120,file="/home/observations.dat",status='old')
    		read (120,*) datechO, concO
     
    ! compter le nombre de lignes dans le fichier observation
    		nlines=0
     
    		do  ! boucle pour compter le nombre de ligne du fichier
    			read(120,*) 
    			 nlines = nlines + 1
    			print*, 'nombre de lignes', nlines
    		enddo
     
    !!      ouverture du fichier model
     
    		open(unit=121,file="/home/model.dat",status='old')
    		read (121,*) datechM, concM
     
     
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !               Calcul du Biais                           !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    		if (datechO = datechM)
    			do
    			difference= concM-concO
     
    			else !! passer à la ligne suivante???
     
    		endif
     
     
    		do	
    			B=sum(concM-concO)/nlines
    		enddo
     
    		write 
     
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    			close(120)
    			close(121)
    end program Calc_Bias

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut.
    Voici un modèle de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    program main
        implicit none
        integer :: ios_o, ios_m, nb_conc
        integer :: date_o, date_m
        double precision :: conc_o, conc_m, somme
     
        open(unit=11, file='Observation.txt', status='old')
        read(11,*) date_o, conc_o
     
        open(unit=12, file='Model.txt', status='old')
        read(12,*) date_m, conc_m
     
        nb_conc = 0 ; somme = 0
        do
            if (date_m < date_o) then
                read(11,*,iostat=ios_m) date_m, conc_m
                if (ios_m/=0) exit
            endif
            if (date_m == date_o) then
                print '(i10,2e14.6)', date_o, conc_o, conc_m
                somme = somme + conc_o - conc_m
                nb_conc = nb_conc + 1
            else
                print '(a,i10)', 'Observations manquantes : ', date_o
            endif
            read(12,*,iostat=ios_o) date_o, conc_o
            if (ios_o/=0) exit
        enddo
     
        close(11) ; close(12)
     
        print '(a,e14.6)', 'Biais : ', somme / dble(nb_conc)
     
    end program main
    Stocker les concentrations dans des tableaux est inutile.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je te remercie infiniment dardanos, je le test des demain sur une machine linux et je te tiens au courant.
    Bonne soirée à toi.

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Il y avait des erreurs dans ma réponse. Une correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    program main
        implicit none
        integer :: ios_o, ios_m, nb_conc = 0
        integer :: date_o, date_m
        double precision :: conc_o, conc_m, somme = 0
     
        open(unit=11, file='Observation.txt', status='old')
        read(11,*) date_o, conc_o
     
        open(unit=12, file='Model.txt', status='old')
        read(12,*) date_m, conc_m
     
        lect_obs : do
     
            ! Boucler tant que la date lue dans le fichier modele est
            ! inferieure a la date lue dans le fichier observation
            lect_model : do
                if (date_m >= date_o) exit lect_model
                read(12,*,iostat=ios_m) date_m, conc_m
                if (ios_m > 0) exit lect_obs    ! Erreur
                if (ios_m < 0) then             ! Fin de fichier
                    print '(a/a/a)', repeat('-',70), &
                        'Toutes les valeurs du fichier modele ont ete traitees', &
                        'Valeurs fichier observation non traitees :'
                    do
                        read(11,*,iostat=ios_o) date_o, conc_o
                        if (ios_o/=0) exit lect_obs
                        print '(i10,e14.6)', date_o, conc_o
                    enddo
                endif
     
            enddo lect_model
     
            ! Date observation trouvée : ajout contribution
            if (date_m == date_o) then
                print '(i10,2e14.6)', date_o, conc_o, conc_m
                somme = somme + conc_o - conc_m
                nb_conc = nb_conc + 1
            else
                ! Cas : date_m > date_o
                print '(a,i10)', 'Le modele ne permet pas de traiter l''observation a : ', date_o
            endif
     
            ! Lecture d'une nouvelle ligne dans le fichier observation
            read(11,*,iostat=ios_o) date_o, conc_o
            if (ios_o > 0) exit lect_obs    ! Erreur
            if (ios_o < 0) then             ! Fin de fichier
                print '(a/a/a)', repeat('-',70), &
                    'Toutes les valeurs du fichier observation ont ete traitees', &
                    'Valeurs fichier modele non traitees :'
                do
                    read(12,*,iostat=ios_m) date_m, conc_m
                    if (ios_m/=0) exit lect_obs
                    print '(i10,e14.6)', date_m, conc_m
                enddo
            endif
     
        enddo lect_obs
        close(11) ; close(12)
     
        print '(a/a,e14.6)', repeat('-',70), 'Biais : ', somme / dble(nb_conc)
     
    end program main

Discussions similaires

  1. [XL-MAC 2011] calcul entre deux fichiers différents
    Par tim343 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/07/2013, 09h09
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h07
  3. [langage] Passage d objet entre deux fichiers
    Par Slippers dans le forum Langage
    Réponses: 2
    Dernier message: 28/04/2005, 14h45
  4. automatisation entre un fichier .txt et sql server
    Par bibi2607 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2005, 10h18
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo