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 

Mise sous forme matricielle de 2 équations différentielles

 
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: 21 Oct 2010 10:36    Sujet du message: Mise sous forme matricielle de 2 équations différentielles Répondre en citant

Bonjour,

J'ai deux équations qui sont les suivantes :

Code:
eq_psi_li:=eval(subs(theta_e=Pi/2,psi_e=Pi/2,eq_psi_li));
  / d             \           / d  / d             \\                       
C |--- epsilon2(t)| Omega + A |--- |--- epsilon1(t)|| = -epsilon1(t) L g m[3]
  \ dt            /           \ dt \ dt            //                       
eq_theta_li:=eval(subs(theta_e=Pi/2,psi_e=Pi/2,eq_theta_li));
         / d             \     / d  / d             \\                       
-C Omega |--- epsilon1(t)| + A |--- |--- epsilon2(t)|| = -epsilon2(t) L g m[3]
         \ dt            /     \ dt \ dt            //                       


J'aimerais les mettre sous cette forme matricielle



Y a-t-il une fonction qui fait çà? ou sauriez vous les lignes de code à programmer pour obtenir cette forme?

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: 21 Oct 2010 15:52    Sujet du message: Répondre en citant

Bonjour,

La procédure suivante devrait faciliter votre travail.
Il faut entrer le système linéaire sous la forme signalée et la liste des variables en paramètre. A adapter pour un système 2*2 en enlevant certains termes.

Code:

> with(linalg):
 
> sys:={x1=a1*x+b1*y+c1*z+d1,x2=a2*x+b2*y+c2*z+d2,x3=a3*x+b3*y+c3*z+d3};

  sys := {x1 = a1 x + b1 y + c1 z + d1, x2 = a2 x + b2 y + c2 z + d2,

        x3 = a3 x + b3 y + c3 z + d3}

> extraire:=proc(sys,var)
> local n,k,l,M,B,X,Y;
> n:=nops(sys):
> M:=matrix(n,n): B:=matrix(n,1): X:=matrix(n,1): Y:=matrix(n,1):
> for k to n do
>   for l to n do
>      M[k,l]:=coeff(rhs(sys[k]),var[l])
>   od;
>   B[k,1]:=subs(seq(var[k]=0,k=1..n),rhs(sys[k])):
>   Y[k,1]:=lhs(sys[k]): X[k,1]:=var[k]
> od;
> evalm(Y)=evalm(M)&*evalm(X)+evalm(B);
> end proc:

> extraire(sys,[x,y,z]);
 

               [x1]   /[a1    b1    c1]    [x]\   [d1]
               [  ]   |[              ]    [ ]|   [  ]
               [x2] = |[a2    b2    c2] &* [y]| + [d2]
               [  ]   |[              ]    [ ]|   [  ]
               [x3]   \[a3    b3    c3]    [z]/   [d3]



A+
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: 01 Nov 2010 0:50    Sujet du message: Répondre en citant

Super merci pour ton aide.
J'ai pu bien avancé mais je n'arrive pas encore au résultat.
Si tu vois où est mon blocage, je suis preneur
Voici les lignes de codes que j'ai entrées

Code:
Mise sous forme matricielle du système
eq_psi_li_cla:=lhs(eq_psi_li)-rhs(eq_psi_li)=0;
  / d             \           / d  / d             \\                         
C |--- epsilon2(t)| Omega + A |--- |--- epsilon1(t)|| + epsilon1(t) L g m[3] =
  \ dt            /           \ dt \ dt            //                         

  0
eq_theta_li_cla:= lhs(eq_theta_li)-rhs(eq_theta_li)=0;
         / d             \     / d  / d             \\                         
-C Omega |--- epsilon1(t)| + A |--- |--- epsilon2(t)|| + epsilon2(t) L g m[3] =
         \ dt            /     \ dt \ dt            //                         

  0
sys := {eq_psi_li_cla, eq_theta_li_cla};
          /         / d             \     / d  / d             \\
         { -C Omega |--- epsilon1(t)| + A |--- |--- epsilon2(t)||
          \         \ dt            /     \ dt \ dt            //

                                          / d             \     
            + epsilon2(t) L g m[3] = 0, C |--- epsilon2(t)| Omega
                                          \ dt            /     

                / d  / d             \\                           \
            + A |--- |--- epsilon1(t)|| + epsilon1(t) L g m[3] = 0 }
                \ dt \ dt            //                           /
