[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 Hitskin_logo Hitskin.com

Ceci est une prévisualisation d'un thème de Hitskin.com
Installer le thèmeRetourner sur la fiche du thème

Tout 82
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Tout 82

Jeu 28 Mar 2024 - Bienvenue,

Rechercher
 
 

Résultats par :
 


Rechercher Recherche avancée

Connexion

Récupérer mon mot de passe



Chatbox externe


Derniers sujets
» [JEU] Mon voisin du dessous
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyDim 16 Oct 2022 - 21:11 par Wistaro

» Bonne année 2018!
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyVen 2 Nov 2018 - 19:42 par Ti64CLi++

» Lancement du TI-Concours 2017 !
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptySam 20 Mai 2017 - 0:27 par Paulo1026

» Chaînes Youtube des membres
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyVen 19 Mai 2017 - 22:41 par Wistaro

» cacul du taux d'intêret
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyVen 24 Mar 2017 - 21:50 par m@thieu41

» [Projet] Un mario by tout82
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyDim 29 Jan 2017 - 14:09 par Wistaro

» Cherche documentation assembleur TI82stat
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyMer 25 Jan 2017 - 12:29 par Ti64CLi++

» Probleme Ti-82 Stats fr
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyJeu 12 Jan 2017 - 13:56 par Ti64CLi++

» ROM 82 stats.fr
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 EmptyJeu 15 Déc 2016 - 10:24 par Ti64CLi++

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

-34%
Le deal à ne pas rater :
-34% LG OLED55B3 – TV OLED 4K 55″ 2023 – 100Hz HDR 10+, ...
919 € 1399 €
Voir le deal

Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80

+2
Linkakro
Wistaro
6 participants

Aller à la page : 1, 2  Suivant

Aller en bas  Message [Page 1 sur 2]

Wistaro

Wistaro
Passioné
Passioné

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)~
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 1405496114solve2


~ Code source ~
v1.2 (dernière):



v0.1a:

~ 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

https://www.youtube.com/user/Wistaro

Linkakro

Linkakro
----------------------
----------------------

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.

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 ~
Tant pis, j'attend tant qu'il faudra, ce n'est pas comme si nous pouvions le faire pour toi.

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

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.
Dis que X ne supporte que le produit par un réel et ce sera suffisant.
"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

m@thieu41

m@thieu41
----------------------
----------------------

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.

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é

rpgcreator

rpgcreator
Connaisseur
Connaisseur

Sinon le cerveau aussi ça marche Very Happy Razz
Avantages :
-Pas besoin de se hum hum hum pour un programme qui pourrait foirer un contrôle Smile
-Des kilo-octets de libre dans notre chère 82stats (hé oui Razz)
-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) Smile Very Happy
Ceux qui en ont besoin peuvent rajouter un gros ventirad et un ventilo de CPU sur le crâne  pour éviter la surchauffe Very Happy Very Happy Very Happy Very Happy Very Happy

Wistaro

Wistaro
Passioné
Passioné

Topic mit à jour, avec le code, et les explications détaillées. N'oubliez pas de regarder la partie "annexe"

https://www.youtube.com/user/Wistaro

m@thieu41

m@thieu41
----------------------
----------------------

- 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.
De chiffres tu veux dire? :P

Il serait judicieux de prendre en compte qu'un nombre négatif contient un caractère en plus Wink

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.

Wistaro

Wistaro
Passioné
Passioné

Merci, je n'ai pas encore abordé les logarithmique en cours Razz 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é

https://www.youtube.com/user/Wistaro

m@thieu41

m@thieu41
----------------------
----------------------

J'ai survolé (et encore Razz) 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 Wink

C'est sur que si tu arrives à traiter les pi/e/racines ça peut devenir intéressant Smile
Et encore plus si tu arrives à distinguer et résoudre le second degrés.

Continue comme ça alors Smile

Wistaro

Wistaro
Passioné
Passioné

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.

https://www.youtube.com/user/Wistaro

m@thieu41

m@thieu41
----------------------
----------------------

Second degré c'est plutôt les X² qu'il faut isoler Smile

Oui c'est faisable, après reste à voir si c'est pas trop lourd à faire.

Wistaro

Wistaro
Passioné
Passioné

Faut voir. Je ne pense pas que cela soit exsessif,

https://www.youtube.com/user/Wistaro

Linkakro

Linkakro
----------------------
----------------------

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.



Dernière édition par Linkakro le Mar 8 Juil 2014 - 20:12, édité 1 fois

Wistaro

Wistaro
Passioné
Passioné

D'accord Smile 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 ?

https://www.youtube.com/user/Wistaro

Linkakro

Linkakro
----------------------
----------------------

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().

Wistaro

Wistaro
Passioné
Passioné

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.

https://www.youtube.com/user/Wistaro

Linkakro

Linkakro
----------------------
----------------------

N'oublie pas que EasyFx ne gère pas les fonctions composées.

Wistaro

Wistaro
Passioné
Passioné

Linkakro a écrit:N'oublie pas que EasyFx ne gère pas les fonctions composées.
EasyFX?

https://www.youtube.com/user/Wistaro

Linkakro

Linkakro
----------------------
----------------------

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

persalteas

persalteas
----------------------
----------------------

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...

https://tout82.forumactif.org

ashtrail

ashtrail
Connaisseur
Connaisseur

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  Bien Joué Razz !!!

http://ti-freeworld.fr1.co/

Wistaro

Wistaro
Passioné
Passioné

Merci x)

https://www.youtube.com/user/Wistaro

Wistaro

Wistaro
Passioné
Passioné

Mise à jour!
[Projet] Solveur d'équations de 1er degré sans solve() - TIbasic z80 1405496114solve2

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:

PS: Mise à jour du premier message du topic

https://www.youtube.com/user/Wistaro

m@thieu41

m@thieu41
----------------------
----------------------

Super Smile
Bravo !  Bien Joué 

Linkakro

Linkakro
----------------------
----------------------

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.

m@thieu41

m@thieu41
----------------------
----------------------

Peut être un truc comme 2=1 je pense...

Wistaro

Wistaro
Passioné
Passioné

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.

https://www.youtube.com/user/Wistaro

m@thieu41

m@thieu41
----------------------
----------------------

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... No

Linkakro

Linkakro
----------------------
----------------------

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.

m@thieu41

m@thieu41
----------------------
----------------------

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...

Wistaro

Wistaro
Passioné
Passioné

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 ). Il faudrais une autre condition analysant B, et comme tu le dit,
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.

https://www.youtube.com/user/Wistaro

Contenu sponsorisé



Revenir en haut  Message [Page 1 sur 2]

Aller à la page : 1, 2  Suivant

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum