XCAS pour les ingénieurs : simplification des expressions

Utilisation de Xcas

Modérateur : xcasadmin

icare34
Messages : 2
Inscription : ven. févr. 20, 2009 2:20 pm
Localisation : Montpellier

XCAS pour les ingénieurs : simplification des expressions

Message par icare34 » lun. févr. 23, 2009 8:33 am

Bonjour,
Je tiens tout d'abord, à vous féliciter pour cet excellent outil que je découvre peu peu.
Je suis ingénieur de formation et nouvel utilisateur.
Je cherche à utiliser Xcas pour de la modélisation de systèmes thermiques et thermodynamiques.
Parfois je suis amené à simplifier des expressions.
Exemple :
P:=m*Cp*(T1-T2)
On pose DeltaT=T1-T2

Pour obtenir l'expression "simplifiée" de P,
j'ai utilisé :
subst(P,(T1-T2),deltaT)
Et j'obtiens :
m*Cp*deltaT ce qui est l'expression attendue

Par contre, si je pose Q:= m*Cp
subst(P,m*Cp,Q)
j'obtiens : m*Cp*(T1-T2) au lieu de Q*(T1-T2)

J'ai le même problème lorsque je veux simplifier d'autres expression en posant par exemple A=(s-1)/(s+1), la simplification ne se fait pas.

J'ai essayé d'utiliser des fonctions à la place d'expressions ... sans plus de succès!

Pouvez-vous, s'il vous plaît, m'indiquer la meilleure démarche pour effectuer ce genre de simplification.

Cordialement
Didier R.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Message par frederic han » lun. févr. 23, 2009 10:53 am

Bonjour,

je pense que c'est parce que subs ne peut substituer qu'un seul argument.

si l'on fait nops(P) on trouve bien 3. si l'on selectionne m*Cp dans le resultat de P (ie ecrit en noir) on a bien 2 cases noires, et le menu substituer rale.

Tout d'abord, subs ne fera qu'une substitution telle quelle, par exemple,
T1^2-2*T1*T2+T2^2 ne sera pas remplace par DeltaT^2.

Je n'ai pas trop d'idees si vous ne souhaitez pas que votre expression soit developpee, sinon vous pouvez faire des restes: (si Q est une variable libre)

Ex
P:=m*Cp*(T1^2-2*T1*T2+T2^2)
a:=rem(P,Q-m*Cp,m)
b:=rem(a,DeltaT-T1+T2,T1)

si votre ideal des relations est plus complique, il faudra alors utiliser gbasis, puis faire des restes?

a+

Frederic

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

Message par parisse » lun. févr. 23, 2009 5:22 pm

Normalement subst sert à substituer un identificateur, pas une sous-expression (par ex. subst(P,m,Q/Cp)). On peut toutefois l'utiliser avec une sous-expression lorsqu'on est sur que cette sous-expression est bien une sous-expression propre de l'expression. C'est générallement le cas si la sous-expression a pour "sommet" un opérateur unaire (par exemple sin(x+1)/cos(theta1-theta2), etc).
On peut vérifier qu'une sous-expression est propre en se déplaçant avec les flèches de direction dans l'arbre représentant l'expression: ici en tapant P puis en sélectionnant tout à la souris, puis flèche vers le bas et flèche droite pour voir les sous-expressions propres de P. On voit ici que T1-T2 en est une, mais pas m*Cp, dans l'arbre représentant l'expression, l'opérateur * à 3 fils qui sont m, Cp et T1-T2.
En pratique, vous pouvez commencer par faire un solve pour isoler un des identificateurs en fonction des autres, puis utiliser subst sur cet identificateur. Ce qui donenrait ici res:=solve(m*Cp=Q,m) puis subst(P,m,res[0])

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

Message par parisse » lun. févr. 23, 2009 6:43 pm

P.S. à mon message précédent: utiliser solve est intéressant si on veut préserver la forme de l'expression, par contre la solution de Frédéric (rem ou gbasis) est indispensable ou nettement meilleure si solve échoue ou si solve renvoie un résultat trop compliqué (mais le résultat sera alors développé).

icare34
Messages : 2
Inscription : ven. févr. 20, 2009 2:20 pm
Localisation : Montpellier

Message par icare34 » lun. mars 02, 2009 1:11 pm

Bonjour,

Merci beaucoup pour tous ces conseils.

Par contre je n'ai pas très bien compris le rôle du 3me argument de la fonction rem : dans la documentation, on ne parle que de 2 arguments.

Finalement voila comment je pense procéder :

/* Équation de départ :
P:=m*Cp*(T1-T2)

/* On pose : Q=m*Cp :

res:=solve(m*Cp=Q,m)
P:=factor(subst(P,m,res[0]))

/* on continue les calculs formels
.....

/* Application numérique
m:=1
Cp:=2
T1:=20
T2:=10

/* Rappel des formules de simplification
Q:=m*Cp

/* Résultats:
Q
P

Est-ce que cette façon de faire vous paraît correcte ?

Cordialement

Didier R.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Message par frederic han » lun. mars 02, 2009 4:05 pm

Le troisieme argument dans rem sert a preciser la variable. ie on fait une division de polynome en une variable que l'on peut preciser dans le 3ieme argument. si on ne precise
rien, alors les expressions sont considerees comme des polynomes en x.



Pour l'evaluation numerique, je vous conseille plutot d'utiliser unapply pour creer une fonction a partir de vos symboles P et Q, ainsi, vous pourrez continuer vos calculs formel sans risques de melanges:

Ex:

AP:=unapply(P,m,Cp,T1,T2);
AP(1,2,20,10);

ou bien directement: unapply(P,m,Cp,T1,T2)(1,2,20,10)

Répondre