extraire:=proc(sys,var1,var2,var3)   
local n,k,l,M,C,K;   
n:=nops(sys):   
M:=matrix(n,n): C:=matrix(n,n): K:=matrix(n,n):
for k to n do
   for l to n do
   M[k,l]:=coeff(rhs(sys[k]),var1[l]):
   C[k,l]:=coeff(rhs(sys[k]),var2[l]):
   K[k,l]:=coeff(rhs(sys[k]),var3[l])
   od;
od;
evalm(M);
evalm(C);
evalm(K);
end proc:
extraire(sys, [diff(epsilon1(t), t, t), diff(epsilon2(t), t, t)],[diff(epsilon1(t), t),diff(epsilon2(t), t)],[epsilon1(t),epsilon2(t)]);


Merci d'avance pour ton aide

Ben
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: 01 Nov 2010 9:55    Sujet du message: Résolu Répondre en citant

Bonjour,
j'ai repris le même cheminement que dans ma procédure précédente, mais c'est un peu plus compliqué, avec des substitutions de façon à ce que le calcul des coefficients devant les dérivées devienne possible:

Code:

> sys:={ -C*Omega*diff(epsilon1(t),t)+A*diff(diff(epsilon2(t),t),t)+epsilon2(t)*L*g*m[3]=0, C*Omega*diff(epsilon2(t),t)+A*diff(diff(epsilon1(t),t),t)+epsilon1(t)*L*g*m[3]=0 };
>

                                        / 2             \
                   /d             \     |d              |
  sys := {-C Omega |-- epsilon1(t)| + A |--- epsilon2(t)|
                   \dt            /     |  2            |
                                        \dt             /

                                             /d             \
         + epsilon2(t) L g m[3] = 0, C Omega |-- epsilon2(t)|
                                             \dt            /

             / 2             \
             |d              |
         + A |--- epsilon1(t)| + epsilon1(t) L g m[3] = 0}
             |  2            |
             \dt             /

> extraire:=proc(sys)
>  local s,n,varx,vary,varz,k,l,Mx,My,Mz,X,Y,Z,B;
>  s:=convert(sys,D);
>  s:={subs(epsilon2(t)=z2,D(epsilon1)(t)=y1,`@@`(D,2)(epsilon2)(t)=x2,s[1]),subs(epsilon1(t)=z1,D(epsilon2)(t)=y2,`@@`(D,2)(epsilon1)(t)=x1,s[2])};
>  n:=nops(s): varx:=[x1,x2]: vary:=[y1,y2]: varz:=[z1,z2]:
>  Mx:=matrix(n,n): My:=matrix(n,n): Mz:=matrix(n,n):  X:=matrix(n,1): Y:=matrix(n,1): Z:=matrix(n,1): B:=matrix(n,1):
>   for k to n do
>     for l to n do
>        Mx[k,l]:=coeff(lhs(s[k]),varx[l]): My[k,l]:=coeff(lhs(s[k]),vary[l]): Mz[k,l]:=coeff(lhs(s[k]),varz[l]):
>     od;
>     B[k,1]:=0:
>     X[k,1]:=varx[k]: Y[k,1]:=vary[k]: Z[k,1]:=varz[k]:
>    od;
>    s:=evalm(Mx)&*evalm(X)+evalm(My)&*evalm(Y)+evalm(Mz)&*evalm(Z)=evalm(B);  subs(x1=diff(diff(epsilon1(t),t),t),y1=diff(epsilon1(t),t),z1=epsilon1(t),x2=diff(diff(epsilon2(t),t),t),y2=diff(epsilon2(t),t),z2=epsilon2(t),s)
> end proc:
>
> extraire(sys);
>

  /            [ 2             ]\
  |            [d              ]|
  |            [--- epsilon1(t)]|
  |            [  2            ]|
  |[0    A]    [dt             ]|
  |[      ] &* [               ]|
  |[A    0]    [ 2             ]|
  |            [d              ]|
  |            [--- epsilon2(t)]|
  |            [  2            ]|
  \            [dt             ]/

           /                         [d             ]\
           |                         [-- epsilon1(t)]|
           |[-C Omega       0   ]    [dt            ]|
         + |[                   ] &* [              ]|
           |[   0        C Omega]    [d             ]|
           |                         [-- epsilon2(t)]|
           \                         [dt            ]/

           /[   0        L g m[3]]    [epsilon1(t)]\   [0]
         + |[                    ] &* [           ]| = [ ]
           \[L g m[3]       0    ]    [epsilon2(t)]/   [0]



