comportement bizarre de e2r

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

comportement bizarre de e2r

Message par Dominique MICOLLET » lun. févr. 26, 2007 5:01 pm

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
Cordialement

Dominique MICOLLET

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

Message par parisse » mar. févr. 27, 2007 12:47 pm

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.

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

Message par Dominique MICOLLET » jeu. mars 01, 2007 11:05 am

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
Cordialement

Dominique MICOLLET

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

Message par parisse » jeu. mars 01, 2007 7:22 pm

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)

Répondre