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 :

Fonction a trois indices, recherche d une valeur


Sujet :

Fortran

  1. #1
    Candidat au Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Fonction a trois indices, recherche d une valeur
    Bonjour a tous,

    Je vous ecris car je me retrouve limité face a un probleme. j ai une fonction a trois indice f(k, i, it= indice sur les itérations)
    la boucle k est la plus exterieure, puis viens celle sur it (les itérations) ce que je souhaite faire, c est mettre un critere d arret genre erreure relative a ce niveau, c est a dire avant je prenais une valeur pour it, maitenant j aimerai mettre une condition d arret qui compare deux valeurs de la fonction a deux iterations differentes, cest a dire si f(it+1)-f(it) inf.ou.sup a epsilon continue, sinon exit.

    Je pourrais apporter plus de details si desiré.

    Merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Je ne suis certain de bien comprendre, mais le code suivant résout-il ton problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    do k = ...
       f_it_prec = valeur très grande
       do it = ...
          f_it = f(k,i,it)
          if (abs(f_it - f_it_prec) < Epsilon) exit 
          f_it_prec = f_it
       enddo
    enddo
    Si tu veux sortir des 2 boucles sur le test, tu dois mettre une étiquette sur la boucle externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    boucle_externe : &
    do k = ...
       f_it_prec = valeur très grande
       do it = ...
          f_it = f(k,i,it)
          if (abs(f_it - f_it_prec) < Epsilon) exit boucle_externe
          f_it_prec = f_it
       enddo
    enddo boucle_externe

  3. #3
    Candidat au Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci Sylvain pour ta réactivité.
    En fait je calcul la valeur de f a la premiere itération, si a l iteration suivante l iteration suivante la valeur differe de la premiere calculée, le calcul doit etre refait jusqu avaoir la convergence souhaitée.
    f_it_prec n est pas connue. Je ne sais pas si ca donne plus d explication.

  4. #4
    Candidat au Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    ci-joint un bout du code. Merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          kk= 1              .................  boucle externe                                               
        do 99 k= 1,NT   
     
          do i=1,NU ...
        f0(i)= f1(i)
        end do
    Le calcul ci dessous est réalisé it fois, ce que j'aimerais c'est définir une condition de convergence en comparant f1 de call tridag à l'iteration it de f1 de l'iteration
    it+1

    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
        do 88 it = 1,1000  je souhaite remplacer cette condition..............
    par un calcul d'erreure relative; aui consiterqa à comparer f(it+1) à f(it)
     
           x= 0.
           y1= 0.
           small= 1e-5
     
     
          do i=1,NU
         x= x + f1(i)*usq(i)             
         y1= y1 + f1(i)*utt(i)           
         II(i)= 0.5*x*du    
         JJ1(i)= y1           
     
     
        do i=1,N
        A(i)= cc*(-II(i-1) + JJ(i-1))
        B(i)= 1. + cc*(II(i) - II(i-1) - JJ(i) - JJ(i-1))
        C(i)= cc*(II(i) + JJ(i))
          end do
     
     
          call tridag(A,B,C,f0,f1,NU)
    En sortie j'obtiens f1, le calcul est effectué jusqu'à la valeur max de it, au lieu de passer par it, j'aimerai que le calcul s’arrête par exemple lorsque f(it+1)-f(it) gt.samll

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Sous réserve que j'aie manqué un détail, la solution à ce genre de problème est toujours la même : À la fin de chaque itération, tu testes avec le résultat de l'itération précédente, que tu conserves dans une variable "_prec".

    Pour la première itération, tu n'as évidemment pas de valeur précédente pour tester. Il y a alors 2 solutions :
    • Tu assigne à ta variable _prec une valeur qui t'assure que le test de convergence sera faux.
    • Tu utilises une variable logique pour éviter le test de convergence.

    Ainsi, tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    _prec = valeur inattendue ! pour que le premier test de convergence soit faux.
    do
       Nouvelle valeur = ...
       if (abs(Nouvelle valeur < _prec) < seuil) exit
       _prec = Nouvelle valeur ! pour itération suivante
    enddo
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    logical FaireTest
    FaireTest = .false.
    do
       Nouvelle valeur = ...
       if (FaireTest) then
          if (abs(Nouvelle valeur < _prec) < seuil) exit
       endif
       FaireTest = .true. ! pour les itérations suivantes 
       _prec = Nouvelle valeur ! pour itération suivante
    enddo

  6. #6
    Candidat au Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci Sylvain Bergeron, votre aide m'a été d'un grand secours. J'ai utilisé la première option que j' ai un peu modifiée.

  7. #7
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour.

    Juste en passant, quid des conditions d'arrêt et de sortie des boucles si des fois l'algo ne convergeait pas.

  8. #8
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 91
    Points
    91
    Par défaut
    A titre personnel, je mets un maximum d'itérations possible, qui est une condition de sortie supplémentaire de la boucle (et je teste ensuite si on est sorti par convergence ou par un trop grand nombre d'itérations)

    soit un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    _prec = valeur inattendue ! pour que le premier test de convergence soit faux.
    n=0
    n_max=100 ! par exemple
    do
       n=n+1   
       Nouvelle valeur = ...
       if (abs(Nouvelle valeur < _prec) < seuil) exit
       _prec = Nouvelle valeur ! pour itération suivante
       if (n>n_max) exit  
    enddo
    if (n>n_max) STOP 'Convergence non atteinte'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Recherche d'une valeur dans une ligne en fonction valeur combobox d'un userform
    Par celthi dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2015, 21h25
  2. Recherche d'une valeur en fonction d'une autre
    Par ilyesengineer dans le forum Excel
    Réponses: 20
    Dernier message: 23/12/2011, 20h00
  3. [VBA] Recherche d'une valeur dans un autre fichiers puis
    Par Nicos77 dans le forum Général VBA
    Réponses: 11
    Dernier message: 24/03/2006, 11h24
  4. Réponses: 40
    Dernier message: 24/02/2006, 14h19
  5. [D6] Recherche d'une valeur dans un fichier
    Par Lung dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2005, 08h26

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