Page 1 of 1

Problème boucle for()

Unread postPosted: 24 Jan 2011, 19:06
by Claros
Salut,

Je viens de remarquer un problème dans un de mes programmes. Ce programme me sert enfaite à tester la présence d'une racine évidente dans un polynôme afin de factoriser ce polynôme.
Voici un peu comment il est fait:
Code: Select all
Input "f(x)=",Str0
Str0-Y0
For(X,-5,5,1/12)
If Y0(X)=0
Then
Disp "RACINE",X
Stop
End
End


Mais je remarque que lorsque la valeur de départ de X est inférieur à -1, la programme ne trouve plus la racine évidente. Du genre pour un polynôme comme
2X^3 - 2X² - 1
la racine évidente est 1 mais pour Y0(1) le programme trouve 0.6E-6 au lieu de 0.
Ce test fonctionne parfaitement pour une valeur initiale de X supérieur à -1

Si quelqu'un sait d'où vient le problème ?

Re: Problème boucle for()

Unread postPosted: 24 Jan 2011, 19:24
by critor
La calculatrice TI-83+ ne travaille qu'avec des nombres décimaux (à 13 chiffres significatifs certes).

1/12 n'est pas un nombre décimal, et la calculatrice se le représente avec une petite erreur (inférieure à 10^-13, certes).


Mais au cours de ta boucle, ce nombre faux est ajouté plein de fois, et l'erreur est de plus en plus grosse.

Par exemple, la boucle ne tombe jamais sur X=0, mais sur X=-1.634*10^-12 à cause de ça.



Remplace l'incrément de ta boucle par un nombre décimal comme 1/10, et tu n'auras plus ce problème.

Re: Problème boucle for()

Unread postPosted: 24 Jan 2011, 19:31
by Claros
Bah enfaite ce que je voulais faire c'est que je puisse trouver des racines évidentes comme 1/4 ou 1/3 le genre de chose qui reste quand même assez évident à factoriser. Comme visiblement ça pose des problèmes, je vais mettre 1/4.

Merci à toi critor !

Re: Problème boucle for()

Unread postPosted: 24 Jan 2011, 19:53
by critor
Pour trouver des racines non décimales (comme 1/3), il va te falloir changer le fonctionnement du programme.

N'hésite pas à chercher ;)

Re: Problème boucle for()

Unread postPosted: 24 Jan 2011, 20:55
by Claros
Bah découper la boucle en plusieurs petits intervalles pour supprimer la marge d'erreur semble une solution assez simple et c'est celle pour laquelle je vais opter.

Re: Problème boucle for()

Unread postPosted: 25 Jan 2011, 22:09
by Bisam
Tu dois sans doute pouvoir arranger le problème de cette façon :
Code: Select all
Input "f(x)=",Str0
Str0-Y0
For(X,-60,60
If Y0(X/12)=0
Then
Disp "RACINE",X/12
Stop
End
End

en effet, au lieu de travailler avec des décimaux, tu restes avec des entiers dans la boucle for, et c'est seulement au moment du calcul de la fonction que l'on divise par 12.

Je n'ai pas ta calculatrice pour tester... alors je te laisse faire et nous dire le résultat.

Re: Problème boucle for()

Unread postPosted: 25 Jan 2011, 22:23
by Claros
Excellente méthode, encore plus simple que ce que j'avais fait. Merci à toi Bisam ;)