|
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: 21 Oct 2010 10:36 Sujet du message: Mise sous forme matricielle de 2 équations différentielles |
|
|
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 |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 21 Oct 2010 15:52 Sujet du message: |
|
|
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 |
|
|
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 01 Nov 2010 0:50 Sujet du message: |
|
|
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 |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 01 Nov 2010 9:55 Sujet du message: Résolu |
|
|
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 |
|
|
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 07 Aoû 2011 11:31 Sujet du message: |
|
|
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 |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 07 Aoû 2011 19:08 Sujet du message: |
|
|
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 |
|
|
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 10 Aoû 2011 12:57 Sujet du message: |
|
|
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 |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 10 Aoû 2011 14:51 Sujet du message: |
|
|
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 |
|
|
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 10 Aoû 2011 18:24 Sujet du message: |
|
|
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 |
|
|
|
|
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.
|