Le forum de XCAS

Xcas: un logiciel libre de calcul formel
Nous sommes actuellement le Mar Sep 02, 2014 1:46 am

Heures au format UTC




Publier un nouveau sujet Répondre au sujet  [ 12 messages ] 
Auteur Message
MessagePublié: Jeu Mar 18, 2010 9:58 am 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
Bonjour,



Dans une application de calculs d'invariants en mécanique, j'utilise la libgiac pour le calcul formel,
et plus particulièrement la fonction _gbasis.

Or le résultat fourni n'est pas celui attendu.

Plus exactement, le résultat fourni de manière interactive par xcas diffère de celui fourni
par un appel direct à la fonction dans un programme c++.

Extrait de la session xcas (copié-collé depuis l'interface):
-----
Commande :
gbasis([X_6^2-Y_1,(X_1*X_6+X_4*X_6)/2-Y_2,(X_3^2+X_5^2)/2-Y_3,(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8-Y_4,(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8-Y_5,(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8-Y_6,X_6-Y_7,(X_1+X_4)/2-Y_8 ],
[X_1,X_2,X_3,X_4,X_5,X_6,Y_1,Y_2,Y_3,Y_4,Y_5,Y_6,Y_7,Y_8]);
Réponse :
[X_1+X_4-2*Y_8,-X_2^2-X_4^2+2*X_4*Y_8+2*Y_6-Y_8^2,X_3^2+X_5^2-2*Y_3,X_6-Y_7,-Y_1+Y_7^2,-Y_2+Y_7*Y_8,Y_4-Y_6-Y_8^2,-Y_5-Y_6+Y_8^2]
--------

Cette réponse est conforme, et identique (au signe près) à la réponse fournie par maple ou maxima.

Or l'appel direct de _gbasis dans le programme c++ donné en fichier joint compilé avec

------
g++ -O0 -g -Wall -lgiac -lgmp -o essai_gbasis essai_gbasis.cpp
------

donne le resultat suivant :
------
[X_6-Y_7,-Y_1+Y_7^2,-Y_2+(X_1*X_6+X_4*X_6)/2,-Y_3+[X_6-Y_7,-Y_1+Y_7^2,-Y_2+(X_1*X_6+X_4*X_6)/2,-Y_3+(X_3^2+X_5^2)/2,-Y_4+(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8,-Y_5+(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8,-Y_6+(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8,-Y_8+(X_1+X_4)/2](X_3^2+X_5^2)/2,-Y_4+(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8,-Y_5+(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8,-Y_6+(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8,-Y_8+(X_1+X_4)/2]
-----
qui diffère notablement de celui produit interactivement ( entre autres, il manque plusieurs relations ne comportant que les Y_x).

Noter que giac a été compilée sans CoCoa.

À l'évidence, j'emploie mal _gbasis et je ne maîtrise pas assez la libgiac pour m'en sortir seul.
Un conseil serait donc le bienvenu.

Navré pour la complexité de l'exemple, mais c'est le seul dont je dispose actuellement pour montrer l'effet.


Cordialement

Dominique MICOLLET

Post-Scriptum : j'ai une grande difficulté à utiliser l'outil de recherche sur le forum :
je ne parviens même pas à retrouver d'anciens messages que j'y ai posté en utilisant le mot clef
gbasis ou mon nom alors que google me les retrouve. Suis-je incompétent ou l'outil de recherche a-t-il une défaillance ?

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 9:59 am 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
Visiblement l'attachement de fichier n'a pas fonctionné : je recopie le code d'essai_gbasis.cpp :
------
#include <string>
#include <giac/giac.h>
#include <giac/misc.h>
using namespace std;
using namespace giac;


int main(int argc, char * argv[])
{
string liste_polynomes="[X_6^2-Y_1,(X_1*X_6+X_4*X_6)/2-Y_2,(X_3^2+X_5^2)/2-Y_3,(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8-Y_4,(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8-Y_5,(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8-Y_6,X_6-Y_7,(X_1+X_4)/2-Y_8 ]";

string ordre_lexicographique="[X_1,X_2,X_3,X_4,X_5,X_6,Y_1,Y_2,Y_3,Y_4,Y_5,Y_6,Y_7,Y_8]";

string Resultat;
cerr << "Version Giac : " << _version(NULL).print() << endl<< endl;
cerr << "Liste des polynomes anonymes"<< endl<< liste_polynomes << endl<< endl;
cerr << "Ordre Lexicographique "<< endl << ordre_lexicographique << endl<< endl;
Resultat =_gbasis(gen(liste_polynomes + "," +ordre_lexicographique,NULL),NULL).print();
cerr << "Resultat"<< endl << Resultat << endl<< endl;
return 0;
}
-----

Dominique

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 12:05 pm 
Hors-ligne

Inscrit le: Mar Déc 20, 2005 4:02 pm
Messages: 3112
C'est tres certainement le support de la libcocoa qui est en cause, je n'ai jamais vraiment teste le code appele si cocoa n'est pas present, en tout cas, ce n'est absolument pas competitif comme code. Pour utiliser cocoa, il faut soit compiler giac-0.9.0 et une version a jour de CoCoA, soit compiler giac-0.8.5 et une ancienne version de CoCoA.
Sinon, pour la recherche dans le forum, je ne sais pas, mais ce n'est pas trop grave si on peut utiliser google.


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 1:55 pm 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
Rebonjour,

Je ne comprends pas bien votre réponse.

J'ai compilé giac sans support de CoCoa, qui n'est d'ailleurs pas installé sur ma machine, et pour ce que j'ai compris du prototype de _gbasis, cette fonction n'y fait pas appel.
Il ne devrait donc y avoir aucune référence à la libcocoa. ldd ne la mentionne d'ailleurs pas.

Il me semble donc que xcas et mon problème font appel au même code sous-jacent, et que c'est plutôt ma manière d'appeler ce code qui défaille puisque l'interface interface interactive donne le bon résultat.

Je vais essayer de compiler libgiac avec cocoa.
Cependant j'ai un petit souci avec votre suggestion : la page de telechargement des sources offre soit la version frozen qui semble etre la version 0.8.4 soit la version unstable que je suppose etre la version 0.9.0.
Je préferais utiliser la version stable : pourriez me conseiller quant au numéro de "vieille version" de cocoa à mettre en oeuvre.

Incidemment, icas fourni aussi la bonne réponse.

Cordialement

Dominique

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 2:08 pm 
Hors-ligne

Inscrit le: Mar Déc 20, 2005 4:02 pm
Messages: 3112
Si, si _gbasis appelle bien la libcocoa mais seulement si la libgiac est compilee avec support pour CoCoA (il y a des #ifdef dans cocoa.cc, et l'appel a cocoa_gbasis renvoie false si pas de support CoCoA). Pour la version de CoCoA compatible avec giac <0.9 c'est la 0.9915 dont je garde une copie sur le serveur ftp ftp-fourier.ujf-grenoble.fr, repertoire xcas/devel/sources (je n'arrive pas a mettre le lien ftp direct dans le post...)


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 3:07 pm 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
ReRebonjour,

J'ai tracé avec ddd le fonctionnement de mon programme et celui d'icas pour le meme probleme.

Les deux suivent vers la fin le même cheminement dans le code :
appel de _gbasis qui appelle gbasis qui essaye sans succes cocoa_gbasis et qui continue donc avec la methode standard.

La différence de comportement doit donc relever d'une différence de l'expression de type gen que je transmet directement à _gbasis.

Le problème est que je n'arrive pas à afficher cette chaîne avec le degugger ddd. Si vous savez le faire pourriez-vous m'indiquer comment vous faites ?

Cordialement.

Dominique

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 3:25 pm 
Hors-ligne

Inscrit le: Mar Déc 20, 2005 4:02 pm
Messages: 3112
j'utilise gdb directement (en general dans emacs), avec une macro pour appeler la methode dbgprint(), je ne sais pas si c'est faisable avec ddd. La definition de la macro est placee dans le fichier .gdbinit
more .gdbinit
echo Defining v as print command for giac types\n
define v
print ($arg0).dbgprint()
end
Par contre c'est curieux que icas ne passe pas par cocoa, sauf si c'est celui que vous avez compile (et non un de ceux que je fournis pre-compiles).


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 3:57 pm 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
ddd est une interface graphique de gdb. Votre definition de v marche parfaitement.

J'ai donc trace l'argument de _gbasis dans les deux cas (mon programme et icas).

Ils ont rigoureusement identiques.......

Il y a donc un problème plus bas. Je ne parviens malheureusement pas à afficher les polyvect et quelques autres variables.

Pour ce qui concerne icas ne passant pas par libcocoa, je me rends compte que j'ai oublié de préciser que j'ai tout compilé depuis la source giac_frozen : il est donc normal que icas n'emploie pas la libcocoa.

Je vais essayer de reprendre tout cela demain.

Merci de votre aide et bonne fin de journée.

Cordialement.

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 3:58 pm 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
>>Ils ont rigoureusement identiques.......
Ils sont rig.....

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Jeu Mar 18, 2010 7:36 pm 
Hors-ligne

Inscrit le: Mar Déc 20, 2005 4:02 pm
Messages: 3112
Alors, c'est peut-etre du à l'évaluation. Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.
Sinon, vectpoly devrait etre imprimable, mais il manque peut-etre l'instanciation de la méthode dbgprint().


Haut
 Profil  
 
MessagePublié: Ven Mar 19, 2010 9:44 am 
Hors-ligne

Inscrit le: Jeu Jan 11, 2007 10:39 am
Messages: 45
Localisation: Université de Bourgogne - France
Bonjour,

>>Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.

Ça marche !!!! :D :D :D

Maintenant, la question qui tue.... :twisted: Pourquoi ?

Cela semble lié au contexte.

Tous mes appels directs à libgiac usent d'un pointeur NULL pour le contexte.
Est ce une bonne ou une mauvaise chose, et dans ce dernier cas, que conviendrait-il de faire ?

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

PS : je n'arrive pas à quoter correctement avec le bouton ad-hoc de l'interface du forum : c'est quoi l'astuce ?

_________________
Cordialement

Dominique MICOLLET


Haut
 Profil  
 
MessagePublié: Ven Mar 19, 2010 11:36 am 
Hors-ligne

Inscrit le: Mar Déc 20, 2005 4:02 pm
Messages: 3112
Dominique MICOLLET a écrit:
Bonjour,

>>Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.

Ça marche !!!! :D :D :D

Maintenant, la question qui tue.... :twisted: Pourquoi ?

C'est parce que eval permet de reecrire les operations rationnelles (+ - * / ^) sous une forme standard attendue par les autres fonctions de giac.

Citer:
Cela semble lié au contexte.

Tous mes appels directs à libgiac usent d'un pointeur NULL pour le contexte.
Est ce une bonne ou une mauvaise chose, et dans ce dernier cas, que conviendrait-il de faire ?

NULL designe le contexte global. Au depart, il n'y avait pas de possibilite d'executer giac dans des threads distincts sans risque de collision, les contextes permettent de le faire (par ex. avoir une variable a assignee dans un thread et non assignee dans un autre). Le contexte global devrait marcher correctement, mais c'est mieux d'utiliser un contexte non global, pour ca il faut definir une variable de contexte par exemple
giac::context ct;
puis utiliser &ct au lieu de NULL en dernier parametre des fonctions qui utilisent un pointeur de contexte.
Quoi qu'il en soit, merci de votre aide.

Citer:
PS : je n'arrive pas à quoter correctement avec le bouton ad-hoc de l'interface du forum : c'est quoi l'astuce ?

normalement il faut mettre crochet ouvrant quote crochet fermant et finir par crochet ouvrant slash quote crochet fermant


Haut
 Profil  
 
Afficher les messages publiés depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 12 messages ] 

Heures au format UTC


Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 0 invités


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Rechercher pour:
Sauter vers:  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduction réalisée par Maël Soucaze © 2009 phpBB.fr