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

Algorithmes et structures de données Discussion :

Petit probleme de calcul...


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Petit probleme de calcul...
    Salut, jai un ptit probleme avec mon code , je dois en fait calculer dapres une formule tte simple , le potentiel par rapport a une molecule que jaffiche , le hic est que je me demande si je dois faire pour cela une triple boucle ( une pour sommer sur tous les atomes , lautre pour sommer sur les pixels de coordonnée x et une autre sur y ) et ensuite appliquer betement ma formule ou ya til un meilleur moyen que celui la ?

    La formule est celle ci : potentiel = charge / rayon
    charge est celle de latome considéré , donnée dans un fichier
    rayon : facilement calculé grace aux coordonnées données egalement dans un fichier

    Merci en tt cas de votre réponse


    Modération par Wormful_sickfoot :
    - Sujet déplacé
    Merci de lire les règles du forum.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Déplacé dans le forum Algorithmes, ce sujet trouvera plus de réponses ! Essaies quand même d'être plus clair et de donner plus de détails.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut Re: Petit probleme de calcul...
    Citation Envoyé par Mistoufline
    ...
    La formule est celle ci : potentiel = charge / rayon
    charge est celle de latome considéré , donnée dans un fichier
    rayon : facilement calculé grace aux coordonnées données egalement dans un fichier
    Ben vu ta formule, je te dirais que tu peut faire une seule boucle, sur les atomes de ta moléculle, et tu calcul ton potentiel par atome.

    Après si la valeur du potentiel de ta mollecule n'est pas une simple addition de potentiel (positifs ou négatifs) il faut que tu donne plus d'infos...
    Qui va piano va sano...

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bah en fait voila ce que javais fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i:=1 to nbratome do begin (x,ycoordonées des atomes)
     for j:=1 to 60(xg = nb max d'abscisse  selon une grille definie) do begin
      for k:=1 to 48(yg = nb max dordonnées selon une grille definie) do begin
        E(potentiel):=charge/(sqrt(sqr(xg[j]-x[i])+sqr(yg[k]-y[i]))
      end;
     end;
    end;
    Les coordonées xg et yg etant definies dans la procedure precedant celle la ...en effet tt cela fait parti dun joli petit menu.... Je peux donc les utiliser sans souci et faire appel a elles !

    Pour verifier mes calculs jai demandé ds une boucle similaire dafficher mes potentiels calculés....et la je vois que ca bloque puisqu'ils st ts les memes !!!
    L'idée de faire une seule boucle ne va pas gener sachant que je dois calculer ce potentiel pour ts les points de ma grille ???

    En tout cas merci encore pour vos reponses....et dsl de m'etre trompé dendroit pour poster ce sujet

  5. #5
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Citation Envoyé par Mistoufline
    ...
    L'idée de faire une seule boucle ne va pas gener sachant que je dois calculer ce potentiel pour ts les points de ma grille ???
    ...
    Si!!!!
    j'avais compris que tu voulais le potentiel par atome et pas un diagrame de potentiel en fonction de la position entre atome.

    Effectivement il te faut 3 boucles....

    Mais tu travaille sur une mollécule ou un atome ?
    Qui va piano va sano...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je travaille sur une molécule situé au centre de mon ecran.
    Apres avoir calculé ts mes potentiels , jai un "code couleur" qui est en relation avec ces potentiels , et je ferai juste afficher des pixels a lecran.
    Par contre il m'est venu une question a lesprit , mes potentiels devront etre calculés par rapport a tte ma molecule ce qui fait que je devrais rajouter une 4e boucle....

    Enfin en tt cas merci de votre aide :d

  7. #7
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    de ce que tu nous as montré, il te manque sans doute une condition de test pour savoir si t'es sur l'atome ou pas.
    bizarre ce problème de potentiel constant partout.
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par PINGOUIN_GEANT
    de ce que tu nous as montré, il te manque sans doute une condition de test pour savoir si t'es sur l'atome ou pas.
    bizarre ce problème de potentiel constant partout.
    En faisant la boucle de i:=1 a nbratome je devrais etre forcément sur latome, les x[i] et y[j] ns st pas des variables locales , mais je comprends tjs pas pkoi c constant ... parce qu'en faisant le calcul a la main , ca "marche" donc pkoi pas ds le compilateur ? :

  9. #9
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    désolé de ne pas avoir détaillé, en fait si tu calcules ton potentiel en un point correspondant à un atome, la distance est nulle et tu divises par zéro.
    je ne sais pas si cela arrive c'est pour cela que j'ai mis "sans doute"
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  10. #10
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    Il me semble que tu vas calculer 47 fois de trop sqr(xg[j]-x[i]) et 59 fois de trop sqr(yg[k]-y[i]). Je doute fort que l'optimiseur s'en aperçoive. Aussi, dans un cas comme cela, je calculerais d'abord des tableaux intermédiaires sqrxgmx[60] et sqrygmy[48] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for i:=1 to nbratome do begin 
     for j:=1 to 60 do begin 
          sqrxgmx[j]=sqr(xg[j]-x[i]);
     end;
     for k:=1 to 48 do begin 
          sqrygmy[k]=sqr(yg[k]-y[i]);
     end;
     for j:=1 to 60 do begin 
      for k:=1 to 48 do begin 
        E(potentiel):=charge/(sqrt(sqrxgmx[j]+sqrygmy[k]); 
      end; 
     end; 
    end;
    Il n'est pas évident que ça marchera : ça dépend du hardware. Si le calcul est plus rapide que la référence mémoire, ça peut être moins bon. Mais pourquoi ne pas essayer ?

    Faut voir...

  11. #11
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Salut,


    Je n'ai peut-être pas bien compris l'algorithme, mais est-ce qu'il ne faudrait pas ajouter les potentiels en chaque points ? Il me semble que dans l'algorithme, le potentiel est réassigné pour chaque atome. Normalement l'ordinateur calcule à peu près juste donc il doit y avoir une solution.

  12. #12
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Je me suis peut-être mal fait comprendre : en aucun cas je n'ai émis un avis sur l'adéquation de ton algorithme pour résoudre ton problème. En d'autres termes, je ne me suis pas intéressé au rapport entre ton problème physique de potentiel et ton programme, mais simplement à ton programme, indépendamment des quantités physiques qu'il calcule.

    Je dis simplement que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i:=1 to nbratome do begin (x,ycoordonées des atomes) 
     for j:=1 to 60(xg = nb max d'abscisse  selon une grille definie) do begin 
      for k:=1 to 48(yg = nb max dordonnées selon une grille definie) do begin 
        E(potentiel):=charge/(sqrt(sqr(xg[j]-x[i])+sqr(yg[k]-y[i])) 
      end; 
     end; 
    end;
    est, si je ne me suis pas trompé, équivalent à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for i:=1 to nbratome do begin 
     for j:=1 to 60 do begin 
          sqrxgmx[j]=sqr(xg[j]-x[i]); 
     end; 
     for k:=1 to 48 do begin 
          sqrygmy[k]=sqr(yg[k]-y[i]); 
     end; 
     for j:=1 to 60 do begin 
      for k:=1 to 48 do begin 
        E(potentiel):=charge/(sqrt(sqrxgmx[j]+sqrygmy[k]); 
      end; 
     end; 
    end;
    J'ai des raisons de penser que le deuxième code calculera exactement la même chose que le premier mais ira plus vite (pas sûr, mais ça vaut la peine d'essayer). Je n'ai pas suffisamment étudié ton problème pour pouvoir répondre à une question sur la physique du problème étudié...
    La quantité sqr(xg[j]-x[i]) à l'évidence ne dépend que de i et j ; plus précisément elle ne dépend pas de k. Je me contente donc de la calculer une fois au lieu de 48 fois et de stocker cela dans un petit tableau auxilliaire. De même la quantité sqr(yg[k]-y[i]) ne dépend que de i et k, donc pas de j. Au lieu de la calculer 60 fois, je la calcule une fois pour toutes dans un petit tableau auxilliaire.
    Maintenant, c'est vrai que je ne sais pas ce que tu caches derrière l'expression "E(potentiel)". S'il s'agit d'une variable, tu calcules nbratome*60*48 fois une quantité que tu stocke toujours dans la même variable ; je doute que ce soit cela... Si par contre tu exécutes ailleurs que dans cette boucle des changements susceptibles de changer "charge" ou les xg, ou les yg, ou les x ou les y, alors mon code est complètement différent du tien...et il est faux !

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci bcp pour ttes vos informations , le dernier code que tu mas indiqué
    marche du tonnerre de dieu , jai rajouté qq lignes pour que tt fonctionne , mais vraiment merci , vous mavez bien aidé !!!!

  14. #14
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut Combien de fois plus vite ?
    Ravi de l'apprendre. En termes de performances quel pourcentage as-tu gagné en temps de calcul ?

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon en fait j'ai parlé trop vite.... En effet , mon joli programme , arrivé a ce moment la ne veut plus du tout fonctionner : soit il me dit que la division par zero nest pas bonne , soit il sort tt bonnement du compilateur , et jai ainsi perdu une fois ( mais pas deux :p ) ce que javais fait ....

    Bref voila ce que mon code donne , je ne vois pas du tout où ca pe bugger , si qq1 sait comment resoudre ce satané probleme de division par zero .... je ladooooooooore !!!!

    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
    for j:= 1 to 60 do begin
        for k:=1 to 48 do begin
         for i:=1 to nbratome do begin
          r[i]:=sqrt(abs(sqr(xgh[j]-xb[i])+sqr(ygh[k]-yb[i]))); {jai du rajouter abs car il refusait de faire la racine du nb !}
          if r[i]<rayonVdW[i] then
           affichpixel[j,k]:=false { affichpixel est un tableau de booleen qui me servira par la suite }
          else
           affichpixel[j,k]:=true;
          V:=charge[i]/r[i]; { la division par zero pose pb a ce nivo la ! }
          Vtot[j,k]:=Vtot[j,k]+V; { vtot est le potentiel sur lensemble de ma molecule dapres les pixels de coordonées j,k de mon ecran avec une certaine resolution predefinie ! }
         end;
        end;
       end;
     
       for j:=1 to 60 do begin
        for k:=1 to 48 do begin
         writeln(Vtot[j,k]); { je voulais verifier le calcul de mes potentiels , mais bon rien ne saffiche !! LOL }
        end;
       end;
    Merci bcp de votre réponse....

    En tout cas je sais pas si jai gagné en rapidité car jai enlevé les tableaux , mais si jamais ce que jai fait ne marche pas , je pense que je v y revenir !!!!

  16. #16
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par PINGOUIN_GEANT
    désolé de ne pas avoir détaillé, en fait si tu calcules ton potentiel en un point correspondant à un atome, la distance est nulle et tu divises par zéro.
    je ne sais pas si cela arrive c'est pour cela que j'ai mis "sans doute"
    : ce n'est pas cela ton problème de division par zéro ?
    le potentiel n'est pas défini au point où il y a un atome, cela ferait zéro en distance quand tu veux calculer avec la charge en ce point.
    PS : en fait si, la particule chargée est soumise à la force résultant du potentiel créé par les autres particules (la fameuse somme sur j, j différent de i)
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  17. #17
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 116
    Points
    116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         for i:=1 to nbratome do begin 
          r[i]:=sqrt(abs(sqr(xgh[j]-xb[i])+sqr(ygh[k]-yb[i]))); {jai du rajouter abs car il refusait de faire la racine du nb !} 
          if r[i]<rayonVdW[i] then 
           affichpixel[j,k]:=false { affichpixel est un tableau de booleen qui me servira par la suite } 
          else 
           affichpixel[j,k]:=true; 
          V:=charge[i]/r[i]; { la division par zero pose pb a ce nivo la ! }
    C'est bien de tester si r[i]<rayonVdW[i] (je suppose que c'est un petit nombre pour éviter les divisions par zéro), mais même si ça fait zéro cela ne t'empêche pas de la faire ta division par zéro !!! Quelle que soit l'interprétation physique que tu peux donner à cette division par zéro, il est clair que mathématiquement cela n'a aucun sens. Donc tu dois calculer V seulement dans le cas où ton diviseur n'est pas nul !

    Par ailleurs, ton insertion de "abs" paraît vraiment bizarre ! Un carré est nécessairment positif ou nul ! Je ne connais pas ton langage, mais est-ce que sqr ne produirait pas, par hasard, des entiers, alors que sqrt s'attend à avoir un réel comme argument ?

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Par ailleurs, ton insertion de "abs" paraît vraiment bizarre ! Un carré est nécessairment positif ou nul ! Je ne connais pas ton langage, mais est-ce que sqr ne produirait pas, par hasard, des entiers, alors que sqrt s'attend à avoir un réel comme argument ?
    Pour le langage c'est du pascal ( une daube soit dit en passant !!!! ), pour le abs en fait le prof lui mm ne sait pas pkoi on doit le mettre alors que c forcément positif....mais dans ce cas la , vo mieux ne pas chercher a comprendre ! LOL
    Mais je vais essayer de faire un test sur mon r pour voir si il est =0 ou pas !
    Je suis forcément sur l'atome en fait , parce que ma boucle de i:=1 to nbratome et dans mon fichier les coordonnées sont données !!
    Mais en tt cas merci pour vos indications , je vais travailler ca ce soir !!

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon ben jai reussi finalement a trouver la ou ca coincé , ca ne venait pas de mon code , mais du turbo pascal lui meme .... lorsque je creais mon tableau r[i], pour pascal ct bien trop gros , du coup , il me sortait tt bonnement du programme puisquil ne pouvait pas gerer ca , la solution est alors de creer une fonction qui calcule mon r avec trois parametres ( i,j et k) !!!! Et de reinserer tt ca ds la formule !!!!
    L'erreur 207 se resout quant a elle en mettant sqrt(abs(...)) !!! Alors je sais ca marche une fois sur 2....mais c deja pas si mal !!!

    Voila je me suis dit que ct pas mal de mettre la solution a tt ca , jespere que ca pourra faire profiter qq1 !!!!

    Encore merci pour votre aide !

    Surement @ plus tard pr un autre pb

Discussions similaires

  1. Update calcul dans une colonne petite probleme
    Par mihaispr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/12/2009, 10h24
  2. [Débutant] Petit problème pour calcul de somme
    Par kriskikout dans le forum Ada
    Réponses: 4
    Dernier message: 04/11/2006, 06h47
  3. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  4. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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