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 :

[Débutant] Fonction de Bessel


Sujet :

Fortran

  1. #1
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut [Débutant] Fonction de Bessel
    Bonjour,
    J ai devant moi a calculer la fonction de Bessel J0 pour un X donner et d arreter le programme quand le nouveau terme de la somme soit inferieur a 0.00001*(le terme totale),
    Mais quand je la donne une valeur X , la reponse est NAN, alors ou est le truc? merci
    voila le code
    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
      program bessel
                 real X,J
                 print*,'donner X'
                 read*,X
                 CALL BESSELO(X,J)
                 print*,'J0(X)=',J
                 end
     
     
     
                 SUBROUTINE BESSELO(Y,K)
                 real Y,K
                 K=0
                 do i=1,10000
                   K=K+((-1)**i)*((Y/2)**(2*i))/(fact(i))**2
                   if (abs(K).LT.K) exit
                 enddo
                 end 
     
               function fact(m)
             real fact
           integer  m, p
           p = 1
                  do i = 1, m
                       p = p * i
                  end do
           fact = p
           end
    Je rappel que J0(X)=somme(i=1,infini) (-1)^i/(i!)^2*(x/2)^(2*i)

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut Fonction de Bessel
    Salut.

    Premièrement, si tu veux qu'on réponde à tes questions, il faudrait qu'on les comprenne. Alors, essaie de les écrire en français.

    Ensuite, j'ai un peu mieux compris ton Fortran. Et je pense que ta formule est inutilisable pour la raison suivante:
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut Fonction de Bessel
    Désolé, mais je n'ai pas pressé la bonne touche!

    Suite:
    Je n'ai pas calculé combien vaut 10000!, mais je suis convaincu que c'est plus que le plus grand nombre représentable dans le processeur avec lequel tu travailles.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  4. #4
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Je clarifie
    tu sais que la fonction de Bessel est donnee par une serie .
    le probleme dit : etant donne' un reel X, calculer J_0(X),
    tu as J_0(X)= \sum_{m=0}^{\infty} U_m, ou U_m est une suite dont j ai donne' son terme general. il faut arreter le programme quand la difference entre \sum_{m=0}^{N} U_{m}-\sum_{m=0}^{N+1} U_{m} soit plus petite que 0.00001
    Voila le probleme detailler
    moi j ai fait le programme, mais il ne donne pas les reponses voulu

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    salut,

    K=K+((-1)**i)*((Y/2)**(2*i))/(fact(i))**2
    FR119492 a raison, ton proc verra rouge lorsqu'il devra évaluer fact(i) avec i se rapprochant de ... 100, alors imagine 10 000...

    Juste par curiosité, que fais-tu comme études (travail) ?

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut Fonction de Bessel
    Tu utilises le développement en série de Taylor ou de MacLaurin qui est probablement une des plus mauvaises méthodes pour évaluer une fonction transcendante ailleurs que tout près de l'origine. As-tu choisi toi-même cette méthode ou t'a-t-elle été imposée par ton prof. ? Si c'est le cas, change de prof. au plus vite !

    Je n'ai pas ma documentation sous la main, mais je vais essayer ces prochains jours de te trouver quelque-chose de mieux.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  7. #7
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Pour afrancisco: mathématiques appliquées
    pour Jean Marc: C est un exercice proposé dans un livre

  8. #8
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    J ai modifié le programme, mais quand meme je ne suis pas convaincu des résultats
    voila mon code
    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
               .
                 program bessel
                 real X,J
                 print*,'donner X'
                 read*,X
                 CALL BESSELO(X,J)
                 print*,'J0(X)=',J
                 end
     
     
                 SUBROUTINE BESSELO(Y,K)
                 real Y,K,Kold
                 Kold=0
                 do i=1,10000
                   K=Kold+((-1)**i)*((Y/2)**(2*i))/(fact(i))**2
                   Kold=K
                   if (abs(K-Kold).LT.0.0001) exit
                 enddo
                 end 
     
                 function fact(m)
                  real fact
                  integer  m, p
                  p = 1
                  do i = 1, m
                       p = p * i
                  end do
                   fact = p
                 end

  9. #9
    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
    Es-tu convaincu que les lignes suivantes sont dans le bon ordre ?

    Citation Envoyé par feynman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
               .
    ...
                   K=Kold+((-1)**i)*((Y/2)**(2*i))/(fact(i))**2
                   Kold=K
                   if (abs(K-Kold).LT.0.0001) exit
    ...

  10. #10
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Bah oui, que penses tu?

  11. #11
    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
    Comme Kold = K, comment veux-tu que abs(K - KOld) donne autre chose que 0 ?

  12. #12
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    t as raison j ai pas fait attention a ca,
    alors quel est l equivalent? qu est ce qu il faut modifier?

  13. #13
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut Fonction de Bessel
    Salut !

    Je t'avais suggéré de changer de prof. Je rectifie: change de livre.

    D'autre part, à la venir, si tu veux qu'on t'aide efficacement, ce qu'on fait volontiers, copie textuellement dans tes messages l'énoncé complet de tes problèmes. Ce sera plus rapide que si on doit te demander trois fois des précisions.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    salut,

    D'une manière générale, lorque l'on calcul des quotients type coefficient du binôme, il faut arranger l'expression à implémenter :
    si q=fact(i+1)/fact(i), il faut le remplacer lors de la programmation par q=i+1

    Je sais, l'exemple est trivial, mais le principe s'applique à beaucoup de cas ... même si, parfois, il faut regrouper en plus des termes de la série ( notamment en présence d' un (-1)**i )

    Il est utopique de vouloir systématiquement coder une formule telle quelle.

  15. #15
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    D'autre part, à la venir, si tu veux qu'on t'aide efficacement, ce qu'on fait volontiers, copie textuellement dans tes messages l'énoncé complet de tes problèmes. Ce sera plus rapide que si on doit te demander trois fois des précisions.
    Certes, mais on n'est pas la pour faire ses devoirs non plus. Il faut qu'il apprenne par lui-meme. Pour l'instant, feynman lance un petit programme ecrit un peu au hasard sur le forum deux fois par jours, et attend la reponse. Ce n'est pas une bonne methode d'apprentissage.

  16. #16
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Salut !

    Je t'avais suggéré de changer de prof. Je rectifie: change de livre.

    D'autre part, à la venir, si tu veux qu'on t'aide efficacement, ce qu'on fait volontiers, copie textuellement dans tes messages l'énoncé complet de tes problèmes. Ce sera plus rapide que si on doit te demander trois fois des précisions.

    Jean-Marc Blanc
    cher Jean Marc, j apprend le fortran seul, y a pas de prof.
    voila l ennonce' en anglais:
    write a program to approximate the value of the infinite series J_0(X)=1-X^2/2^2+X^4/(2^2*4^2)-X^6/(2^2*4^2*6^2)+..........
    when computing the Bessel function , terminate the series when the absolute value of any new term changes the approximation by no more than 0.1%


    J espere que je suis claire maintenant

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Salut,

    Malgré les difficultés que tu peux rencontrer (apprentissage du fortran et de l'anglais), tu dois réfléchir avant d'écrire ton programme : ce n'est pas parcequ'il t'est demandé de programmer une série qu'il faut recopier aveuglément la formule en fortran (ou autre ...)
    Tu dois d'abord écrire l'algorithme sur papier et ensuite l'implémenter. On a l'impression que tu ponds un programme un peu vite, et que s'il ne fonctionne pas du premier coup, tu postes pour que l'on te le debugg.
    Bref, "aide-toi et le ciel t'aideras" : la communauté est prête à t'aider, mais le premier niveau de debugg doit être assuré par toi-même.

    Bon courage !

Discussions similaires

  1. [Débutante]Fonction pour écrire un champ vide
    Par Bewitch dans le forum ASP
    Réponses: 14
    Dernier message: 30/08/2005, 11h43
  2. [gros débutant]fonctions
    Par cellimo dans le forum C++
    Réponses: 4
    Dernier message: 26/08/2005, 13h58
  3. [Débutant]Fonction avec des flags
    Par @r$£~%[ dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2005, 10h19
  4. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  5. [Ada] [Débutant] Fonction et Put_Line
    Par hitchie dans le forum Ada
    Réponses: 1
    Dernier message: 18/10/2004, 09h44

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