Ca fonctionne parfaitement maintenant.
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: 07 Aoû 2011 11:31    Sujet du message: Répondre en citant

Bonjour,

Je voudrais réutiliser une matrice qui a été utilisée dans cette procédure. Par contre, si je fais une ligne sortie de la procédure en faisant evalm(Mx), la matrice n'est pas évaluée.

Comment est-ce que je peux faire pour réutiliser les matrices formées dans cette procédure dans la suite d'un programme?

Je vous remercie 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: 07 Aoû 2011 19:08    Sujet du message: Répondre en citant

Bonjour,
J'ai mis les matrices en sortie dans une liste e qui donne le résultat de cette procédure. Ensuite, il suffit de faire e[k]; pour récupérer la k-ième matrice de cette liste.

Code:

> sys:={ -C*Omega*diff(epsilon1(t),t)+A*diff(diff(epsilon2(t),t),t)+epsilon2(t)*L*g*m[3]=0, C*Omega*diff(epsilon2(t),t)+A*diff(diff(epsilon1(t),t),t)+epsilon1(t)*L*g*m[3]=0 }; 
>

                                        / 2             \
                   /d             \     |d              |
  sys := {-C Omega |-- epsilon1(t)| + A |--- epsilon2(t)|
                   \dt            /     |  2            |
                                        \dt             /

                                             /d             \
         + epsilon2(t) L g m[3] = 0, C Omega |-- epsilon2(t)|
                                             \dt            /

             / 2             \
             |d              |
         + A |--- epsilon1(t)| + epsilon1(t) L g m[3] = 0}
             |  2            |
             \dt             /

> extraire:=proc(sys)
>   local s,n,varx,vary,varz,k,l,Mx,My,Mz,X,Y,Z,B;
>   s:=convert(sys,D);
>   s:={subs(epsilon2(t)=z2,D(epsilon1)(t)=y1,`@@`(D,2)(epsilon2)(t)=x2,s[1]),subs(epsilon1(t)=z1,D(epsilon2)(t)=y2,`@@`(D,2)(epsilon1)(t)=x1,s[2])};
>   n:=nops(s): varx:=[x1,x2]: vary:=[y1,y2]: varz:=[z1,z2]:
>   Mx:=matrix(n,n): My:=matrix(n,n): Mz:=matrix(n,n):  X:=matrix(n,1): Y:=matrix(n,1): Z:=matrix(n,1): B:=matrix(n,1):
>    for k to n do
>      for l to n do
>         Mx[k,l]:=coeff(lhs(s[k]),varx[l]): My[k,l]:=coeff(lhs(s[k]),vary[l]): Mz[k,l]:=coeff(lhs(s[k]),varz[l]):
>      od;
>      B[k,1]:=0:
>      X[k,1]:=varx[k]: Y[k,1]:=vary[k]: Z[k,1]:=varz[k]:
>     od;
>     s:=evalm(Mx)&*evalm(X)+evalm(My)&*evalm(Y)+evalm(Mz)&*evalm(Z)=evalm(B);  subs(x1=diff(diff(epsilon1(t),t),t),y1=diff(epsilon1(t),t),z1=epsilon1(t),x2=diff(diff(epsilon2(t),t),t),y2=diff(epsilon2(t),t),z2=epsilon2(t),s): print(s):
> [evalm(Mx),evalm(My),evalm(Mz)]
>  end proc:
>
> e:=extraire(sys):

  /[0    A]    [x1]\   /[-C Omega       0   ]    [y1]\
  |[      ] &* [  ]| + |[                   ] &* [  ]|
  \[A    0]    [x2]/   \[   0        C Omega]    [y2]/

           /[   0        L g m[3]]    [z1]\   [0]
         + |[                    ] &* [  ]| = [ ]
           \[L g m[3]       0    ]    [z2]/   [0]

