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

Python Discussion :

Résolution d'une équation par dichotomie


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Lycéen
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Par défaut Résolution d'une équation par dichotomie
    Bonjour j'aurais besoin d'un petit peu d'aide je dois écrire un programme en python et je n'y arrive pas. Voila l’énoncer:

    On considère la fonction f définie sur [4,6] par f(x)=-0,2x^3+x^2+0.5x+1.
    La propriété des valeurs intermédiaires nous permet d’affirmer que l’équation f(x)=0 admet une unique solution alpha sur [4,6].
    Ecrire un programme en Python permettant de « résoudre » par dichotomie l’équation f(x)=0 en obtenant une valeur approchée de alpha a 10^-n.
    La fonction f sera définie comme une fonction dans le programme python.
    Les nombre les bornes de l’intervalle initial a et b seront saisies par l’utilisateur, ainsi que k (dans notre exemple k=0) et n fixant la précision de la valeur approchée (à 10^-n).
    Pour tester le programme, on pourra ensuite lancer d’autres résolutions comme celle de l’équation f(x)=2.

    Et voila ce que j'ai fait:

    def f(x):
    return -0.2*x*x*x+x*x+0.5*x+1
    A = input("A = ")
    B = input("B = ")
    N = input("Precision = ")

    if f(A)*f(B)>0 :
    print("pas de racine entre ",A," et ",B)
    else:
    while B-A>=N :
    C =(A+B)/2
    if f(C)*f(B)<=0 :
    B=C
    else :
    A=C
    print("Une racine entre ",A, "et ",B)


    Merci d'avance

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    il y a plusieurs choses qui ne vont pas dans ce que tu fais.

    Evacuons ça tout de suite : la forme. Quand tu postes sur le forum, utilise le bouton '#' qui te mettra les balises début et fin et tape (ou colle) ton code entre ces deux balises. C'est beaucoup plus lisible comme ça (surtout que l'indentation fait partie intégrante de Python).

    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
    def f(x):
        return -0.2*x*x*x+x*x+0.5*x+1
     
    A = input("A = ")
    B = input("B = ")
    N = input("Precision = ")
     
    if f(A)*f(B)>0 :
        print("pas de racine entre ",A," et ",B)
    else:
        while B-A>=N :
            C =(A+B)/2
            if f(C)*f(B)<=0 :
                B=C
            else :
                A=C
     
        print("Une racine entre ",A, "et ",B)
    Sur le fond maintenant.

    Déjà, tu utilises les signes des résultats de la fonction aux extrémités de l'intervalle pour déterminer quelle extrémité tu vas changer par l'abscisse du milieu (C).

    Ca marche au début parce que l'ennoncé te demande de chercher une solution à f(x) = 0. Mais, à la fin, il est demandé de tester le programme pour chercher la solution de f(x) = 2. Ca marchera beaucoup moins bien ...


    Ensuite (je reste dans le cas où on cherche la solution de f(x)=0 sans me soucier de celle de f(x)=2), ton changement d'une extrémité de l'intervalle se passe mal. Si tu ne le vois pas "à l'oeil", affiche les valeurs qui te permettront de t'en rendre compte (valeurs de A, f(A), C, f(C), B et f(B)) avant et/ou après modifications, aux bons endroits.

    Enfin, tant que tu n'as pas validé ton code, je te conseille aussi de coder en dur tes valeurs A, B et N ce qui t'évitera d'avoir à saisir à chaque exécution les valeurs (et commente les instructions input). Tu te conformeras à l'ennoncé en remettant les input pour la saisie à la fin. Tu peux aussi prendre une valeur pas trop petite pour la précision car, sinon, cela va te générer des tonnes de lignes d'affichage (0.1 fera l'affaire pour commencer)

    Ah oui, j'allais oublier : c'est bien parce que l'ennoncé te donne les noms de variables à utiliser mais A, B, N et F, c'est pas terrible ...


    [EDIT] pour être complet, si epsilon représente la précision demandée, ton test while peut porter sur 2 x epsilon en prenant le milieu comme solution (que tu n'affiches jamais dans ton code, d'ailleurs). Ca ne fait gagner évidemment qu'une itération (sur ...) mais comme on fait des maths ...

  3. #3
    Membre régulier
    Femme Profil pro
    Lycéen
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Par défaut
    Merci de m'avoir répondu mais j'ai pas très bien compris se que je dois changer pour que sa marche avec f(x)=2 ?

  4. #4
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Sur [4;6], la fonction est décroissante.

    Dans ton code, à chaque itération, tu calcules le signe de f(C) x f(B) et en déduis s'il faut remplacer la borne min (A) par C (le milieu) ou la borne max (B) par C. Ca va marcher parce que, pour x < alpha, f(x) est positif, et après, pour alpha < x, f(x) est négatif.

    Avec le même code, si tu cherches la solution de f(x) = 2, quand tu te rapprocheras de alpha (intervalle suffisamment petit autour de alpha), tu vas avoir des valeurs f(x) proches de ... 2 c'est-à-dire toutes les deux positives. Donc le calcul de signe n'a plus de sens. Ce n'est pas le signe de f(x) qu'il faut prendre en compte.

    Sinon, as-tu bien vu que tu te trompes sur le choix de la borne, A ou B, à remplacer par le milieu C ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jojo5457 Voir le message
    Merci de m'avoir répondu mais j'ai pas très bien compris se que je dois changer pour que sa marche avec f(x)=2 ?
    Salut
    Ben au lieu de regarder le signe de f(A) * f(B) te suffit de regarder si le but (ici 2) se trouve entre f(A) et f(C) ou bien entre f(C) et f(B).
    Ensuite, selon le cas, tu places A ou B à la place de C puis tu recalcules un nouveau C et tu recommences. C'est quand-même la base du principe de la recherche par dichotomie quoi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    En modifiant un peu ton code (bon choix de la borne à remplacer), avec un epsilon (N) à 1e-3, MAIS toujours sans tenir compte du fait qu'on cherche f(x) = 2, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    plx@sony:~$ python3 faux_dicho.py 
    iteration  1 : f(A) = +6.200000  f(C) = +3.500000  f(B) = -3.200000   : f(C) x f(A) > 0 => A devient C
    iteration  2 : f(A) = +3.500000  f(C) = +0.725000  f(B) = -3.200000   : f(C) x f(A) > 0 => A devient C
    iteration  3 : f(A) = +0.725000  f(C) = -1.084375  f(B) = -3.200000   : f(C) x f(A) < 0 => B devient C
    iteration  4 : f(A) = +0.725000  f(C) = -0.142578  f(B) = -1.084375   : f(C) x f(A) < 0 => B devient C
    iteration  5 : f(A) = +0.725000  f(C) = +0.300342  f(B) = -0.142578   : f(C) x f(A) > 0 => A devient C
    iteration  6 : f(A) = +0.300342  f(C) = +0.081183  f(B) = -0.142578   : f(C) x f(A) > 0 => A devient C
    iteration  7 : f(A) = +0.081183  f(C) = -0.030120  f(B) = -0.142578   : f(C) x f(A) < 0 => B devient C
    iteration  8 : f(A) = +0.081183  f(C) = +0.025675  f(B) = -0.030120   : f(C) x f(A) > 0 => A devient C
    iteration  9 : f(A) = +0.025675  f(C) = -0.002186  f(B) = -0.030120   : f(C) x f(A) < 0 => B devient C
    iteration 10 : f(A) = +0.025675  f(C) = +0.011754  f(B) = -0.002186   : f(C) x f(A) > 0 => A devient C
    racine 5.6044921875 trouvée en 10 iterations  f(alpha) = 0.004786
    alpha valant plutôt 5.6051626015105285 (donc je suis bien à 10-3 près)

    En fait, ça continue de chercher la racine de f(x) = 0 ...

    Nulle part tu n'as (cf l'ennoncé) la variable K

    Citation Envoyé par ennoncé
    ...par l’utilisateur, ainsi que k (dans notre exemple k=0)...
    Pour tester le programme, on pourra ensuite lancer d’autres résolutions comme celle de l’équation f(x)=2.
    Qu'est-ce qui va changer de signe aux alentours de alpha ? f(x) ? ou f(x) ... ?

  7. #7
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Une image comme piste.

    résoudre f(x) = 2 c'est résoudre, en posant g(x) = f(x)-2, g(x) = 0

    Avec la "nouvelle" fonction g, on se remet dans les conditions pour avoir des valeurs g(x) qui changent de signe autour de la racine ...


    en vert, le fonction f
    en rouge, la fonction g
    en magenta, la fonction y = 2

    la droite verticale bleue passe par l'intersection de f et de y=2.

    On dirait bien qu'elle passe aussi par l'intersection de g et de y = 0 ...


Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2015, 09h02
  2. résolution d'une équation par récurrence
    Par Gamzella dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/06/2014, 13h05
  3. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 20/08/2009, 17h47
  4. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 10h04
  5. Résolution d'une équation par Gauss
    Par rahmani01 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/11/2006, 22h15

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