Simplification d'expressions mathematiques.

Simplification d'expressions mathematiques. - Algo - Programmation

Marsh Posté le 20-04-2005 à 20:13:05    

Salut, voila je suis entrain de faire une fonction qui permet la simplification d'expressions mathematiques (de base pour le moment), un espece de calculette à la noix quoi (du style celle de PowerTools sous Windows).  :sarcastic:  
 
L'utilisateur rentre une expression : "f(x)=1+x", ca enregistre la fonction dans un environnement. Il peut lancer une evaluation : "f(1)",  obtenir la derivée ou simplifier le corps de la fonction (du style "f(x)=1+2+x" => "f(x)=3+x" ) mais il y a un hic.
 
Le parseur construit (grace a des operations semantiques) un arbre prefixé de l'expression :
 
1+2-3 => (- (+ 1 2) 3) On obtient donc un arbre. (pas forcement binaire dans certains cas)
 
J'ai fait donc un simplificateur (ou évaluateur partiels) assez "bidon" qui se balade dans l'arbre recursivement et des qu'il croise une racine "+" verifie que ses deux fils sont des nombres pour cree une feuille (qui est le resultat de l'addition des deux fils) à la place de la racine, le probleme c'est qu'evidement il ne gere pas la simplification d'une expression comme "1+x-1" car en prefixé ca donne "(- (+ x 1) 1)" ou le sous arbre "(+ x 1)" n'est pas simplifiable.
 
J'ai pensé d'abord à faire un tri qui regroupe toutes les constantes dans un sous arbre et les variables dans l'autre ... c'est tres couteux et ca ne donne pas forcement de resultat satisfaisant. Ensuite, on pourrais faire de la simplification pendant le parsage , mais c'est tres light car se limite à des choses comme x*0=0 ou x*1=x etc ...
 
J'ai pas vraiment trouvé de choses interresantes (comme les algos utilisé dans les progs comme Mapple ou Mathematica :) dans le dernier un expression comme x²+x est équivalente, si ce n'est égale à x(x+1)), tout conseil ou avis serai fort agréable  [:chronoklazm]  
 
Merci.
 
 


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 20-04-2005 à 20:13:05   

Reply

Marsh Posté le 21-04-2005 à 00:47:50    

Personne n'a rien a dire ? :(


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-04-2005 à 01:10:03    

Tu pourrais essayer de construire tous les arbres possibles en tirant partie de la commutativité et voir lequel est le meilleur.

Reply

Marsh Posté le 21-04-2005 à 01:19:52    

Hhhmm oué ... t'as pas un exemple stp ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-04-2005 à 10:49:47    

Dans ton exemple 1+x-1 = x+1-1
Tu construis les deux arbres (- (+ x 1) 1) et (+ (-1 1) x). Le deuxieme se simplifie.

Reply

Marsh Posté le 21-04-2005 à 10:54:00    

Ouala, tu regroupes d'un côté les constants, et de l'autre les variables

Reply

Marsh Posté le 21-04-2005 à 14:26:39    

retrox => Ok et pour un arbre du genre (+ (+ x 1) (- x 1)) tu fait comment ? ... le probleme c'est que je construit l'arbre en parsant donc "changer" l'arbre en cours de parsage selon un critere est impossible, ou alors je vois pas du tout comment faire.
 
EDIT: Au depart j'obtiens ca et rien d'autre : (- (+ x 1) 1) justement mon but est d'obtenir un autre arbre à partir du premier (+ (-1 1) x).


Message édité par Chronoklazm le 21-04-2005 à 14:37:04

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-04-2005 à 19:19:24    

Peut-être en changeant la méthode de création de l'arbre... D'abord tu groupes les membres, et après tu passes à la création de l'arbre

Reply

Marsh Posté le 22-04-2005 à 15:12:31    

Et en ne travaillant qu'avec deux opérations ?
Après tout, 1 + x - 1 = 1 + x + (-1)
Dans ton arbre, tu obtiens quelque chose genre  
(+ ( 1 x (-1) ) )...
Et pareil, une division par a c'est une multiplication par (1/a)...

Reply

Marsh Posté le 22-04-2005 à 16:38:16    

Oué je me suis fixé sur cette idée mais je gere aussi le cas du moins binaire ... j'ai mon arbre, je fait un petit parcours infixe dessus et je rempli une table de hashage (une TreeMap, je le fait en Java) en comptabilisant les apparitions des tous les termes (et leurs signe) qui sont presents dans l'arbre, j'obtient un truc du genre "pseudo" forme polynomiale quoi :
 
Terme : exp = 0
Terme : sin = 0
Terme : sin(1+x) = 1
Terme : sin(1+x+x2) = 0
Terme : x^0 = 0
Terme : x^1 = -1
Terme : x^2 = 2
Terme : x^3 = 0
 
Il me reste plus qu'a recontruire l'arbre en prefixe à partir de cette forme polynomiale (une somme des termes) pour avoir un truc exploitable. (derivable, integrable etc ...)
 
Bon si quelqu'un a une meilleure idée je suis preneur :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 22-04-2005 à 16:38:16   

Reply

Marsh Posté le 24-04-2005 à 01:59:39    

Citation :


f(x)=(-x-4)+x-2-(4+x-(-2-x)) ;
 ( = f x ( - ( - ( + ( - ( - x ) 4 ) x ) 2 ) ( - ( + 4 x ) ( - ( - 2 ) x ) ) ) )
 
Le corps de la fonction ? =>>  ( - ( - ( + ( - ( - x ) 4 ) x ) 2 ) ( - ( + 4 x )
 ( - ( - 2 ) x ) ) )
- [21]
   - [21]
      + [20]
         - [21]
            - [4]
               x [13]
            4 [26]
         x [13]
      2 [26]
   - [21]
      + [20]
         4 [26]
         x [13]
      - [21]
         - [4]
            2 [26]
         x [13]
value is 0.0
f(1);
 ( f 1 )
FeuilleDe x A : true
FeuilleDe y A : false
La HashMap de simplif =} {cste= : -12, x= : -2}
Reconstruction Ó partir de la HashMap =}  ( + ( + ( - 12 ) ) ( + ( * ( - 2 ) x )
 ) )
value is -14.0


 
Haha, c'est juissif quand ca marche ! [:chronoklazm]
 
Par contre l'algo que j'utilise pour remplir la HashMap est assez restrictif ... c'est un simple parcours recursif de l'arbre qui "ajoute" reelement les choses dans la table que quand il atteint les feuilles. Il ne permet pas de gerer les cas du style (x+x)^2 ou sin(x+2+x) qui necessite un pre-traitement (devellopement ou simplification des sous-arbres). Donc niveau complexité ca explose assez rapidement je pense.  
 
Si par hasard quelqu'un tombe sur les sources (des fonctions "expand" ou autre) de Maple ou un truc du genre ou il font ce genre de choses en langage imperatif ... partagez :)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed