Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trouvez les solutions de f(x) = 0 dans l'intervale [a;b]

Algorythme en TI-Basic

Sujet résolu
    25 octobre 2012 à 19:04:25

    Bonours à tous ! :p

    Je cherche a créer un algorythme en TI-Basic capable de me retourner toutes les solutions de l'équation f(x) = 0 pour f une fonction définie dans l'intervalle [a;b].

    - La fonction ainsi que a et b sont les éntrés de l'algorythme.
    - La sortie de l'algorythme doit être les solutions.

    Je sais que je dois enregistrer la fonction dans Y1 (Visible avec la touche f(x) de la calculatrice) mais après je ne sais pas vraiment comment faire..
    Vu que l'algorythme ne sais pas à quoi ressemble la fonction quand je le cré, je ne sais pas comment le créer..

    Pour le moment, j'ai fait ceci : (Les entrées)
    Input "F(X)=",Str1
    Input "A=",A
    Input "B",B
    Str1->Y1
    


    Je ne vois vraiment pas ensuite comment exploiter la valeur de Y1, merci d'avance pour votre aide. :)
    Cordialement, Corentin.

    PS: Je suppose qu'il faut utiliser l'algorythme de dichotomie mais il ne me retournerais qu'une seule solution..
    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2012 à 19:31:45

      Un algo qui te donnerait toutes les solutions de n'importe quelle équation, ce serait trop beau. ^^ Essaie déjà de réaliser un algo d'approximation d'une solution par dichotomie. Cela impliquera que tu saches déjà que cette solution existe (sans forcément connaître sa valeur, en le voyant sur le graphe par exemple). Il faudra également demander à l'utilisateur la précision attendue car toutes les solutions ne sont pas des nombres entiers ou décimaux.

      Après, tu pourras peut-être réfléchir à un algo utilisant le précédent et effectuant une recherche de plusieurs solutions.
      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel : Apprendre à programmer avec Ada : Version 1 achevée et publiée
        25 octobre 2012 à 19:33:06

        D'accord, merci :p

        Mais mon profésseur de mathématique m'a demandé de créer cette algo, c'est surement que c'est possible..

        Peux tu m'expliquer comment obtenir plusieurs solutions avec l'algo dichotomie stp ?
        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2012 à 20:25:43

          Salut,
          Je doute que ton prof t'aie vraiment demandé cela, parce que de temps en temps, certaines fonctions ont une infinité de zéros sur un intervalle. Bon courage dans ce cas. :p
          La première idée d'un algorithme permettant de trouver un zéro de ta fonction est le théorème des valeurs intermédiaires : si f(a)>0 et f(b)<0, alors il existe c dans [a,b] tel que f(c) = 0 (quand tu traces une telle fonction, tu passes forcément par zéro à un moment ou un autre).
          Mais comment trouver ce c ? La dichotomie est la solution. Petit indice sur comment procéder : dichotomie signifie "séparer en deux" (eh ouais je te laisse chercher un peu :p ).
          • Partager sur Facebook
          • Partager sur Twitter
            25 octobre 2012 à 20:49:13

            Le principe est le suivant :
            1- on regarde f(a) et f(b), supposons f(a) positif et f(b) négatif
            2- on regarde f(c) où c est le "milieu" : <math>\({a + b} \over 2\)</math>. S'il est positif, alors on recommence sur l'intervalle [c;b] au lieu de [a;b]. S'il est négatif, on recommence avec [a;c].

            On arrête l'algo soit quand on trouve c tel que f(c) = 0, soit quand la longueur de l'intervalle descend en dessous d'une certaine valeur (en dessous de 0,001 par exemple).
            • Partager sur Facebook
            • Partager sur Twitter
            Tutoriel : Apprendre à programmer avec Ada : Version 1 achevée et publiée
              25 octobre 2012 à 20:54:31

              Je connais très bien cette technique, pas besoin de me la détailler. :)
              Mais moi je voulais savoir si il y a un moyen grâce à la dichotomie d'obtenir toutes les solutions si il y en a plusieurs.

              Cordialement, Corentin. :p
              • Partager sur Facebook
              • Partager sur Twitter
                25 octobre 2012 à 20:59:46

                De quel type de fonction parles-tu ? S'il s'agit de polynômes, le comportement est plus prévisible qu'une fonction trigo par exemple.
                • Partager sur Facebook
                • Partager sur Twitter
                Tutoriel : Apprendre à programmer avec Ada : Version 1 achevée et publiée
                  25 octobre 2012 à 21:01:00

                  Le problème, c'est que je ne connais pas à l'avance le type de fonction vu que la fonction est une entrée de l'algorythme...

                  EDIT: Voilà mon algorithme actuel (Il ne trouve que une solution et moi je veux toutes les trouver) :
                  Image utilisateur
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 octobre 2012 à 12:05:45

                    Eh bien, comme je le disais tu ne peux pas, à l'aide d'un simple algorithme de dichotomie, trouver toutes les solutions nulles d'une fonction quelconque, parce que parfois il y en a une infinité*.
                    Je ne suis même pas sûr qu'un tel algorithme existe, en fait.

                    * Bon, elles sont un peu plus complexes que celles que tu peux rentrer dans une calculette, mais si je prends par exemple sur [0;1] le polynôme <math>\(\prod_{k=0}^n(x-\frac1{2^k})\)</math> (le produit des <math>\((x-\frac1{2^k})\)</math>, k allant de zéro à n), il possède n racines. Or n peut être aussi grand qu'on veut, donc ton algorithme devrait tourner indéfiniment pour être sûr d'avoir trouvé toutes les racines. Et ça, on appelle ça une boucle infinie. ;)

                    Edit : oh, et plus simple, la fonction nulle. Avec un algorithme de dichotomie, tu devras te lever tôt pour trouver toutes les racines de la fonction. :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 octobre 2012 à 12:11:48

                      jai envoyer un mail a mon prof de math et il ma confirmer que je devais utiliser la dichotomie et qurme enfaite lalgo devais seulement retourner une solution, cest a lutilisateur de rentrer lintervalle grace a ce quil voit sur la courbe pour trouver plusieurs solutions. bref sujet resolu vu que cest ce que fait mon algo actuel. :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 octobre 2012 à 12:20:21

                        Citation : melepe

                        Bon, elles sont un peu plus complexes que celles que tu peux rentrer dans une calculette,


                        Même non nul <math>\(\sin\frac{1}{x}\)</math> suffit ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 octobre 2012 à 12:21:45

                          C'était à celle-là que je pensais, mais le problème est qu'il faut la prolonger par continuité en zéro puisque l'on prend un intervalle fermé pour l'étude (donc en fait je pensais plutôt à <math>\(x\sin(\frac1x)\)</math>), et ça une TI-82/83 ne sait pas faire. :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 octobre 2012 à 19:18:29

                            Je reviens à vous pour quelques petites questions. :p

                            Déjà, je voulais savoir si il était possible de déterminer le nombre de solution pour l'équation f(x) = 0
                            (Sachant que f peut être n'importe quoi)

                            Ensuite, si cela est impossible, je voulais savoir si c'était possible de savoir si l'équation comporte au moins une solution.

                            Merci d'avane pour votre aide :)
                            Cordialement, Corentin.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 octobre 2012 à 21:48:41

                              Ce qu'on te dit depuis le début : il est impossible de trouver toutes les solutions de "f(x)=0" en n'ayant pas déjà énormément d'informations sur f.

                              Si on avait un algo (ce que tu demandes) pour connaître le nombre de solutions, on pourrait alors résoudre ton problème initial : on lance d'abord l'algo pour savoir combien il y a de solutions (mettons n), ensuite on trouve ces n racines par dichotomie (il n'y plus de boucle infini vu qu'on sait qu'une fois qu'on a n racines, on a fini).
                              Conclusion : il n'y a pas non plus d'algo pour compter les solutions dans le cas où f est quelconque.

                              D'autre part, on sent bien directement que ça va être compliqué ton histoire car certaines fonctions s'annulent une "infinité de fois" sur un intervalle donné. Deux exemples déjà donné ici : la fonction nulle (je l'appelle f), et la fonction g:x-> xsin(1/x). Petit hic : le "nombre de solutions" de f(x)=0 est infini, mais un infini "beaucoup plus grand" que le "nombre de solutions" de g(x)=0. (pour être rigoureux, il faudrait parler du "cardinal de l'ensemble des solutions" au lieu du "nombre des solutions").
                              Donc on voit mal comment un algo peux distinguer toutes ces situations...

                              EDIT : un fonction en toute généralité, c'est ultra moche, il faut imposer des conditions drastiques pour qu'on puisse faire des choses intéressantes dessus. Pour info, il existe :
                              • des fonctions continues nul part
                              • des fonctions continues nul part, sauf en un seul point
                              • des fonctions continues partout mais dérivables nul part
                              • ...

                              Il est donc illusoire de chercher à avoir un algo qui travaille sans hypothèses sur la fonction. La façon de procéder est plutôt : j'ai un problème concret, que je modélise avec telle fonction qui a telle propriété. J'arrive à montrer par un raisonnement que (je dis n'importe quoi) le nombre de racines de ma fonction est la partie entière de la dérivée de la fonction en pi. Malheureusement, il m'est impossible de calculer cette dérivée explicitement. Je vais donc chercher à programmer un algo qui me permette d'évaluer la dérivée de la fonction en pi et pour cela je peux m'appuyer sur telle et telle propriété de ma fonction.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 octobre 2012 à 0:35:01

                                Merci pour toutes tes explications. Mais maintenant que j'ai mon algorithme de dichotomie, le programme tourne en boucle sans fin quand il y a 0 solution, ce qui est un peux génant.
                                Deplus, mon algorithme ne parvient pas à trouver la solution 0 si je pose <math>\(f(x) = x\)</math> et je ne parviens pas à en trouver la raison.
                                Voici mon algorithme :
                                ClrHome
                                Input "F(X)=",Str1
                                Input "A=",A
                                Input "B=",B
                                If A>B
                                Then
                                Disp "ERREUR A>B"
                                Goto 4
                                End
                                Str1->Y2
                                Menu("SOLUTION ?","EXACTE",1,"APPROCHEE",2)
                                Lbl 1
                                0->P
                                Output(4,1,"MARGE ERR=0")
                                Goto 3
                                Lbl 2
                                Input "MARGE ERR=",P
                                Lbl 3
                                0->M
                                While B-A>P
                                (A+B)/2->M
                                If Y2(M)*Y2(B)>0
                                Then
                                M->B
                                Else
                                M->A
                                End
                                End
                                Output(5,1,"X=")
                                Output(5,3,M)
                                Pause 
                                ClrHome
                                Disp "X=",M>Frac
                                Lbl 4
                                


                                Merci d'avance pour votre aide :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 octobre 2012 à 9:13:42

                                  Tout simplement parceque tu as fait:
                                  While B-A>P
                                  (A+B)/2->M
                                  If Y2(M)*Y2(B)>0
                                  Then
                                  M->B
                                  Else
                                  M->A
                                  End
                                  End
                                  

                                  Ce qui veut dire que tu divises ton intervalle en 2 avant de tester tes extrémités, donc les signes des extrémités ne sont testées que pour le deuxième pas et je ne vois pas où est testé la condition où l'une de tes extrémités est un zéro. Autrement dit il faut que tu rajoutes un test avant ta boucle, et que tu testes l'hypothèse je suis tombé sur un zéro:
                                  If Y2(A)==0
                                    Then
                                    A->M
                                    If Y2(B)==0
                                      Then
                                      B->M
                                    Else
                                      While B-A>P
                                        (A+B)/2->M
                                        If Y2(M)*Y2(B)>0
                                          Then
                                          M->B
                                        Else
                                          If Y2(M)==0
                                            Then
                                            A->M
                                            B->M
                                          Else
                                            M->A
                                          End
                                        End
                                      End
                                    End
                                  End
                                  

                                  (je hais ces End sans indentations alors j'ai quand même indenté)


                                  EDIT: Au passage pour les zeros multiples, ce que tu peux faire en pratique c'est diviser ton intervalle en petites portions <math>\([x_i,x_{i+1}]\)</math>, par exemple <math>\(N\)</math> portions égales donc les portions sont: <math>\([A+i\frac{B-A}{N},A+(i+1)\frac{B-A}{N}]\)</math> et testez les produits <math>\(F(x_i)F(x_{i+1})\)</math>, s'il est négatif ou nul, tu effectues l'algorithme ci dessus, sinon tu laisses tomber.

                                  Encore une fois, c'est un algorithme approché, qui trouveras au mieux N zéros et qui peut en louper si jamais il y en a deux dans une même portion, mais il te permet sur des fonctions pas trop moches de trouver leur zéros.
                                  Après le mieux est d'avoir une idée de la position des zéros et de leur nombre (du style, polynôme de degré n au maximum n zéros).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 octobre 2012 à 11:17:03

                                    Merci pour ta réponse mais il y a un problème. J'ai modifié mon algorithme comme tu l'a écrit mais maintenant il me trouve la solution 0 instantanément n'importe ce que je met pour f(x)= ...
                                    Voici l'algorithme :
                                    ClrHome
                                    
                                    Input "F(X)=",Str1
                                    Input "A=",A
                                    Input "B=",B
                                    
                                    If A>B
                                    Then
                                        Disp "ERREUR A>B"
                                        Goto 4
                                    End
                                    
                                    Str1->Y2
                                    Menu("SOLUTION ?","EXACTE",1,"APPROCHEE",2)
                                    Lbl 1
                                        0->P
                                        Output(4,1,"MARGE ERR=0")
                                    Goto 3
                                    Lbl 2
                                        Input "MARGE ERR=",P
                                    Lbl 3
                                    
                                    0->M
                                    If Y2(A)=0
                                    Then
                                        A->M
                                        If Y2(B)=0
                                        Then
                                            B->M
                                        Else
                                            While B-A>P
                                                (A+B)/2->M
                                                If Y2(M)*Y2(B)>0
                                                Then
                                                    M->B
                                                Else
                                                    If Y2(M)=0
                                                    Then
                                                        M->A
                                                        M->B
                                                    Else
                                                        M->A
                                                    End
                                                End
                                            End
                                        End
                                    End
                                    
                                    Output(5,1,"X=")
                                    Output(5,3,M)
                                    
                                    Pause 
                                    ClrHome
                                    Disp "X=",M>Frac
                                    Lbl 4
                                    


                                    PS: Il me semble que tu as fait une erreur dans les lignes suivantes :
                                    A->M
                                    B->M
                                    

                                    J'ai donc inverser dans mon code mais ceci n'a rien changé.

                                    Merci d'avance pour ton aide. :p

                                    EDIT: Il semblerais que sa fonctionne mieu avec cette algorithme :
                                    ClrHome
                                    
                                    Input "F(X)=",Str1
                                    Input "A=",A
                                    Input "B=",B
                                    
                                    If A>B
                                    Then
                                        Disp "ERREUR A>B"
                                        Goto 4
                                    End
                                    
                                    Str1->Y2
                                    Menu("SOLUTION ?","EXACTE",1,"APPROCHEE",2)
                                    Lbl 1
                                        0->P
                                        Output(4,1,"MARGE ERR=0")
                                    Goto 3
                                    Lbl 2
                                        Input "MARGE ERR=",P
                                    Lbl 3
                                    
                                    0->M
                                    
                                    If Y2(A)=0
                                    Then
                                        A->M
                                        Goto 5
                                    End
                                    
                                    If Y2(B)=0
                                    Then
                                        B->M
                                        Goto 5
                                    End
                                    
                                    While B-A>P
                                        (A+B)/2->M
                                        If Y2(M)*Y2(B)>0
                                        Then
                                             M->B
                                        Else
                                            If Y2(M)=0
                                            Then
                                                M->A
                                                M->B
                                            Else
                                                M->A
                                            End
                                        End
                                    End
                                    
                                    Lbl 5
                                    Output(5,1,"X=")
                                    Output(5,3,M)
                                    
                                    Pause 
                                    ClrHome
                                    Disp "X=",M>Frac
                                    Lbl 4
                                    


                                    Mais si par exemple je tappe en entrée :
                                    - f(x)=5x²-13x+3
                                    - A=-100
                                    - B=100
                                    Il me trouve x=-100
                                    Alors que la vrai solution est -0.2559693491
                                    Je ne comprend pas là ...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      30 octobre 2012 à 12:52:04

                                      Ok pour ton deuxième algo, c'est effectivement dans ce gout là, et la TI n'étant pas super stable, je crois qu'elle n'aime pas trop les avalanches de IF, fait donc la même chose pour la deuxième modif, et ca devrait marcher:
                                      ClrHome
                                      
                                      Input "F(X)=",Str1
                                      Input "A=",A
                                      Input "B=",B
                                      
                                      If A>B
                                      Then
                                          Disp "ERREUR A>B"
                                          Goto 4
                                      End
                                      
                                      Str1->Y2
                                      Menu("SOLUTION ?","EXACTE",1,"APPROCHEE",2)
                                      Lbl 1
                                          0->P
                                          Output(4,1,"MARGE ERR=0")
                                      Goto 3
                                      Lbl 2
                                          Input "MARGE ERR=",P
                                      Lbl 3
                                      
                                      0->M
                                      
                                      If Y2(A)=0
                                      Then
                                          A->M
                                          Goto 5
                                      End
                                      
                                      If Y2(B)=0
                                      Then
                                          B->M
                                          Goto 5
                                      End
                                      
                                      While B-A>P
                                          (A+B)/2->M
                                          If Y2(M)=0
                                          Then
                                              Goto 5
                                          End
                                          If Y2(M)*Y2(B)>0
                                          Then
                                               M->B
                                          Else
                                               M->A
                                          End
                                      End
                                      
                                      Lbl 5
                                      Output(5,1,"X=")
                                      Output(5,3,M)
                                      
                                      Pause 
                                      ClrHome
                                      Disp "X=",M>Frac
                                      Lbl 4

                                      J'avais oublié ces Goto Lbl ^^
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        30 octobre 2012 à 13:08:33

                                        J'ai remplacé mais ceci n'a pas réglé le problème indiqué en bas de mon message dans l'EDIT. :s
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          30 octobre 2012 à 13:51:39

                                          Vraiment?! o_O
                                          Peux tu afficher le M au cours des itéartions alors? Par exemple ceci:

                                          While B-A>P
                                              (A+B)/2->M
                                              Output(5,1,"M=")
                                              Output(5,3,M)
                                              If Y2(M)=0
                                              Then
                                                  Goto 5
                                              End
                                              If Y2(M)*Y2(B)>0
                                              Then
                                                   M->B
                                              Else
                                                   M->A
                                              End
                                          End
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            30 octobre 2012 à 14:03:54

                                            0
                                            -50
                                            -75
                                            -87.5
                                            -93.75
                                            -96.875
                                            -98.4375
                                            -99.21875
                                            -99.609375
                                            -99.804688
                                            -99.902344
                                            -99.951172
                                            -99.975586
                                            -99.987793
                                            -99.993896
                                            -99.996948
                                            -99.998474
                                            -99.999237
                                            -99.999619
                                            -99.999809
                                            -99.999905
                                            -99.999952
                                            -99.999976
                                            -99.999988
                                            -99.999994
                                            -99.999997
                                            -99.999999
                                            -99.999999
                                            -100
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              30 octobre 2012 à 14:34:55

                                              Désolé, je n'avais pas réfléchi, je viens de regarder le graphe de la fonction, et il y a quand même une hypothèse vitale dans l'algorithme de dichotomie, c'est les extrémités de l'intervalles correspondent à des valeurs de signes différentes de la fonction, or ici tu as 2 valeurs positives, donc ton algorithme n'a aucune chance de marcher.
                                              Prends B=1 et ca va marcher.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                30 octobre 2012 à 14:37:38

                                                Effectivement, sa fonctionne mais je n'ai pas très bien compris pourquoi, peux tu m'expliquer stp ? :s
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  30 octobre 2012 à 14:50:04

                                                  Bon l'algorithme de dichotomie est le suivant:
                                                  Tu as un point A où ta fonction est négative, un point B où ta fonction est positive, donc elle s'annule quelque part entre les deux (si elle est continue), donc ce que tu vas faire c'est tester le milieu, si le milieu est négatif ca veut dire que tu es trop bas donc que tu dois chercher plus près de la valeur positive, sinon c'est que tu es trop haut et tu dois chercher plus près de ta valeur négative.

                                                  Cependant, si tu lui donnes 2 valeurs positives, il ne peut pas savoir d'une part qu'il y a un zéro entre les deux et d'autre part lequel des deux nouveaux intervalles choisir, puisque les deux extrémités ont des vqleurs positives! :(
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    30 octobre 2012 à 14:52:14

                                                    Mais -100 est négatif et 100 est positif pourtemps.. Je ne comprend pas là x)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      30 octobre 2012 à 14:57:00

                                                      Oui mais ce que tu veux à chaque fois c'est que <math>\(F(A)\)</math> et <math>\(F(B)\)</math> soient de signe différent, l'idée c'est que si <math>\(F\)</math> a changé de signe, alors elle a du passer par zéro à un moment.
                                                      Et ici <math>\(F(-100)\)</math> et <math>\(F(100)\)</math> sont positifs, mais <math>\(F(1)<0\)</math>
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        30 octobre 2012 à 15:14:11

                                                        Ah d'accord j'ai enfin compris. :)

                                                        J'ai rajouté 2 petites conditions avant la dichotomie :
                                                        If Y2(A)>0 and Y2(B)>0
                                                        Then
                                                        Disp "ERR A B POSITIFS"
                                                        Goto 4
                                                        End
                                                        If Y2(A)<0 and Y2(B)<0
                                                        Then
                                                        Disp "ERR A B NEGATIFS"
                                                        Goto 4
                                                        End
                                                        

                                                        Et maintenant je n'ai plus de problème, merci beaucoup. :)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Trouvez les solutions de f(x) = 0 dans l'intervale [a;b]

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown