Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Simplification d'équations trigonométriques

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en analyse
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 23 Fév 2016 12:25    Sujet du message: Simplification d'équations trigonométriques Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 25 Fév 2016 11:36    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 27 Fév 2016 23:46    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 28 Fév 2016 7:56    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
bendesarts



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 28 Fév 2016 22:28    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en analyse Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
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


phpBB

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.