giac icas

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

Modérateur : xcasadmin

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

giac icas

Message par ddorange » mar. janv. 10, 2017 7:03 am

Bonjour,

Meilleurs vœux de santé et de bonheur à tous.

J'ai remarqué que les écritures x(x+1) et x(ln(x)+1) ne sont pas traitées de la même manière.
Dans le premier cas, Xcas retourne x*(x+1) avec un message d'avertissement : "Attention : utilisation de multiplication implicite pour (x)(x+1)"
Dans le second cas, rien de tel et le calcul est mal interprété : f(x):=x(ln(x)+1) n'est pas modifié et f'(x) donne 1/x car ln(x)+1 est considéré comme une constante.
Ce n'est pas ennuyeux si on travaille directement dans la console Xcas, puis qu'un message d'avertissement s'affiche.
Cependant dans un traitement de textes, c'est plus ennuyeux car l'utilisateur n'est pas averti est se retrouve avec f'(x)=1/x.

Du coup je cherche à contourner cette difficulté.
Piste 1 : en ajoutant une * avant le (. Mais alors il faut que les caractères précédents ne soient pas : ^*/+-’ et ne constituent pas une fonction usuelle sin, ln etc...
Mais également une fonction définie dans giac.sav
D'où ma première question : existe-t-il un moyen de récupérer la liste des variables mémorisées dans giac.sav ?

Piste 2 : récupérer le message d'avertissement. D'où ma question :
Est-ce possible ?

Merci d'avance pour vos réponses.

Cordialement
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » mer. janv. 11, 2017 8:52 am

pour x(ln(x)+1) je peux ameliorer la detection et reconnaitre une multiplication implicite, mais ca ne resoudra pas tous les cas, et il serait bien de pouvoir recuperer les warnings. Sous Unix, il suffit de rediriger stderr, par exemple

Code : Tout sélectionner

icas 'x(x+1)' > log 2> logerr
mais je ne sais pas si c'est supporte par un terminal sous windows.
Sinon la commande VARS permet de connaitre la liste des variables affectees, alors que lname renvoie la liste des noms de variables d'une expression.

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » jeu. janv. 12, 2017 8:31 am

Bonjour,
parisse a écrit :pour x(ln(x)+1) je peux ameliorer la detection et reconnaitre une multiplication implicite, mais ca ne resoudra pas tous les cas, et il serait bien de pouvoir recuperer les warnings. Sous Unix, il suffit de rediriger stderr, par exemple

Code : Tout sélectionner

icas 'x(x+1)' > log 2> logerr
mais je ne sais pas si c'est supporte par un terminal sous windows.
Dmaths manipule un traitement de texte. Par exemple f(x)=x(x+1) va écrire une formule identique mais mémoriser dans giac.av la fonction f(x):=x*(x+1). Là c'est ok pour la suite.
Pour f(x)=x(lnx+1) l'écriture est f(x)=x(ln(x)+1) mais la sauvegarde dans giac.sav est f(x):=x(ln(x)+1). Ce qui est faux pour le calcul dans Xcas.

Je ne sais pas si vous devez modifier Xcas pour faire reconnaître une multiplication implicite. C'est à vous de juger. De mon côté je cherche à contourner la difficulté. C'est faisable si je sais récupérer la liste des variables mémorisées dans Xcas. A priori je peux faire écrire ces variables dans un fichier texte giac.var. Mais je cherche s'il y a plus smiple.
Sinon la commande VARS permet de connaitre la liste des variables affectees, alors que lname renvoie la liste des noms de variables d'une expression.
Comment s'utilisent ces commandes ? icas 'VARS' > ????
J'ai fait des essais du type

Code : Tout sélectionner

cd /home/didier/.config/libreoffice/4/user/Dmaths
icas VARS
le dossier Dmaths contenant giac.sav et j'ai [] comme retour alors que f(x):=x+1 est mémorisée.

Voici un lien de téléchargement de Dmaths 4.1 si vous voulez tester.
https://framadrop.org/r/GNNVbbxeJL#Wgh5 ... JshVj9JRU=

Merci et cordialement.
Didier DP
www.dmaths.org

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » jeu. janv. 12, 2017 9:03 am

Avec comme giac.in :

Code : Tout sélectionner

unarchive("giac.sav");
Sortie:=fopen("giac.var");
fprint(Sortie,Unquoted,VARS);
fclose(Sortie);
archive("giac.sav");
j'obtiens comme giac.var

Code : Tout sélectionner

[Resultat,Sortie,f,g]
et comme message console :

Code : Tout sélectionner

[cas_setup([0,0,0,1,0,[1e-12,1e-15],12,[4,100,0,25],0,1,0,1]),xyztrange([-10.0,10.0,-10.0,10.0,-10.0,10.0,-10.0,10.0,-10.0,10.0,-1.4,1.1,1,0.0,1.0,3]),[unarchive("giac.sav"),(Resultat:=f(x):=sin(x)),(Sortie:=fopen("giac.out")),fprint(Sortie,Unquoted,Resultat),fclose(Sortie),0,(Resultat:=f(x):=sin(x)),(Sortie:=fopen("giac.out")),fprint(Sortie,Unquoted,Resultat),fclose(Sortie),archive("giac.sav"),0,(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,VARS),fclose(Sortie),archive("giac.sav"),0,(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,'lname'),fclose(Sortie),archive("giac.sav"),0,(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,LNAME),fclose(Sortie),archive("giac.sav"),0,(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,VARS),fclose(Sortie),archive("giac.sav"),0,(Resultat:=g(x):=x^2+x),(Sortie:=fopen("giac.out")),fprint(Sortie,Unquoted,Resultat),fclose(Sortie),archive("giac.sav"),0,(Resultat:=VARS),(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,Resultat),fclose(Sortie),archive("giac.sav"),0,(Sortie:=fopen("giac.var")),fprint(Sortie,Unquoted,VARS),fclose(Sortie),archive("giac.sav")],["Unable to read file Erreur: Valeur Argument Incorrecte", (x)->sin(x),"Done",1,1,0,[undef], (x)->sin(x),"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef], (x)->x^2+x,"Done",1,1,0,[undef],"Resultat: définition récursive Erreur: Valeur Argument Incorrecte","Done",1,1,0,[undef],pointer(0x7fa9a0000b70,0),1,1],(Resultat:= (x)->x^2+x),(f:= (x)->sin(x)),(g:= (x)->x^2+x),xcas_mode(0)]
Est-ce correct ?

Y a-t-il mieux ?

Par contre, je n'arrive à rien avec lname ...
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » jeu. janv. 12, 2017 10:09 am

on a du mal se comprendre, lname(expression) est une commande Xcas permettant de connaitre la liste des noms de variables d'une expression, vous n'en avez peut-etre pas besoin.

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » jeu. janv. 12, 2017 1:09 pm

L'instruction VARS fait bien mon affaire. Elle retourne : [Resultat,Sortie,f,g,a]

Existe-t-il une instruction qui pourrait retourner : [Resultat,Sortie,f(x):=x^2+1,g(x):=x+1,a:=5] ?

Je pourrais alors distinguer l'affectation d'une fonction d'une simple variable.

Merci.
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » jeu. janv. 12, 2017 1:20 pm

non, en fait ce n'est pas possible de cette facon, car le langage est fonctionnel. Par contre rien n'interdit a partir de la liste de VARS de faire une boucle pour evaluer le contenu des variables. Par exemple

Code : Tout sélectionner

for j in VARS do print(eval(j,1),j) od
On peut aussi tester si on a affaire a une fonction

Code : Tout sélectionner

for j in VARS do 
  print(eval(j,1),j,type(j)); 
  si type(j)==DOM_FUNC alors print(j[3]); fsi; 
od

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » jeu. janv. 12, 2017 2:24 pm

Désolé mais je ne vois pas comment utiliser ces lignes de code.
Dans un console ? Dans un fichier giac.in ?
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » jeu. janv. 12, 2017 3:48 pm

Ca devrait marcher dans un fichier giac.in

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » dim. janv. 15, 2017 12:37 pm

Bonjour,

J'ai fait quelques tentatives infructueuses.
Les variables affectées sont :

Code : Tout sélectionner

[Resultat,Sortie,a,b,f,g,h]
a,b sont des constantes ; f,g,h des fonctions.
J'ai alors saisi comme giac.in :

Code : Tout sélectionner

unarchive("giac.sav");
Sortie:=fopen("giac.var");
for j in VARS do; 
  print(eval(j,1),j,type(j));
  si type(j)==DOM_FUNC alors fprint(Sortie,Unquoted,j[3]); fsi; 
od;
fclose(Sortie);
archive("giac.sav");
J'ai comme retour dans le fichier giac.var :

Code : Tout sélectionner

ln(x)x^2+3tan(x)ln(x)
La fonction h (ln(x)) apparaît deux fois.
Mais surtout, je voudrais les noms des fonctions donc obtenir : Il suffit sans doute de modifier un peu le code du giac.in. J'ai fait plein de tentatives infructueuses, en remplaçant j[3] par j[0 à 2], name(j), j ...

Merci pour votre aide.
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » dim. janv. 15, 2017 3:50 pm

eval(j,1) devrait donner le nom, c'etait pour ca que j'avais mis la commande print dans la boucle.
Vous pouvez tester dans Xcas pour voir l'effet des commandes.
Je ne sais pas pourquoi la fonction ln(x) apparait deux fois, peut-etre parce que j lui-meme est une variable.

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » dim. janv. 15, 2017 9:02 pm

Merci !
Cela fonctionne.
Avec

Code : Tout sélectionner

unarchive("giac.sav");
Sortie:=fopen("giac.var");
for j in VARS do; 
  print(eval(j,1),j,type(j));
  si type(j)==DOM_FUNC alors fprint(Sortie,Unquoted,eval(j,1)); fsi; 
od;
fclose(Sortie);
archive("giac.sav");
j'obtiens

Code : Tout sélectionner

Resultatfgh
Peut-être y a-t-il un moyen de ne pas avoir resultat ou alors resultat: ?
Didier DP
www.dmaths.org

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

Re: giac icas

Message par parisse » lun. janv. 16, 2017 6:09 am

Apparamment Resultat est une de vos variables. Si vous voulez l'eviter il doit suffire de modifier le test
si type(j)==DOM_FUNC et eval(j,1)!='Resultat' alors fprint(Sortie,Unquoted,eval(j,1)); fsi;

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » lun. janv. 16, 2017 7:48 pm

Merci pour votre aide.
Le même problème que celui évoqué plus haut avec x(ln(x)+1) est apparu aujourd'hui avec i(2i+1)^2. Le calculateur interprète mal sans *. Il faut i*(2i+1)^2
Cela vaut donc le coup que je corrige pour le traitement de texte en écrivant une routine qui ajoute l'*.
Je crois tout avoir pour le faire.
Je vous tiens au courant d'ici samedi.
Je mettrait dans ce fil le code utilisé notamment dans LO, pour le cas ou quelqu'un est intéressé.

Cordialement.
Didier DP
www.dmaths.org

ddorange
Messages : 55
Inscription : sam. mars 12, 2016 7:50 am

Re: giac icas

Message par ddorange » dim. janv. 22, 2017 10:52 am

Bonjour,
Je n'ai pas encore tout à fait terminé.
Je crois que je suis perfectionniste (trop ?). Du coup je cherche un moyen pour que dans la boîte de dialogue calcul formel apparaisse une zone de liste ou listbox avec toutes les variables définie par l'utilisateur.
Du coup j'ai essayé le giac.in suivant :

Code : Tout sélectionner

unarchive("giac.sav");
Sortie:=fopen("giac.var");
for j in VARS do;
	si eval(j,1)!='Resultat' et eval(j,1)!='Sortie' et eval(j,1)!='j' alors;
	  print(eval(j,1),j,type(j));
	  si type(j)==DOM_FUNC  et eval(j,1)!='Resultat' alors;     
		 fprint(Sortie,Unquoted,eval(j,1));
		 fprint(Sortie,Unquoted,":=");
		 fprint(Sortie,Unquoted,j[3]);
		 fprint(Sortie,Unquoted,"#");
	  sinon;
		 fprint(Sortie,Unquoted,eval(j,1));
		 fprint(Sortie,Unquoted,"="); 
		 fprint(Sortie,Unquoted,j);      
		 fprint(Sortie,Unquoted,"#");
	  fsi;  
	 fsi;
od;
fclose(Sortie);
archive("giac.sav");

qui me retourne un résultat correct et attendu :

Code : Tout sélectionner

a=17#f:=sin(x)#g:=x^3#h:=sin(x)+x^3#
cependant je voudrais pour une lecture plus facile remplacer # par un retour ligne. Y a-t-il un code spécial ?

A noter que j'ai comme retour dans la console beaucoup d'erreurs :

Code : Tout sélectionner

,fclose(Sortie),archive("giac.sav")],["Unable to read file Erreur: Valeur Argument Incorrecte", (x)->sin(x),"Done",1,1,"Done",1,1,0,[undef], (x)->x^3,"Done",1,1,"Done",0,1,0,[undef], (x)->sin(x)+x^3,"Done",1,1,"Done",1,1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done","1er arg=résultat de open, ensuite autres args Erreur: Valeur Argument Incorrecte Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done",1,1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",0,1,0,[undef],"Done",1,1,0,[undef],17,"Done",1,1,"Done",0,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done","Gen [int] Erreur: Type Argument Incorrect Erreur: Valeur Argument Incorrecte",1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],"Done",1,1,0,[undef],pointer(0x7fa78400f140,0),0,1],(Resultat:=17),(a:=17),(f:= (x)->sin(x)),(g:= (x)->x^3),(h:= (x)->sin(x)+x^3),xcas_mode(0)]
// Time 0
// Total time 0.01
Est-ce gênant ?
Merci encore pour votre aide précieuse.
Didier DP
www.dmaths.org

Répondre