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

Calcul scientifique Python Discussion :

Méthode de la sécante ?


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Méthode de la sécante ?
    Bonjour,

    Je dois écrire le programme suivant mais j'ai un souci: je manipule Python depuis seulement un mois ( !! ) et notre prof nous a donné la chose suivante à réaliser pour nous entraîner. J'ai énormément de mal à démarrer, à comprendre tout simplement même en ayant visionné quelques exemples utilisant la méthode de la sécante.
    Si une âme charitable pouvait me montrer à quoi ressemble le programme suivant... ? Car j'ai ensuite un autre exercice à faire qui y ressemble beaucoup et celui-ci pourrait me servir d'exemple ( et si on veut bien m'expliquer un tout petit peu aussi ? )
    Je vous remercie par avance,
    Signé un gars un peu paumé

    Écrire une fonction secante(a,b,f,max_iter=200) qui prend en entrée deux réels a et b et
    une fonction f tels que |f(a)| > |f(b)| > 0, et renvoie une approximation d’un point x∗ où
    f(x∗) = 0 en itérant la formule de la sécante : xn+1 et le point où s’annule la fonction affine qui
    coïncide avec f aux points xn et xn−1. Pour se garder du cas où cette suite ne converge pas,
    on convient de limiter le nombre d’itérations à max_iter, et de retourner None s’il est atteint
    .

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    La méthode de la sécante est décrite sur Wikipedia. Donc vous avez l'algorithme.

    Je dois écrire le programme suivant mais j'ai un souci: je manipule Python depuis seulement un mois ( !! ) et notre prof nous a donné la chose suivante à réaliser pour nous entraîner.
    La programmation est une pratique où on apprend en accumulant de l'expérience et des savoir-faire.
    Au début, on apprend à se faire comprendre par la machine. Pas facile de se rendre compte qu'elle est tellement bête qu'il faut tout lui expliquer et pas n'importe comment. Cette expérience est unique. C'est un peu comme le vélo: c'est pas en regardant les gens qui savent en faire que vous allez apprendre... Il va falloir oser y aller et y passer du temps.

    Pour commencer, il faut passer par papier crayon.
    Ca commence par définir une fonction f dont vous connaissez les x, tels que f(x) = 0.
    Puis celle d'un intervalle a, b qui encadre un des x.
    Puis le calcul de la suite pour voir comment l'algorithme se déroule pas à pas pour quelques itérations.

    Ce n'est qu'après avoir maîtrisé ce déroulé pas à pas que vous allez pouvoir essayer de traduire cela en instructions Python.

    Exemple.

    Prenez la fonction x(x-10). Elle s'annule en 0 et en 10.

    Partez avec a = 5, b = 15.
    Vous allez d'abord calculer les images f(a), f(b) pour trouver:
    x = b - (f(b) * (b-a)) / (f(b) - f(a))
    on remplace "a" par "b" et "b" par "x" et on recommence.

    Après vous lancez la console Python pour faire jouer le truc "à la main" mais cette fois, par la machine:
    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
    >>> def f(x): return x*(x-10)
    ...
    >>> a, b = 5, 15  # etape 0
    >>> x = b - (f(b) * (b - a)) / (f(b) - f(a))
    >>> a, b = b, x
    >>> a, b  # etape 1
    (15, 7.5)
    >>> x = b - (f(b) * (b - a)) / (f(b) - f(a))
    >>> a, b = b, x
    >>> a, b  # etape 2
    (7.5, 9.0)
    >>> x = b - (f(b) * (b - a)) / (f(b) - f(a))
    >>> a, b = b, x
    >>> a, b # etape 3
    (9.0, 10.384615384615385)
    >>>
    Vous vérifiez que vous obtenez les résultats attendus.
    note: vous pouvez utiliser la flèche vers le haut/vers le bas pour rappeler les instructions précédentes.

    L'étape suivante sera d'écrire la fonction "secante" en y plaçant les mêmes instructions (dans une boucle for...)
    Puis corriger le petit bug de division par zéro.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    bonjour,
    je me pose une petite question...
    qd on a ce genre d'exercice il faut choisir notre fonction f et ensuite écrire notre programme en fonction de celle ci ou écrire un programme vrai pour toutes les fonctions f vérifiant la condition de l'énoncé ?
    merciii

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord wiztricks, merci pour votre réponse !

    Oui voilà, c'est ce qui me bloque aussi.
    Et je n'arrive pas à comprendre, à me lancer pour passer du cas "à valeurs" au "cas général".
    Car écrire un petit programme pour tester des valeurs etc, je l'avais fait.
    C'est justement la dernière étape que vous avez mentionnée wiztricks qui me fait défaut et que je n'arrive pas à réaliser...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par carryPAR Voir le message
    qd on a ce genre d'exercice il faut choisir notre fonction f et ensuite écrire notre programme en fonction de celle ci ou écrire un programme vrai pour toutes les fonctions f vérifiant la condition de l'énoncé ?
    C'est un problème de poules et d’œufs.
    Sans se donner une fonction, difficile de dérouler et trouver la séquence d'opérations essentielle au programme.
    Et si on ne connaît pas cette séquence d'instructions pour une fonction connue pas la peine d'essayer sur d'autres.
    note: si l'algorithme est tordu, il faudra peut être trouver plusieurs fonctions pour vérifier son comportement "aux limites" ou dans des conditions particulières. En général, faire un "plan de test" est beaucoup plus compliqué qu'écrire le code.

    Pour le reste, cette séquence d'opérations n'est, ici ,que la traduction de la méthode de la sécante.
    C'est un algorithme de mathématiques numériques.
    Comme tout algo. il définit les pré-requis à respecter pour ne pas faire n'importe quoi (et donc la classe de fonctions auxquelles il s'applique).

    Si le code respecte l'algorithme, il pourra s'appliquer aux fonctions correspondantes (modulo les erreurs d'approximations dues à la représentation des réels sur un ordi.).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    d'aacord je comprends merci
    par contre quand je rentre votre algo j'obtient: 'int' object is not callable
    je pense que c'est parce que mon a et b ne sont pas vu comme des entiers qd je calcule f(a) et f(b)

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    je pense que l'algorithme est quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def secante(a,b,n):
         for i in range(n):
                  if f(b)-f(a)=!0
                        a=a-f(a)*(b-a)/(f(b)-f(a))
                  else:
                        .................................
         if -0.2<n<0.2:
                 print("une approximation est", a)
         else:
                 print("la suite ne converge pas, pas d'approximation)
    pour les ..... je ne sais pas ce qu'il faut mêtre.
    est ce à peu près correct ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par dumon Voir le message
    Car écrire un petit programme pour tester des valeurs etc, je l'avais fait.
    C'est justement la dernière étape que vous avez mentionnée wiztricks qui me fait défaut et que je n'arrive pas à réaliser...
    Ben, c'est assez mécanique.
    Et comme c'est "mécanique" c'est une habitude a prendre, des automatismes à construire.

    Vous avez le bloc d'instructions à répéter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> x = b - (f(b) * (b - a)) / (f(b) - f(a))
    >>> a, b = b, x
    Vous vous rappelez que l'énoncé demande d'écrire la fonction "secante(a,b,f,max_iter=200)".
    a, b, f sont déjà là...
    Reste à "automatiser" la répétition obtenue avec les flèches: çà va se traduire par un "for z in range(max_iter)".

    Donc le premier jet doit être un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def secante(a,b,f,max_iter=200):
         for z in range(max_iter):
            # tester f(b) - f(a)
            x = b - (f(b) * (b - a)) / (f(b) - f(a))
            a, b = b, x
         # retourner le résultat
    Recopier des lignes, c'est quand même assez bourrin.

    Après, c'est une fonction donc elle doit retourner une valeur.
    Ensuite il faut tester f(b) - f(a) non nul pour forcer, dans ce cas, la sortie de la boucle en s'assurant qu'on retourne le bon résultat.

    A vous de boucher les trous, car n'oubliez pas que sans mettre un peu les mains dans le cambouis, vous n'apprenez pas.
    Donc vous perdez votre temps (et moi aussi).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    wiztricks, est ce correct ce que j'ai écrit ?
    merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par carryPAR Voir le message
    wiztricks, est ce correct ce que j'ai écrit ?
    Votre code sera "correct" s'il fonctionne et retourne les résultats attendus.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. la méthode sécante
    Par ferdousinfo dans le forum MATLAB
    Réponses: 1
    Dernier message: 20/05/2011, 18h47
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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