Bonjour,
J'essaie d'intégrer gias à un programme C++.
J'ai un comportement bizarre de la fonction e2r.
Voici un programme de demonstration, en 0.6.1 :
---
#include <giac/giac.h>
#include <giac/misc.h>
using namespace std;
using namespace giac;
int main(int argc, char* argv[])
{
cout << e2r(gen("V3*E33"),makevecteur(gen("[V3,E33]"))).print() << "\n";
}
--------
Après compilation, la réponse est correctement :
%%%{1,[1,1]%%%}
Mais si le polynome "V3*E33" est remplacé par "1/2*V3*E33", j'obtiens, après compilation et exécution :
0
J'ai aussi le meme souci si je remplace le coefficient par quelque chose comme (1+cos(theta))
Ce qui est très ennuyeux....
Sous Xcas la réponse est correcte sauf que le coefficient 1/2 est rejeté à l'extérieur
de la forme normalisée.
(%%%{1,[1,1]%%%})/2
Est ce que j'emploie mal e2r ?
Cordialement
Dominique MICOLLET
comportement bizarre de e2r
Modérateur : xcasadmin
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
comportement bizarre de e2r
Cordialement
Dominique MICOLLET
Dominique MICOLLET
dans le permier cas, il faut par exemple evaluer pour que le 1/2 soit remplace par inv(2), car l'operateur / (genere par le parser) n'est pas supporte par e2r.
Pour le parametre, il faut voir que e2r est prevu pour creer des polynomes avec des coefficients de type entier, double, rationnels, mais pas symboliques. Il faut donc rajouter les parametres en fin de liste (pour garder les variables principales au debut), par exemple
gen g=e2r(eval(gen("(1+cos(theta))*V3*E33")),makevecteur(gen("[V3,E33,cos(theta)]")));
Si vous devez travailler avec des polynomes a coefficients parametriques, il vaut peut-etre mieux utiliser des polynomes denses a 1 variable, donc la fonction e2r avec comme 2eme argument V3. Vous pouvez faire un 2eme appel a e2r avec E33 comme argument. Vous obtiendrez ainsi des polynomes 1-d avec comme coeff des polynomes 1-d dont les coeffs peuvent etre parametriques.
Pour le parametre, il faut voir que e2r est prevu pour creer des polynomes avec des coefficients de type entier, double, rationnels, mais pas symboliques. Il faut donc rajouter les parametres en fin de liste (pour garder les variables principales au debut), par exemple
gen g=e2r(eval(gen("(1+cos(theta))*V3*E33")),makevecteur(gen("[V3,E33,cos(theta)]")));
Si vous devez travailler avec des polynomes a coefficients parametriques, il vaut peut-etre mieux utiliser des polynomes denses a 1 variable, donc la fonction e2r avec comme 2eme argument V3. Vous pouvez faire un 2eme appel a e2r avec E33 comme argument. Vous obtiendrez ainsi des polynomes 1-d avec comme coeff des polynomes 1-d dont les coeffs peuvent etre parametriques.
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Bonjour,
En fait il semble que le premier problème que je rencontrais, à savoir le coefficient 1/2, semble être résolu par l'appel de eval sur le polynome : le 2 semble etre factorisé ,en particulier sur des polynomes à plusieurs monomes, et de ce fait e2r n'est plus perturbé car les coefficients des monomes ne contiennent plus le signe de division.
C'est sans doute ce qui explique que mon programme ne marchait pas alors que xcas répondait correctement.
Incidemment la conversion de 1/2*V3*E33-1/2*V2*E33 produit, pour la liste de variables [V2,V3,E33]:
%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%}/2
Le résultat est parfaitement interprétable, mais il n'y a pas de parenthèse autour du polynome non divisé. Alors qu'un copier-coller depuis l'interface xcas me les fournit :
(%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%})/2
Curieusement la librairie n'en a cure, alors que Xcas est fourvoyé, lorqu'on appelle
r2e pour la transformation inverse.
Le programme de demo est :
#include <giac/giac.h>
#include <giac/misc.h>
using namespace std;
using namespace giac;
int main(int argc, char* argv[])
{ gen g=e2r(eval(gen("1/2*V3*E33-1/2*V2*E33")),
makevecteur(gen("[V2,V3,E33]")));
cout << g.print() << "\n";
g=r2e(g,makevecteur(gen("[V2,V3,E33]")));
cout << g.print() << "\n";
}
et pour l'interface Xcas:
poly2symb((%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%})/2,[V2,V3,E33])
poly2symb(%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%}/2,[V2,V3,E33])
Pour les monomes à coefficients symboliques, je vais m'assurer que j'en aurai vraiment besoin, mais par curiosité j'aimerais savoir si e2r ne les traite pas par impossibilté intrinsèque ou parce que cela demande "simplement" une extension du code ?
Quoi qu'il en soit merci, je suis décoincé.
Dominique MICOLLET
En fait il semble que le premier problème que je rencontrais, à savoir le coefficient 1/2, semble être résolu par l'appel de eval sur le polynome : le 2 semble etre factorisé ,en particulier sur des polynomes à plusieurs monomes, et de ce fait e2r n'est plus perturbé car les coefficients des monomes ne contiennent plus le signe de division.
C'est sans doute ce qui explique que mon programme ne marchait pas alors que xcas répondait correctement.
Incidemment la conversion de 1/2*V3*E33-1/2*V2*E33 produit, pour la liste de variables [V2,V3,E33]:
%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%}/2
Le résultat est parfaitement interprétable, mais il n'y a pas de parenthèse autour du polynome non divisé. Alors qu'un copier-coller depuis l'interface xcas me les fournit :
(%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%})/2
Curieusement la librairie n'en a cure, alors que Xcas est fourvoyé, lorqu'on appelle
r2e pour la transformation inverse.
Le programme de demo est :
#include <giac/giac.h>
#include <giac/misc.h>
using namespace std;
using namespace giac;
int main(int argc, char* argv[])
{ gen g=e2r(eval(gen("1/2*V3*E33-1/2*V2*E33")),
makevecteur(gen("[V2,V3,E33]")));
cout << g.print() << "\n";
g=r2e(g,makevecteur(gen("[V2,V3,E33]")));
cout << g.print() << "\n";
}
et pour l'interface Xcas:
poly2symb((%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%})/2,[V2,V3,E33])
poly2symb(%%%{-1,[1,0,1]%%%}+%%%{1,[0,1,1]%%%}/2,[V2,V3,E33])
Pour les monomes à coefficients symboliques, je vais m'assurer que j'en aurai vraiment besoin, mais par curiosité j'aimerais savoir si e2r ne les traite pas par impossibilté intrinsèque ou parce que cela demande "simplement" une extension du code ?
Quoi qu'il en soit merci, je suis décoincé.
Dominique MICOLLET
Cordialement
Dominique MICOLLET
Dominique MICOLLET
en effet, il manque des parentheses pour les fractions dont le numerateur est un polynome, il faudra que je m'en occupe.
Concernant les limitations de e2r, il est probablement possible de traiter les coeffs symboliques, mais ca serait contraire a la philosophie de giac qui suppose que tous les coefficients de polynomes sont de type au plus aussi complexe que des polynomes (en tous cas tous de type immediat, ne necessitant pas d'evaluation)
Concernant les limitations de e2r, il est probablement possible de traiter les coeffs symboliques, mais ca serait contraire a la philosophie de giac qui suppose que tous les coefficients de polynomes sont de type au plus aussi complexe que des polynomes (en tous cas tous de type immediat, ne necessitant pas d'evaluation)