Egalités d'expressions

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Egalités d'expressions

Message par Dominique MICOLLET » mer. janv. 17, 2007 7:44 pm

Bonjour,

Je découvre giac/xcas et je suis abasourdi.

Pour le moment je me sers de la bibliothèque giac en lien avec un programme C++.

J'ai un petit souci avec une comparaison : je voudrais m'assurer de l'égalité de deux expressions écrites éventuellement de manière différente.

L'opérateur == semble sensible à l'écriture des expressions :
(E1+E2)==(E1+E2) me retourne vrai
mais
(E1+E2)==(E2+E1) me retourne faux

J'ai rusé avec un
simplify( (E1+E2)-(E2+E1)==0)
(où les expressions sont en fait des variables de classe gen) mais je ne trouve pas cela très élégant.

Y a un truc ?

Incidemment, je ne trouve pas de documentation propre à libgiac : ai-je mal cherché ?
Cordialement

Dominique MICOLLET

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » mer. janv. 17, 2007 11:12 pm

Il n'y a pas d'autre méthodes que d'utiliser une des diverses fonctions de simplification, giac n'effectue pas de presimplification de type tri dans les operations (pour conserver la forme originale de l'input). A la rigueur, vous pourriez simplement trier les arguments du +, sinon le moins demandeur en ressources est probablement la fonction _simplifier de prog.h qui regroupe un peu plus en faisant du tri dans les +/*, puis ratnormal qui ecrit un polynome sous forme normale (en fait une fraction), puis normal qui gere aussi les extensions algebriques et enfin simplify qui essaie de gerer les relations entre fonctions transcendantes.
Pour la doc de libgiac; elle est en effet pratiquement inexistante a l'heure actuelle, en-dehors de giac.info, mais les fonctions de xcas peuvent s'utiliser en C++ (il faudrait toutefois en rajouter dans les .h), il suffit a quelques exceptions pres d'ajouter le prefixe _ en groupant les arguments dans un giac::vecteur=std::vector<giac::gen> (par exemple avec makevecteur), et si necessaire d'ajouter un pointeur sur le contexte (pour l'instant je n'ai teste qu'avec le contexte global 0). Vous pouvez aussi regarder dans le .h correspondant pour la fonction C++ appelee si elle existe (celle qui ne necessite pas de grouper les arguments en vecteur).
Quelle utilisation pensez-vous faire de la libgiac?

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Message par Dominique MICOLLET » jeu. janv. 18, 2007 10:20 am

[quote]l n'y a pas d'autre méthodes .... relations entre fonctions transcendantes. [/quote]

Bon il va vraiment falloir que je me plonge dans les 560 et quelques pages du manuel utiliisateur :wink:

[quote] giac.info[/quote]
C'est celui-là que je n'avais pas vu.

[quote]Quelle utilisation pensez-vous faire de la libgiac?[/quote]

Un mien collègue mécanicien travaille sur une méthode d'étude de comportement des matériiaux continus fondée sur l'usage de polynome invariants par transformations de symétries (1) : une bonne partie de son programme générant ces polynomes avait été écrite en Fortran et il se plaignait de la difficulté de manipuler des chaines :cry: . J'ai pu le convaincre de reprendre la chose en C++. Et puis j'ai eu l'idée de chercher s'il existait quelque part une bibliothèque de calcul formel liable à un programme C++.
Et je vous ai trouvé :D

Il est à peu près certain que le tout mériterait d'être réécrit directement sous Xcas.
Mais je connais le C(++) depuis très longtemps, alors que je découvre Xcas.

Vous pouvez nous citer et on vous citera(2). L'application n'a pas encore de nom. Mais ca ne saurait tarder.

(1) cette méthode fait l'objet d'un ouvrage : "Mécanique et Comportements des milieux continus - A. THIONNET, E. MARTIN, S. BARRADAS.

(2) Comment peut-on citer ?


Cordialement
Dominique MICOLLET
(Il semble que ma signature ne s'ajoute pas automatiquement :?: )
Cordialement

Dominique MICOLLET

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » jeu. janv. 18, 2007 10:37 am

Si vous travaillez avec des polynomes, vous pouvez aussi utiliser les types polynomes de giac. Il y a des polynomes a 1 variable denses (eventuellement recursifs) ou a plusieurs variables creux. Les premiers sont des vecteur (synonymes modpoly) dont les fonctions de manipulation sont dans modpoly.h et modfactor.h, les seconds sont de type polynome, dont les fonctions de manipulation sont dans gausspol.h et poly.h/monomial.h.
Les polynomes sont toujours ecrits sous forme normale (plus besoin de s'inquieter de simplify).
Vous pouvez faire des tests dans xcas avec les fonctions symb2poly et poly2symb pour convertir des polynomes ecrits sous forme symboliques en polynomes giac, puis tester les operations arithmetiques, etc.
Par exemple
p:=symb2poly(1+x+y+z,[x,y,z]);
p10:=p^10;
poly2symb(p10,[x,y,z])
Le meme en representation dense recursive (il faut avoir la derniere version de giac)
p:=symb2poly(1+x+y+z,x,y,z);
p10:=p^10;
poly2symb(p10,x,y,z)
Si vous voulez utiliser des coefficients flottants au lieu d'entiers, il suffit de rajouter un evalf.

Pour citer giac/xcas, le plus logique me parait de mettre les auteurs (B. Parisse et R. De Graeve) et l'adresse de la page home http://www-fourier.ujf-grenoble.fr/~par ... ac_fr.html

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Message par Dominique MICOLLET » jeu. janv. 18, 2007 4:28 pm

[quote="parisse"]Par exemple
p:=symb2poly(1+x+y+z,[x,y,z]);
p10:=p^10;
poly2symb(p10,[x,y,z])

[/quote]

Sous l'interface xcas, ca marche au poil :
p1:=symb2poly(E1+E2,[E1,E2]);
p2:=symb2poly(E2+E1,[E1,E2]);
p1==p2;


Par contre symb2poly est inacessible via libgiac : j'ai fouillé un peu dans les entêtes et le code : il semble que cette fonction ait des déclarations différentes de sa définition : on trouve un symb2poly1 dans misc.h, qui ne semble pas avoir son pendant dans le code.
En cherchant un peu plus et en me fiant à la doc, j'ai utilisé _e2r.

Ceci étant, la solution à base de différence me semble plus générale : elle est implantée et donne satisfaction.


Je n'ai pas essayé la seconde version de symb2poly parce que je ne parviens pas à compiler giac-0.6.2 : entre autres je n'ai pas réussi à télécharger le support impression de FLTK mentionné dans
http://www-fourier.ujf-grenoble.fr/~par ... le_fr.html

Il sera peut-être directement disponible dans la prochaine version de Debian.

Quoi qu'il en soit, merci pour votre aide.

Cordialement

Dominique MICOLLET
Cordialement

Dominique MICOLLET

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » jeu. janv. 18, 2007 7:21 pm

en effet, j'avais mal positionne les droits sur l'archive fltk, c'est corrige.
J'ai oublie de declarer pas mal de fonctions, dont symb2poly (qui est dans sym2poly.cc mais pas dans le .h), _e2r est bien le nom C de la fonction (car e2r etait le nom Xcas de symb2poly il y a quelques annees)

Répondre