Rechercher
Connexion
Chatbox externe
Derniers sujets
Partenaires
TI-Planet | Espace-TI : Forum |
Faire un don à Tout-82...
Où va cet argent ?
Membres donateurs:- Persalteas (10€)
- Wistaro (5€)
- jo2geek (22€)
Les posteurs les plus actifs du mois
Aucun utilisateur |
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
+2
Linkakro
Wistaro
6 participants
Page 1 sur 2
Page 1 sur 2 • 1, 2
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Et bonjour à tous!
Aujourd'hui je vous présente mon nouveau projet, il s'agit d'un solveur d'équations de type linéaire (1er degré) et entièrement en TIbasic z80.
~ Avant propos ~
Je tiens à préciser que j'ignore totalement si le projet a déjà été réalisé. Mon programme ne se base sur aucun autre programme ou projet. De plus, même si mon programme n'est pas terrible (à vous d'en juger), merci de respecter le travail effectué et de ne pas partager ou vous approprier le programme sans mon autorisation. Merci.
~ Présentation globale ~
La première chose que vous devez vous dire, c'est pourquoi développer un resolveur d'équations car la calculatrice en a déjà un, la fonction solve()? Et bien, pour plusieurs raisons :
- Elle ne résout que si l'équation est nulle, autrement dit, par exemple : 3X+2=0. Elle ne résout pas: 3X=-2. C'est bête, mais peux pratique dans certaines longues équations. Il faut tout transposer, c'est long et pas vraiment bénéfique au final.
- Le résultat ne s'affiche pas sous sa forme exacte, alors que mon programme affiche le nombre fractionnaire le plus proche de la solution!
Voilà en gros pourquoi ignorer, pour le moment, le solveur d'équation intégré à votre calculatrice.
Mais ce programme est également là pour
~ Fonctionnalités du programme ~
Le programme sera compatible pour toutes les calculatrices z80, incluant la TI82/STAT/FR. (pas sûr à 100%, mais très probable). Il est codé en TIbasic z80, sans bibliothèque externe.
Il sera capable de résoudre une équation comme celle-ci:
3X+3*2+(1/2)X - 13*24X = 10X - 3 +0,2683X
Ceci est à titre d'exemple.
En revanche, il sera incapable de résoudre une équation contenant :
- Des X sous une racine
- Des X élevés à une puissance > 1 (appartenant aux entiers naturels)
- Des X dans une fraction : 2/3X sera calculé comme (2/3)X. Le programme est amené à évoluer pour ignorer ce genre de problèmes.
~ Fonctionnement & Explications ~
Le fonctionnement est simple:
Partons de l'équation: 10X = 5X+2
- Je sépare les 2 parties de l'équation pour les traiter séparément.
Nous avons donc: 10X et 5X+2
- Ensuite, je recherche dans la chaîne 10X, puis dans 5X+2 si il y a un X.
C'est le cas dans 10X.
- Ensuite, je cherche dans la chaîne, en partant cette fois ci du X vers la droite de la chaîne, vers sa base un "+" ou un "-", ou l'origine du la chaîne. Je trouve un nombre qui se situe "entre les deux".
Dans notre exemple, on trouve 10 et 5 .
Je stock ces résultats.
- Ensuite, dans chaque partie, je stocke 0 à X et j'utilise la fonction expr() pour donner le résultat de la partie. En fait, cela me donne le nombre de chiffre "autre que des X".
- Enfin, une simple transposition des X/chiffre d'un côté à l'autre et je finis par trouver un résultats sous forme d'une fraction exacte (non simplifiée pou l'instant)
- Pour afficher le "trait de fraction", je recherche le plus grand nombre de la fraction (si il y en a un de négatif, je le passe positif) , et je met autant de trait de fraction que ce nombre comporte d'unités. C'est du pure détail anecdotique.
~ Screenshoot (v1.2)~
~ Code source ~
~ Annexe ~
L'équation doit respecter le règles suivantes:
- Si il y a un X tout seul, il doit s'écrire "1X" et pas "X"
- Il faut mettre "+ - X" et pas "-x" sauf en début de terme.
Je tiens à préciser que ce programme est à l'état de projet, et il n'est pas nécessairement voué à être abouti, si il est parfaitement inutile. De plus, je pense pouvoir réussir à traiter les "pie" et "racines" comme eux-même, c'est à dire qu'ils pourront apparaître comme tel, simplifié dans le résultat, ce qui serait déja un gros avantage. De plus, comme vous pouvez le voir, la fraction donnée n'est pas simplifié, et le programme devra par la suite effectuer cette simplification (j'y travaille actuellement)
Aujourd'hui je vous présente mon nouveau projet, il s'agit d'un solveur d'équations de type linéaire (1er degré) et entièrement en TIbasic z80.
~ Avant propos ~
Je tiens à préciser que j'ignore totalement si le projet a déjà été réalisé. Mon programme ne se base sur aucun autre programme ou projet. De plus, même si mon programme n'est pas terrible (à vous d'en juger), merci de respecter le travail effectué et de ne pas partager ou vous approprier le programme sans mon autorisation. Merci.
~ Présentation globale ~
La première chose que vous devez vous dire, c'est pourquoi développer un resolveur d'équations car la calculatrice en a déjà un, la fonction solve()? Et bien, pour plusieurs raisons :
- Elle ne résout que si l'équation est nulle, autrement dit, par exemple : 3X+2=0. Elle ne résout pas: 3X=-2. C'est bête, mais peux pratique dans certaines longues équations. Il faut tout transposer, c'est long et pas vraiment bénéfique au final.
- Le résultat ne s'affiche pas sous sa forme exacte, alors que mon programme affiche le nombre fractionnaire le plus proche de la solution!
Voilà en gros pourquoi ignorer, pour le moment, le solveur d'équation intégré à votre calculatrice.
Mais ce programme est également là pour
~ Fonctionnalités du programme ~
Le programme sera compatible pour toutes les calculatrices z80, incluant la TI82/STAT/FR. (pas sûr à 100%, mais très probable). Il est codé en TIbasic z80, sans bibliothèque externe.
Il sera capable de résoudre une équation comme celle-ci:
3X+3*2+(1/2)X - 13*24X = 10X - 3 +0,2683X
Ceci est à titre d'exemple.
En revanche, il sera incapable de résoudre une équation contenant :
- Des X sous une racine
- Des X élevés à une puissance > 1 (appartenant aux entiers naturels)
- Des X dans une fraction : 2/3X sera calculé comme (2/3)X. Le programme est amené à évoluer pour ignorer ce genre de problèmes.
~ Fonctionnement & Explications ~
Le fonctionnement est simple:
Partons de l'équation: 10X = 5X+2
- Je sépare les 2 parties de l'équation pour les traiter séparément.
Nous avons donc: 10X et 5X+2
- Ensuite, je recherche dans la chaîne 10X, puis dans 5X+2 si il y a un X.
C'est le cas dans 10X.
- Ensuite, je cherche dans la chaîne, en partant cette fois ci du X vers la droite de la chaîne, vers sa base un "+" ou un "-", ou l'origine du la chaîne. Je trouve un nombre qui se situe "entre les deux".
Dans notre exemple, on trouve 10 et 5 .
Je stock ces résultats.
- Ensuite, dans chaque partie, je stocke 0 à X et j'utilise la fonction expr() pour donner le résultat de la partie. En fait, cela me donne le nombre de chiffre "autre que des X".
- Enfin, une simple transposition des X/chiffre d'un côté à l'autre et je finis par trouver un résultats sous forme d'une fraction exacte (non simplifiée pou l'instant)
- Pour afficher le "trait de fraction", je recherche le plus grand nombre de la fraction (si il y en a un de négatif, je le passe positif) , et je met autant de trait de fraction que ce nombre comporte d'unités. C'est du pure détail anecdotique.
~ Screenshoot (v1.2)~
~ Code source ~
- v1.2 (dernière):
:DelVar XDelVar L26→dim(L2
:1→C
:ClrHome
:Output(4,1,"EQUATION SOLVER
:Output(5,1,"v1.2 - Wistaro
:For(A,1,16
: Output(6,A,"+
: Output(3,A,"+
:End
:Lbl 1
:DelVar L1
:Input "?>",Str1
:ClrHome
:Disp "PLEASE WAIT...
:Str1→Str9
:length(Str9→L
:inString(Str9,"="→P
:If not(P:Goto 1
:Lbl 9
:Str9→Str1
:If C=1:Then
: sub(Str9,1,P-1→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If C=2:Then
: inString(Str9,"=")→P
: sub(Str9,P+1,length(Str9)-P→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If not(inString(Str1,"X"):Then
: {0}→L1
: Goto 6
:End
:1→T
:Lbl 5
:length(Str1→V
:If inString(Str1,"X":Then
: inString(Str1,"X"→A
: Repeat Str3="+" or Str3="-" or A=1
: If A>1:A-1→A
: sub(Str1,A,1)→Str3
: End
: If A=1:sub(Str1,1,inString(Str1,"X")-A→Str4
: If A>1:sub(Str1,A+1,inString(Str1,"X")-(A+1)→Str4
:End
:T→dim(L1
:sub(Str4,1,1
:If Ans="+" or Ans="-" or Ans="*" or Ans="/":sub(Str4,2,length(Str4)-A)→Str4
:expr(Str4→L1(T
:inString(Str1,"X"→P
:If V-P:Then
: inString(sub(Str1,P+1,V-P),"X")→Q:Else:Goto 6:End
:If V>P and Q
:Then
: sub(Str1,P+1,V-P)→Str1
: T+1→T
: Goto 5
:End
:Lbl 6:ClrHome
:ClrDraw
:DelVar Esum(L1→L2(C
:If C=1:Then
: 2→C:Goto 9
:End
:L2(1)-L2(2→A
:L2(4)-L2(3→B
:If A<0:Then
: ‾A→A:‾B→B:End
:ClrHome
:DelVar Y1
:Text(0,0,Str9
:Text(7,0,"<=> ",L2(1),"X+",L2(3),"=",L2(2),"X+",L2(4
:Text(14,0,"<=> ",A,"X+",L2(3),"=",L2(4)
:Text(21,0,"<=> ",A,"X=",B
:If not(A:Goto 8
:Text(30,0,"<=> X="
:If not(fPart(B/A:Then
: Text(47,0,B/A
:Else
: If not(fPart(A) and not(fPart(B):Then
: If A<0:Then:‾A→F:Else:A→F:End
: If B<0:Then:‾B→G:Else:B→G:End
: A/gcd(F,G)→A
: B/gcd(F,G)→B
: End
: Text(40,0,B
: Text(54,0,A
: StorePic 1
: If A<0:Then:‾A→A:1→E:End
: If B<0:Then:‾B→B:1→E:End
: max({A,B→M
: {0,1→L1:{0,M→L2
: LinReg(ax+b)L1,L2,Y1
: Equ►String(Y1,Str1
: sub(Str1,1,length(Str1)-3→Str1
: DelVar Y1
: For(D,0,length(Str1)+E
: Text(47,3D,"-
: End
: RecallPic 1
:End
:Pause :ClrDraw
:Disp "
:Stop
:Lbl 8
:Text(30,0,"S= <ensemble vide>
:Pause
- v0.1a:
:DelVar XDelVar L24→dim(L2
:1→C
:ClrHome
:Output(4,1,"EQUATION SOLVER
:Output(5,1,"v0.1a - Wistaro
:For(A,1,16
: Output(6,A,"+
: Output(3,A,"+
:End
:Lbl 1
:DelVar L1
:Input "?>",Str1
:ClrHome
:Disp "PLEASE WAIT...
:Str1→Str9
:length(Str9→L
:inString(Str9,"="→P
:If not(P:Goto 1
:Lbl 9
:Str9→Str1
:If C=1:Then
: sub(Str9,1,P-1→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If C=2:Then
: inString(Str9,"=")→P
: sub(Str9,P+1,length(Str9)-P→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If not(inString(Str1,"X"):Then
: {0}→L1
: Goto 6
:End
:1→T
:Lbl 5
:length(Str1→V
:If inString(Str1,"X":Then
: inString(Str1,"X"→A
: Repeat Str3="+" or Str3="-" or A=1
: If A>1:A-1→A
: sub(Str1,A,1)→Str3
: End
: If A=1:sub(Str1,1,inString(Str1,"X")-A→Str4
: If A>1:sub(Str1,A+1,inString(Str1,"X")-(A+1)→Str4
:End
:T→dim(L1
:sub(Str4,1,1
:If Ans="+" or Ans="-" or Ans="*" or Ans="/":sub(Str4,2,length(Str4)-A)→Str4
:expr(Str4→L1(T
:inString(Str1,"X"→P
:If V-P:Then
: inString(sub(Str1,P+1,V-P),"X")→Q:Else:Goto 6:End
:If V>P and Q
:Then
: sub(Str1,P+1,V-P)→Str1
: T+1→T
: Goto 5
:End
:Lbl 6:ClrHome
:sum(L1→L2(C
:If C=1:Then
: 2→C:Goto 9
:End
:L2(1)-L2(2→A
:L2(4)-L2(3→B
:If not(A:Then
: ‾A→A:‾B→B:End
:ClrHome
:Output(1,1,"Resultat:
:Output(2,1,"X=
:Output(4,1,B
:Output(6,1,A
:If A<0:‾A→A
:If B<0:‾B→B
:max({A,B→M
:{0,1→L1:{0,M→L2
:LinReg(ax+b)L1,L2,Y1
:Equ►String(Y1,Str1
:sub(Str1,1,length(Str1)-3→Str1
:For(D,1,length(Str1
: Output(5,D,"-
:End
:Pause
~ Annexe ~
L'équation doit respecter le règles suivantes:
- Si il y a un X tout seul, il doit s'écrire "1X" et pas "X"
- Il faut mettre "+ - X" et pas "-x" sauf en début de terme.
Je tiens à préciser que ce programme est à l'état de projet, et il n'est pas nécessairement voué à être abouti, si il est parfaitement inutile. De plus, je pense pouvoir réussir à traiter les "pie" et "racines" comme eux-même, c'est à dire qu'ils pourront apparaître comme tel, simplifié dans le résultat, ce qui serait déja un gros avantage. De plus, comme vous pouvez le voir, la fraction donnée n'est pas simplifié, et le programme devra par la suite effectuer cette simplification (j'y travaille actuellement)
Dernière édition par Wistaro le Mer 16 Juil 2014 - 9:41, édité 8 fois
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Dès la ti82stats il y a ceci qui marche très bien et simplement. (avec le nombre i imaginaire en place de l'inconnue). Programme MiniSolv
Mais puisque tu veux travailler autrement, alors ton programme aura l'avantage de la compatibilité contrairement à MiniSolv.
A quel point ton programme sera-t-il plus réussi que les solutions approchées par le solveur de dichotomie de la calculatrice ?
Si tu obtiens une valeur approchée alors tu n'auras gagné que la précision des calculs par rapport à la dichotomie.
Si tu affiches la solution littérale sans effectuer l'application numérique, alors ce sera plus précis sur tous les aspects.
Parmi les avantages que tu escomptes, celui de la saisie de l'équation à zéro est, dès la ti82stats, facile à contourner seulement avec deux saisies.
"Dans une fraction" : dénominateur sera plus précis.
EDIT : et de toute manière tu écris ton dénominateur sans parenthèse donc c'est ambigu.
saisie 2/3X
ti82 2/(3*X)
ti83 (2/3)*X
Mais puisque tu veux travailler autrement, alors ton programme aura l'avantage de la compatibilité contrairement à MiniSolv.
Tant pis, j'attend tant qu'il faudra, ce n'est pas comme si nous pouvions le faire pour toi.Wistaro a écrit:En écrivant ce topic, je me suis aperçu d'une erreur. Je la corrige donc et je post le programme demain dans la matinée. Merci de votre compréhension
~ Fonctionnement & Explications ~
~ Screenshoot ~
~ Code source ~
A quel point ton programme sera-t-il plus réussi que les solutions approchées par le solveur de dichotomie de la calculatrice ?
Si tu obtiens une valeur approchée alors tu n'auras gagné que la précision des calculs par rapport à la dichotomie.
Si tu affiches la solution littérale sans effectuer l'application numérique, alors ce sera plus précis sur tous les aspects.
Parmi les avantages que tu escomptes, celui de la saisie de l'équation à zéro est, dès la ti82stats, facile à contourner seulement avec deux saisies.
- Code:
Input " ",Str1
input "=",Str2
solve(expr(Str1)-expr(Str2),X,1
Dis que X ne supporte que le produit par un réel et ce sera suffisant.Wistaro a écrit:En revanche, il sera incapable de résoudre une équation contenant :
- Des X sous une racine
- Des X élevés à une puissance > 1 (appartenant aux entiers naturels)
- Des X dans une fraction : 2/3X sera calculé comme (2/3)X. Le programme est amené à évoluer pour ignorer ce genre de problèmes.
"Dans une fraction" : dénominateur sera plus précis.
EDIT : et de toute manière tu écris ton dénominateur sans parenthèse donc c'est ambigu.
saisie 2/3X
ti82 2/(3*X)
ti83 (2/3)*X
Dernière édition par Linkakro le Lun 7 Juil 2014 - 0:05, édité 1 fois
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Je ne sais pas trop comment tu gères ça... Mais je vois d'une façon toute bête:
Si on a une équation du premier degré, il n'y a qu'une solution. Donc on peut utiliser le solveur, qui donne un résultat précis autant que faire se peut sur la calto.
Je propose une seule saisie : "A=B", avec A et B exprimé en fonction de X, inconnue du premier degré.
Il faut donc isoler A et B, puis utiliser la même méthode que proposée par Linka.
Si on a une équation du premier degré, il n'y a qu'une solution. Donc on peut utiliser le solveur, qui donne un résultat précis autant que faire se peut sur la calto.
Je propose une seule saisie : "A=B", avec A et B exprimé en fonction de X, inconnue du premier degré.
Il faut donc isoler A et B, puis utiliser la même méthode que proposée par Linka.
- Code:
Input " ",Str1
inString(Str1,"= //Recherche de la position du "="
solve(expr(sub(Str1,1,Ans-1))-expr(sub(Str1,Ans+1,lenght(Str1)-Ans)),X,1>Frac //recherche de la solution (en utilisant "A-B=0"), puis affichage en fractionné
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Sinon le cerveau aussi ça marche
Avantages :
-Pas besoin de se hum hum hum pour un programme qui pourrait foirer un contrôle
-Des kilo-octets de libre dans notre chère 82stats (hé oui )
-Et enfin beaucoup plus rapide avec un peu de logique (même si le ne connais pas le temps que ça prend pour calculer XD ça ne peut pas être aussi lent que tracer 1 frame de flight simulator mais quand même hihi)
Ceux qui en ont besoin peuvent rajouter un gros ventirad et un ventilo de CPU sur le crâne pour éviter la surchauffe
Avantages :
-Pas besoin de se hum hum hum pour un programme qui pourrait foirer un contrôle
-Des kilo-octets de libre dans notre chère 82stats (hé oui )
-Et enfin beaucoup plus rapide avec un peu de logique (même si le ne connais pas le temps que ça prend pour calculer XD ça ne peut pas être aussi lent que tracer 1 frame de flight simulator mais quand même hihi)
Ceux qui en ont besoin peuvent rajouter un gros ventirad et un ventilo de CPU sur le crâne pour éviter la surchauffe
rpgcreator- Connaisseur
- Messages : 252
Points Concours : 27
Productivité : 6
Date d'inscription : 16/09/2013
Localisation : Vernouillet 28
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Topic mit à jour, avec le code, et les explications détaillées. N'oubliez pas de regarder la partie "annexe"
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
De chiffres tu veux dire?- Pour afficher le "trait de fraction", je recherche le plus grand nombre de la fraction (si il y en a un de négatif, je le passe positif) , et je met autant de trait de fraction que ce nombre comporte d'unités.
Il serait judicieux de prendre en compte qu'un nombre négatif contient un caractère en plus
Si tu es sur que le nombre testé en non nul, et positif, tu peux utiliser la fonction log pour trouver son nombre de chiffres:
"1+int(log(X" renvoi le nombre de chiffres de X, si X est un entier naturel non nul.
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Merci, je n'ai pas encore abordé les logarithmique en cours C'est mieux que de passer par conversions nombre → chaîne → lenght().Et oui jre parle bien de chiffres.
Pour l'instant, mon algo ne présente pas grand intérêt par rapport à la fonction solve().
Si j'arrive à effectuer les manipulations ci-dessous, là, sa deviendra très utile!
- Simplification de la fraction finale
- Affichage de pie/racine dans le résultat final + simplification
- Reconnaissance du 2nd degré et solveur d'équation, dans ce cas, avec discriminant.
- Choix de l'affichage du résultat: exacte ou approché
Pour l'instant, mon algo ne présente pas grand intérêt par rapport à la fonction solve().
Si j'arrive à effectuer les manipulations ci-dessous, là, sa deviendra très utile!
- Simplification de la fraction finale
- Affichage de pie/racine dans le résultat final + simplification
- Reconnaissance du 2nd degré et solveur d'équation, dans ce cas, avec discriminant.
- Choix de l'affichage du résultat: exacte ou approché
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
J'ai survolé (et encore ) les logarithmes en cours, et on ne m'a jamais parlé de cette application forte utile x). En fait je l'ai découverte comme toi sur le fofo
C'est sur que si tu arrives à traiter les pi/e/racines ça peut devenir intéressant
Et encore plus si tu arrives à distinguer et résoudre le second degrés.
Continue comme ça alors
C'est sur que si tu arrives à traiter les pi/e/racines ça peut devenir intéressant
Et encore plus si tu arrives à distinguer et résoudre le second degrés.
Continue comme ça alors
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Pour le second degré, c'est faisable, je pense:
- Je fait une reconnaissance des X.
- Si je trouve le terme "^", alors je c'est qu'il y a du 2d degré
- Ou si X est multiplié par un autre "X".
Dans ce cas, mon programme tourne normalement, il simplifie tout d'un coté (en isolant bien les X^). Puis une autre recherche de chaîne pour trouver a/b/c et c'est bon.
Mais c'est facile à dire comme sa :p
Pour traiter les pie/racine, j'ai une idée, mais il faut que je la teste avant.
- Je fait une reconnaissance des X.
- Si je trouve le terme "^", alors je c'est qu'il y a du 2d degré
- Ou si X est multiplié par un autre "X".
Dans ce cas, mon programme tourne normalement, il simplifie tout d'un coté (en isolant bien les X^). Puis une autre recherche de chaîne pour trouver a/b/c et c'est bon.
Mais c'est facile à dire comme sa :p
Pour traiter les pie/racine, j'ai une idée, mais il faut que je la teste avant.
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Second degré c'est plutôt les X² qu'il faut isoler
Oui c'est faisable, après reste à voir si c'est pas trop lourd à faire.
Oui c'est faisable, après reste à voir si c'est pas trop lourd à faire.
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Faut voir. Je ne pense pas que cela soit exsessif,
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Persalteas a détecté toutes sortes de syntaxes dans son programme de dérivation. ("EasyF'(X)" ou EASYFX, disponible sur TI-Planet et forums tout82/espace-ti). Tu peux t'inspirer de son moteur de lecture et réaliser ton propre moteur de traitement. Donc non les puissances ne sont pas forcément excessives.
Je ne te conseille pas de t'inspirer de mon équilibreur chimique stoechiométrique car son moteur est compliqué, de plusieurs versions, et n'est pas du tout prévu pour détecter des puissances en suffixes.
(Mais mon humble avis est que tout ceci est un gaspillage d'efforts.)
On ne dit pas "les logarithmiques" mais "les logarithmes".
Trois formules résument tout. Faut pas s'inquiéter.
Le logarithme décimal Y=log(X) est la réciproque de 10^Y=X. On trouve donc l'exposant, et on en déduit le nombre de chiffres.
On n'écrit pas "lenght" mais "length".
Je constate que tu fais tout avec une interprétation de chaînes de caractères. Donc ce n'est compatible qu'à partir de la ti82stats. Cela change mon approche.
Ton but des solutions littérales donnent un intérêt important pour la technique. Mais je ne suis pas adepte pour autant.
Je pense improviser un moteur réalisant ton objectif pour m'entraîner.
Je ne te conseille pas de t'inspirer de mon équilibreur chimique stoechiométrique car son moteur est compliqué, de plusieurs versions, et n'est pas du tout prévu pour détecter des puissances en suffixes.
(Mais mon humble avis est que tout ceci est un gaspillage d'efforts.)
On ne dit pas "les logarithmiques" mais "les logarithmes".
Trois formules résument tout. Faut pas s'inquiéter.
Le logarithme décimal Y=log(X) est la réciproque de 10^Y=X. On trouve donc l'exposant, et on en déduit le nombre de chiffres.
On n'écrit pas "lenght" mais "length".
Je constate que tu fais tout avec une interprétation de chaînes de caractères. Donc ce n'est compatible qu'à partir de la ti82stats. Cela change mon approche.
Ton but des solutions littérales donnent un intérêt important pour la technique. Mais je ne suis pas adepte pour autant.
Je pense improviser un moteur réalisant ton objectif pour m'entraîner.
Dernière édition par Linkakro le Mar 8 Juil 2014 - 20:12, édité 1 fois
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
D'accord Et désolé pour les fautes.
J'ai réfléchi et travaillé hier soir dessus, voici quelques nouveautés:
- Simplification au maximum de la fraction du résultat
- Si le résultat "tombe juste", on affiche ce résultat et non une fraction
- Détection si l'équation n'a pas de solutions (ou tous les réels la verifie)
- Amélioration de l'affichage.
- Rajout d'un autre trait de fraction supplémentaire quand le résultat est négatif
Vous voulez le code ?
J'ai réfléchi et travaillé hier soir dessus, voici quelques nouveautés:
- Simplification au maximum de la fraction du résultat
- Si le résultat "tombe juste", on affiche ce résultat et non une fraction
- Détection si l'équation n'a pas de solutions (ou tous les réels la verifie)
- Amélioration de l'affichage.
- Rajout d'un autre trait de fraction supplémentaire quand le résultat est négatif
Vous voulez le code ?
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Je propose de poster le code de ta nouvelle version dans le premier message et de placer chaque code dans une balise spoiler pour organiser.
Je viens d'imaginer utiliser le programme AutoCalc de Critor sur TI-Planet pour chercher une expression à partir d'un résultat de dichotomie par solve().
Je viens d'imaginer utiliser le programme AutoCalc de Critor sur TI-Planet pour chercher une expression à partir d'un résultat de dichotomie par solve().
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Je posterais plutôt le code demain , ou dans la soirée, le temps de faire des mises à jours.
http://espace-ti.forumactif.com/t139-83-programme-calculant-la-fonction-derivee
Apparemment Persalteas utilise le même principe de recherche dans la chaîne, il est donc possible de traiter, je pense du seconde degré. Il serait intéressant de voir comment il travaille avec les racines et les fractions.
http://espace-ti.forumactif.com/t139-83-programme-calculant-la-fonction-derivee
Apparemment Persalteas utilise le même principe de recherche dans la chaîne, il est donc possible de traiter, je pense du seconde degré. Il serait intéressant de voir comment il travaille avec les racines et les fractions.
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
N'oublie pas que EasyFx ne gère pas les fonctions composées.
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
EasyFX?Linkakro a écrit:N'oublie pas que EasyFx ne gère pas les fonctions composées.
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Le dérivateur de Persalteas publié sur tout82free et je crois ti-planet inclut tout un menu et se proclame Easyf'(x) dans la présentation.
http://tout82.free.fr/forum/sujet.php?sujet=2709
rappel espaceti http://espace-ti.forumactif.com/t139-83-programme-calculant-la-fonction-derivee
http://tout82.free.fr/forum/sujet.php?sujet=2709
rappel espaceti http://espace-ti.forumactif.com/t139-83-programme-calculant-la-fonction-derivee
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
moui, pas sur du tout que celui de Tout-82-le-vieux soit à jour, c'est mieux de prendre celui de TI-Planet, j'ai du le bidouiller une ou deux fois post-concours...
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Peu importe si c'est pas terminé pour l'instant je trouve que c'est une bonne idée (même si c'est pas le truc le plus utile au monde rien qu'à programmer ça doit être sympa, si on aime le défi réflexif) donc je salue ton effort.
Et aussi super présentation !!!
Et aussi super présentation !!!
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Mise à jour!
Ajout:
- Mode pas à pas!
- Simplification de la fraction finale
- Détection des erreurs (pas de solutions)
- Rapidité améliorée
- Nouveau design (partie graphique)
- Optimisation
PS: Mise à jour du premier message du topic
Ajout:
- Mode pas à pas!
- Simplification de la fraction finale
- Détection des erreurs (pas de solutions)
- Rapidité améliorée
- Nouveau design (partie graphique)
- Optimisation
- code v1.2:
:DelVar XDelVar L26→dim(L2
:1→C
:ClrHome
:Output(4,1,"EQUATION SOLVER
:Output(5,1,"v1.2 - Wistaro
:For(A,1,16
: Output(6,A,"+
: Output(3,A,"+
:End
:Lbl 1
:DelVar L1
:Input "?>",Str1
:ClrHome
:Disp "PLEASE WAIT...
:Str1→Str9
:length(Str9→L
:inString(Str9,"="→P
:If not(P:Goto 1
:Lbl 9
:Str9→Str1
:If C=1:Then
: sub(Str9,1,P-1→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If C=2:Then
: inString(Str9,"=")→P
: sub(Str9,P+1,length(Str9)-P→Str1
: length(Str1→V
: expr(Str1→L2(C+2
:End
:If not(inString(Str1,"X"):Then
: {0}→L1
: Goto 6
:End
:1→T
:Lbl 5
:length(Str1→V
:If inString(Str1,"X":Then
: inString(Str1,"X"→A
: Repeat Str3="+" or Str3="-" or A=1
: If A>1:A-1→A
: sub(Str1,A,1)→Str3
: End
: If A=1:sub(Str1,1,inString(Str1,"X")-A→Str4
: If A>1:sub(Str1,A+1,inString(Str1,"X")-(A+1)→Str4
:End
:T→dim(L1
:sub(Str4,1,1
:If Ans="+" or Ans="-" or Ans="*" or Ans="/":sub(Str4,2,length(Str4)-A)→Str4
:expr(Str4→L1(T
:inString(Str1,"X"→P
:If V-P:Then
: inString(sub(Str1,P+1,V-P),"X")→Q:Else:Goto 6:End
:If V>P and Q
:Then
: sub(Str1,P+1,V-P)→Str1
: T+1→T
: Goto 5
:End
:Lbl 6:ClrHome
:ClrDraw
:DelVar Esum(L1→L2(C
:If C=1:Then
: 2→C:Goto 9
:End
:L2(1)-L2(2→A
:L2(4)-L2(3→B
:If A<0:Then
: ‾A→A:‾B→B:End
:ClrHome
:DelVar Y1
:Text(0,0,Str9
:Text(7,0,"<=> ",L2(1),"X+",L2(3),"=",L2(2),"X+",L2(4
:Text(14,0,"<=> ",A,"X+",L2(3),"=",L2(4)
:Text(21,0,"<=> ",A,"X=",B
:If not(A:Goto 8
:Text(30,0,"<=> X="
:If not(fPart(B/A:Then
: Text(47,0,B/A
:Else
: If not(fPart(A) and not(fPart(B):Then
: If A<0:Then:‾A→F:Else:A→F:End
: If B<0:Then:‾B→G:Else:B→G:End
: A/gcd(F,G)→A
: B/gcd(F,G)→B
: End
: Text(40,0,B
: Text(54,0,A
: StorePic 1
: If A<0:Then:‾A→A:1→E:End
: If B<0:Then:‾B→B:1→E:End
: max({A,B→M
: {0,1→L1:{0,M→L2
: LinReg(ax+b)L1,L2,Y1
: Equ►String(Y1,Str1
: sub(Str1,1,length(Str1)-3→Str1
: DelVar Y1
: For(D,0,length(Str1)+E
: Text(47,3D,"-
: End
: RecallPic 1
:End
:Pause :ClrDraw
:Disp "
:Stop
:Lbl 8
:Text(30,0,"S= <ensemble vide>
:Pause
PS: Mise à jour du premier message du topic
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Une équation du premier degré et dimension 1 (une seule inconnue et à la puissance 1) a toujours une solution, soit unique soit l'ensemble des réels/complexes. Je suis donc déconcerté par la mention de détection d'abscence de solution. Quelques détails manquent donc por décrire cette fonction.
Bon travail. Fonctionne correctement sans trop d'exigences.
Bon travail. Fonctionne correctement sans trop d'exigences.
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Peut être un truc comme 2=1 je pense...
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Il affiche S= ensemble vide dans le cas ou les 2 termes sont égaux : 10X +32 = 10X + 32.
Mais, comme le dit Linkakro, la solution est IR.
J'ai rajouté l'affichage du résultat approché (s'il s'agit d'une fraction). Je suis en train de travailler sur les racines, pour conserver leur forme d'origine dans le résultat avec simplification.
Mais, comme le dit Linkakro, la solution est IR.
J'ai rajouté l'affichage du résultat approché (s'il s'agit d'une fraction). Je suis en train de travailler sur les racines, pour conserver leur forme d'origine dans le résultat avec simplification.
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Alors là ça ne va pas!
La solution n'est pas l'ensemble vide mais au contraire l'ensemble des réels (si tant est qu'on travaille seulement sur les réels)... Tu ne peux pas afficher qu'il n'y a pas de solution si tous les réels sont solutions...
La solution n'est pas l'ensemble vide mais au contraire l'ensemble des réels (si tant est qu'on travaille seulement sur les réels)... Tu ne peux pas afficher qu'il n'y a pas de solution si tous les réels sont solutions...
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Wistaro a admis le cas de solution multiple juste avant ton message, M@thieu41. Je n'ai pas compris immédiatement que "IR" est une manière d'écrire le symbole R avec sa double barre.
Je me suis emballé lorsque j'ai dit que l'équation a toujours une solution. Elle peut admettre soit l'ensemble, soit aucune.
En effet l'équation n'est plus de degré 1 dès qu'on a des coefficients qui s'annulent. Donc l'équation n'est pas forcément une tautologie (toujours vraie) mais elle peut être insoluble, donc effectivement aucune solution.
>> Toutes les équations se simplifient au final en "AX=B"
>> Si A est non nul, alors la solution est unique "X=B/A"
>> Si A=0, alors on a "0=B".
>>>> Si B=0, alors on a la tautologie "0=0" et l'ensemble est "IR". (Ou les complexes "CI".)
>>>> Si B est non nul, alors l'équation est contradictoire, et il n'y a aucune solution.
Je n'ai pas encore vérifié ce que Wistaro a fait, et peut-être que notre discussion ne remet pas en cause ce qui est déjà fait par Wistaro.
Je crains que simplifier des racines apporte des complications énormes dont la gestion des erreurs d'approximation. Tu peux t'inspirer de mes programmes racines et de ceux qui m'ont inspiré. Mais je m'occupais de traiter des nombres déjà appliqués numériquement, donc tu (wistaro) as certainement moyen de faire plus fiable.
Et si tu (wistaro) gères des nombres transcendants tels que Pi et e, alors tes calculs littéraux à propos des racines en prendront un gros coup je pense.
Je me suis emballé lorsque j'ai dit que l'équation a toujours une solution. Elle peut admettre soit l'ensemble, soit aucune.
En effet l'équation n'est plus de degré 1 dès qu'on a des coefficients qui s'annulent. Donc l'équation n'est pas forcément une tautologie (toujours vraie) mais elle peut être insoluble, donc effectivement aucune solution.
>> Toutes les équations se simplifient au final en "AX=B"
>> Si A est non nul, alors la solution est unique "X=B/A"
>> Si A=0, alors on a "0=B".
>>>> Si B=0, alors on a la tautologie "0=0" et l'ensemble est "IR". (Ou les complexes "CI".)
>>>> Si B est non nul, alors l'équation est contradictoire, et il n'y a aucune solution.
Je n'ai pas encore vérifié ce que Wistaro a fait, et peut-être que notre discussion ne remet pas en cause ce qui est déjà fait par Wistaro.
Je crains que simplifier des racines apporte des complications énormes dont la gestion des erreurs d'approximation. Tu peux t'inspirer de mes programmes racines et de ceux qui m'ont inspiré. Mais je m'occupais de traiter des nombres déjà appliqués numériquement, donc tu (wistaro) as certainement moyen de faire plus fiable.
Et si tu (wistaro) gères des nombres transcendants tels que Pi et e, alors tes calculs littéraux à propos des racines en prendront un gros coup je pense.
Linkakro- ----------------------
- Messages : 533
Points Concours : 55
Productivité : 31
Date d'inscription : 30/07/2013
Localisation : origine région centre, puis perpignan
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
Le problème c'est que si A = 0, le prgm ne teste pas si B = 0 ou pas. Il dit directement qu'il n'y a pas de solution. (cf :If not(A:Goto 8:Lbl 8:Text(30,0,"S= :Pause ).
Donc il faudrait rajouter le cas où toutes les solutions sont vraies, sinon c'est faux!
Wistaro a effectivement admis le cas de solution multiple, mais en précisant que le programme répondait dans ce cas qu'il n'y avait aucune solution...
Donc il faudrait rajouter le cas où toutes les solutions sont vraies, sinon c'est faux!
Wistaro a effectivement admis le cas de solution multiple, mais en précisant que le programme répondait dans ce cas qu'il n'y avait aucune solution...
m@thieu41- ----------------------
- Messages : 939
Points Concours : 65
Productivité : 47
Date d'inscription : 02/06/2013
Localisation : Nice, France
Calculatrice(s) :- TI-82 Stats.fr
. :
Re: [Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80
m@thieu41 a écrit:Le problème c'est que si A = 0, le prgm ne teste pas si B = 0 ou pas. Il dit directement qu'il n'y a pas de solution. (cf :If not(A:Goto 8:Lbl 8:Text(30,0,"S=:Pause ).
Donc il faudrait rajouter le cas où toutes les solutions sont vraies, sinon c'est faux!
Wistaro a effectivement admis le cas de solution multiple, mais en précisant que le programme répondait dans ce cas qu'il n'y avait aucune solution...
Il s'agit d'une erreur que j'ai corrigé ce matin, je posterais le code demain. De plus, j'ai également pris l'initiative de mettre une équation nulle si le signe "=" n'est pas mentionné. Si l'utilisateur rentre "10X
50", le programme va m’interpréter comme "10X+50=0".
Linkakro: Voilà l'erreur de mon programme, en fait. Je dis que quand A = 0, alors la solution est IR (anciennement
Linkakro a écrit:>>>> Si B=0, alors on a la tautologie "0=0" et l'ensemble est "IR". (Ou les complexes "CI".)
>>>> Si B est non nul, alors l'équation est contradictoire, et il n'y a aucune solution.
Page 1 sur 2 • 1, 2
Sujets similaires
» Jeu 2048 - TIbasic z80 - Compatible TI82
» problème solveur équation
» Convertir Angle en degré ou radian
» Solveur : erreur signe constant
» Forme canonique et racine de polynôme de second degré
» problème solveur équation
» Convertir Angle en degré ou radian
» Solveur : erreur signe constant
» Forme canonique et racine de polynôme de second degré
Page 1 sur 2
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Dim 16 Oct 2022 - 21:11 par Wistaro
» Bonne année 2018!
Ven 2 Nov 2018 - 19:42 par Ti64CLi++
» Lancement du TI-Concours 2017 !
Sam 20 Mai 2017 - 0:27 par Paulo1026
» Chaînes Youtube des membres
Ven 19 Mai 2017 - 22:41 par Wistaro
» cacul du taux d'intêret
Ven 24 Mar 2017 - 21:50 par m@thieu41
» [Projet] Un mario by tout82
Dim 29 Jan 2017 - 14:09 par Wistaro
» Cherche documentation assembleur TI82stat
Mer 25 Jan 2017 - 12:29 par Ti64CLi++
» Probleme Ti-82 Stats fr
Jeu 12 Jan 2017 - 13:56 par Ti64CLi++
» ROM 82 stats.fr
Jeu 15 Déc 2016 - 10:24 par Ti64CLi++