> e[1];

                               [0    A]
                               [      ]
                               [A    0]

> e[2];

                        [-C Omega       0   ]
                        [                   ]
                        [   0        C Omega]

> e[3];

                        [   0        L g m[3]]
                        [                    ]
                        [L g m[3]       0    ]



Au revoir.
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: 10 Aoû 2011 12:57    Sujet du message: Répondre en citant

Bonjour,

Tout d'abord, un grand merci.
Sinon, j'ai encore deux petits soucis qui me sont apparus lors de l'application de la procédure sur un autre système.

1) Pour ma matrice M, les termes diagonaux n'ont pas été repris dans la matrice

2) Il semble que la dernière substitution ne fonctionne pas. C'est le cas aussi sur la dernière procédure que vous m'avez passé. Il manque peut-être à un bon endroit un ":".


Code:
sys := {eq_l1_li_cla, eq_l2_li_cla};
  /    / d  / d       \\   1     / d  / d       \\                         
 { m11 |--- |--- x1(t)|| + - m12 |--- |--- x2(t)|| - k x2(t) + k x1(t) = 0,
  \    \ dt \ dt      //   2     \ dt \ dt      //                         

       / d  / d       \\   1     / d  / d       \\                        \
   m22 |--- |--- x2(t)|| + - m12 |--- |--- x1(t)|| + k x2(t) - k x1(t) = 0 }
       \ dt \ dt      //   2     \ dt \ dt      //                        /
extraire:=proc(sys)
local s,n,varx,vary,varz,k,l,M,C,K,X,Y,Z,B;
s:=convert(sys,D);  #Permet de transformer l'écriture des différentielles avec une forme plus compacte avec des D
s:={subs(x2(t)=zz2,D(x1)(t)=yy1,`@@`(D,2)(x2)(t)=xx2,s[1]),subs(x1(t)=zz1,D(x2)(t)=yy2,`@@`(D,2)(x1)(t)=xx1,s[2])};
n:=nops(s): #Compte le nombre d'équations du système
varx:=[xx1,xx2]: vary:=[yy1,yy2]: varz:=[zz1,zz2]:
M:=matrix(n,n): C:=matrix(n,n): K:=matrix(n,n):  X:=matrix(n,1): Y:=matrix(n,1): Z:=matrix(n,1): B:=matrix(n,1):
for k to n do
      for l to n do
           M[k,l]:=coeff(lhs(s[k]),varx[l]): C[k,l]:=coeff(lhs(s[k]),vary[l]): K[k,l]:=coeff(lhs(s[k]),varz[l]):
      od;
 B[k,1]:=0:
X[k,1]:=varx[k]: Y[k,1]:=vary[k]: Z[k,1]:=varz[k]:
od;
s:=evalm(M)&*evalm(X)+evalm(C)&*evalm(Y)+evalm(K)&*evalm(Z)=evalm(B); 
subs(xx1=diff(diff(x1(t),t),t),yy1=diff(x1(t),t),zz1=x1(t),xx2=diff(diff(x2(t),t),t),yy2=diff(x2(t),t),zz2=x2(t),s):
print(s):[evalm(M),evalm(C),evalm(K)]
end proc:
extraire(sys);


Code:

 

                     () &* () + () &* () + () &* () = ()
                   



Code:
M:=e[1];
M := Matrix(2, 2, {(1, 1) = 0, (1, 2) = (1/2)*m12, (2, 1) = (1/2)*m12, (2, 2) = 0})
C:=e[2];

K:=e[3];



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: 10 Aoû 2011 14:51    Sujet du message: Répondre en citant

Bonjour,
Là je ne peux tester, car je n'ai pas MAPLE en vacances.
Ce ne serait pas du à l'emploi de Matrix avec un M majuscule, car avant vous utilisez matrix avec un m minuscule?
Celà ne fait pas appel aux mêmes packages, linalg pour les matrix et LinearAlgebra pour les Matrix.
A+
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: 10 Aoû 2011 18:24    Sujet du message: Répondre en citant

OK.
Pour mes termes manquants dans la matrice M, je viens de trouver. C'était mon premier subs qui était un peu court au niveau des changements de variables. Aussi, je ne changeais pas toutes les variables de mes équations différentielles.
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.