 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 23 Fév 2016 12:25 Sujet du message: Simplification d'équations trigonométriques |
|
|
Bonjour,
J'aimerais simplifier cette équation trigonométrique :
Code: | eq_liaison:= x0(t)-sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))*xb[1]+sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))*zb[1]+sin(alpha0(t))*cos(beta0(t))*yb[1]+cos(alpha0(t))*sin(gamma0(t))*zb[1]+cos(alpha0(t))*cos(gamma0(t))*xb[1]+l2[1]*(sin(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))-cos(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))-sin(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(psi[1](t))*cos(alpha0(t))*sin(gamma0(t)))+l3[1]*(sin(theta[1](t))*sin(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))+sin(theta[1](t))*cos(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))+cos(theta[1](t))*sin(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))-cos(theta[1](t))*cos(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))+sin(theta[1](t))*sin(psi[1](t))*cos(alpha0(t))*sin(gamma0(t))-sin(theta[1](t))*cos(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(theta[1](t))*sin(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(theta[1](t))*cos(psi[1](t))*cos(alpha0(t))*sin(gamma0(t)))-xp[1](t) = 0 |
Ce que j'aimerais que Maple me fasse ce sont les regroupements du style :
cos(a)cos(b) - sin(a)sin(b)=cos(a+b)
Sur un cas plus simple (les deux équations ci-dessous), la fonction combine(expr,trig) marche bien
Code: | eq_liaison[1] := cos(gamma(t))*r+(cos(gamma(t))*cos(psi(t))-sin(gamma(t))*sin(psi(t)))*l-x(t) = 0
eq_liaison[2] := sin(gamma(t))*r+(sin(gamma(t))*cos(psi(t))+cos(gamma(t))*sin(psi(t)))*l = 0 |
Par contre, hormis les regroupements évidents, je ne veux pas que Maple aille trop loin dans sa simplification afin de garder un maximum de produits de termes.
Par contre, la fonction combine(expr,trig) va un peu trop loin sur la premiere equation donnée et je me retrouve uniquement avec des sommes de termes.
Est-ce que vous auriez des idées pour réaliser la simplification souhaitée ?
Merci d'avance pour votre aide. |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 25 Fév 2016 11:36 Sujet du message: |
|
|
Bonjour Benjamin,
Désolé pour le retard, je n'avais pas vu ton message.
J'ai essayé ceci:
collect(lhs(%),[xb[1],yb[1],zb[1]]);
sur l'expression de départ, mais après je ne vois pas trop apparaître les formules du style cos(a+b) que tu mentionnes.
Désolé, je ne vois pas autre chose pour l'instant, c'est censé s'arranger? |
|
Revenir en haut de page |
|
 |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 27 Fév 2016 23:46 Sujet du message: |
|
|
La fonction applyrule semble faire mon bonheur pour cette transformation. J'essaye maintenant d'automatiser une procédure pour pouvoir utiliser cette transformation trigonométrique plus facilement car j'en ai besoin assez souvent.
Code: | TrigoTransform := proc(Eq,T)
local S,S1,tt;
#Construit une liste à plat#
T:=subsindets([T], {set,list}, op);
#Changement de variables#
Eq:=subs([T], Eq);
#Transformations trigonométriques#
S:=indets(Eq);
S1:=indets(select(t->has(t, sin) or has(t, cos), S));
tt:=S minus S1;
Eq:=add(
applyrule([
cos(u::anything)*cos(v::anything)-sin(u::anything)*sin(v::anything)=cos(u+v),
cos(u::anything)*sin (v::anything)+sin(u::anything)*cos(v::anything)=sin(u+v),
sin(u::anything)*sin(v::anything)-cos(u::anything)*cos(v::anything)=-cos(u+v),
-sin(v::anything)*cos(u::anything)-sin(u::anything)*cos(v::anything)=-sin(u+v)], simplify(coeff(lhs(Eq),pp), size))*pp, pp=tt);
#Changement de variables#
Eq:=subs(map(t->rhs(t)=lhs(t),[T]), Eq);
end proc: |
1) Il y a pour le moment une erreur dans ma procédure que je n'arrive pas à retrouver. Est-ce que tu as une idée sur l'erreur ?
2) Un autre point est lié à la variable T qui contient les substitutions. Il doit être possible de créer directement les substitutions à réaliser à partir d'une fonction indets.
L'idée serait :
a) de sélectionner toutes les variables des équations du genre alpha0(t).
b) créer des subsitutions du genre alpha0(t)=alpha0_ mais avec à droite alpha0 (determiné automatiquement en enlevant (t) à la fin de alpha0(t) et en le remplaçant par un underscore "_".
Si tu as des idées sur ces points, je suis interessé.
Merci d'avance pour ton aide et à bientôt |
|
Revenir en haut de page |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 28 Fév 2016 7:56 Sujet du message: |
|
|
Bonjour,
Le paramètre formel T passé à la procédure est modifié par la première ligne de la procédure T:=subsindets([T], {set,list}, op); ce qui n'est pas acceptable sous Maple (error: illegal use of a formal parameter).
Solution: faire une copie de T dans U et travailler sur U.
U:=T: U:=subsindets([U], {set,list}, op);
Idem pour Eq. Je travaille avec Eq2.
Je rajoute t à S1, on ne retrouvera donc plus t dans tt.
S1:=indets(select(t->has(t, sin) or has(t, cos), S)) union {t};
Dans simplify(coeff(lhs(Eq),pp), size))*pp , la variable size n'est pas définie localement. Ca a l'air de passer quand même, non?
Code: |
> TrigoTransform := proc(Eq,T)
> local S,S1,tt,U,Eq2;
> #Construit une liste à plat#
> U:=T: U:=subsindets([U], {set,list}, op);
> #Changement de variables#
> Eq2:=Eq: Eq2:=subs([U], Eq2);
> #Transformations trigonométriques#
> S:=indets(Eq2);
> S1:=indets(select(t->has(t, sin) or has(t, cos), S)) union {t};
> tt:=S minus S1;
> Eq2:=add(
> applyrule([
> cos(u::anything)*cos(v::anything)-sin(u::anything)*sin(v::anything)=cos(u+v),
> cos(u::anything)*sin(v::anything)+sin(u::anything)*cos(v::anything)=sin(u+v),
> sin(u::anything)*sin(v::anything)-cos(u::anything)*cos(v::anything)=-cos(u+v),
> -sin(v::anything)*cos(u::anything)-sin(u::anything)*cos(v::anything)=-sin(u+v)], simplify(coeff(lhs(Eq2),pp)),size)*pp, pp=tt);
> #Changement de variables#
> Eq2:=subs(map(t->rhs(t)=lhs(t),[U]), Eq2);
> end proc:
>
> eq_liaison:= x0(t)-sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))*xb[1]+sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))*zb[1]+sin(alpha0(t))*cos(beta0(t))*yb[1]+cos(alpha0(t))*sin(gamma0(t))*zb[1]+cos(alpha0(t))*cos(gamma0(t))*xb[1]+l2[1]*(sin(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))-cos(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))-sin(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(psi[1](t))*cos(alpha0(t))*sin(gamma0(t)))+l3[1]*(sin(theta[1](t))*sin(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))+sin(theta[1](t))*cos(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))+cos(theta[1](t))*sin(psi[1](t))*sin(alpha0(t))*sin(gamma0(t))*sin(beta0(t))-cos(theta[1](t))*cos(psi[1](t))*sin(alpha0(t))*sin(beta0(t))*cos(gamma0(t))+sin(theta[1](t))*sin(psi[1](t))*cos(alpha0(t))*sin(gamma0(t))-sin(theta[1](t))*cos(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(theta[1](t))*sin(psi[1](t))*cos(alpha0(t))*cos(gamma0(t))-cos(theta[1](t))*cos(psi[1](t))*cos(alpha0(t))*sin(gamma0(t)))-xp[1](t)=0:
>
> T:=[alpha0(t)=alpha, beta0(t)=beta,psi[1](t)=psi, theta[1](t)=theta, gamma0(t)=gamma]:
> TrigoTransform(eq_liaison,T);
l2[1] (sin(psi[1](t)) sin(alpha0(t)) sin(gamma0(t)) sin(beta0(t))
- cos(psi[1](t)) sin(alpha0(t)) sin(beta0(t)) cos(gamma0(t))
- sin(psi[1](t)) cos(alpha0(t)) cos(gamma0(t))
- cos(psi[1](t)) cos(alpha0(t)) sin(gamma0(t))) + l3[1] (
%2 sin(psi[1](t)) sin(alpha0(t)) sin(beta0(t)) cos(gamma0(t))
+
%2 cos(psi[1](t)) sin(alpha0(t)) sin(gamma0(t)) sin(beta0(t))
+
%1 sin(psi[1](t)) sin(alpha0(t)) sin(gamma0(t)) sin(beta0(t))
-
%1 cos(psi[1](t)) sin(alpha0(t)) sin(beta0(t)) cos(gamma0(t))
+ %2 sin(psi[1](t)) cos(alpha0(t)) sin(gamma0(t))
- %2 cos(psi[1](t)) cos(alpha0(t)) cos(gamma0(t))
- %1 sin(psi[1](t)) cos(alpha0(t)) cos(gamma0(t))
- %1 cos(psi[1](t)) cos(alpha0(t)) sin(gamma0(t))) + (
-sin(alpha0(t)) sin(gamma0(t)) sin(beta0(t))
+ cos(alpha0(t)) cos(gamma0(t))) xb[1]
+ sin(alpha0(t)) cos(beta0(t)) yb[1] + (
sin(alpha0(t)) sin(beta0(t)) cos(gamma0(t))
+ cos(alpha0(t)) sin(gamma0(t))) zb[1] + x0(t) - xp[1](t)
%1 := cos(theta[1](t))
%2 := sin(theta[1](t))
|
J'ai un résultat, je ne sais pas si cela te convient?
@+ |
|
Revenir en haut de page |
|
 |
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 28 Fév 2016 22:28 Sujet du message: |
|
|
Super Alain !
Tes remarques m'ont été très utile. J'ai pu réalisé une procédure pour automatiser ces transformations trigonométriques.
Voici la procédure :
Code: | TrigoTransform:= proc(Eq)
local S,S1,tt,pp,Eq2,ListVariables,ListVariablesMod,Subs,size;
#Construit une liste à plat#
ListVariables:=indets(Eq, function(identical(t)));
ListVariables:=[op(ListVariables)];
ListVariablesMod:=map(f->cat(op(0,f),_),ListVariables);
Subs:=ListVariables=~ListVariablesMod;
#Changement de variables#
Eq2:=Eq:
Eq2:=subs(Subs, Eq2);
#Transformations trigonométriques#
S:=indets(Eq2);
S1:=indets(select(t->has(t, sin) or has(t, cos), S));
tt:=S minus S1;
Eq2:=add(
applyrule([
cos(u::anything)*cos(v::anything)-sin(u::anything)*sin(v::anything)=cos(u+v),
cos(u::anything)*sin (v::anything)+sin(u::anything)*cos(v::anything)=sin(u+v),
sin(u::anything)*sin(v::anything)-cos(u::anything)*cos(v::anything)=-cos(u+v),
-sin(v::anything)*cos(u::anything)-sin(u::anything)*cos(v::anything)=-sin(u+v)], simplify(coeff(lhs(Eq2),pp), size))*pp, pp=tt)=add(
applyrule([
cos(u::anything)*cos(v::anything)-sin(u::anything)*sin(v::anything)=cos(u+v),
cos(u::anything)*sin (v::anything)+sin(u::anything)*cos(v::anything)=sin(u+v),
sin(u::anything)*sin(v::anything)-cos(u::anything)*cos(v::anything)=-cos(u+v),
-sin(v::anything)*cos(u::anything)-sin(u::anything)*cos(v::anything)=-sin(u+v)], simplify(coeff(rhs(Eq2),pp), size))*pp, pp=tt);
#Changement de variables#
Eq2:=subs(map(t->rhs(t)=lhs(t),Subs),Eq2)
end proc:
|
Sinon, j'ai encore un petit soucis que je t'envoie par mail.
A bientôt |
|
Revenir en haut de page |
|
 |
|
|
Vous ne pouvez pas poster 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 voter dans les sondages de ce forum
|

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com
Apprendre Maple - ©
- Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.
|