|
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: 29 Juil 2015 22:31 Sujet du message: Exportation d'équations Matlab dans Maple |
|
|
Bonjour
Contexte :
Je récupère d'un logiciel de simulation des équations algébriques et différentielles dans un fichier Matlab.
Afin de pouvoir modifier la notation de variables de mes équations et réaliser des manipulations symboliques d'expressions en vue de simplification, j'aimerais passer ces équations dans Maple.
Pour ce faire, lorsque les équations sont scalaires, j'ai pu m'en sortir à l'aide du code suivant :
Code: | restart;
MatlabScript:= "C_p_e = C_state/C_c;
C_p_f = I_state/I_i;
R_p_e = R_r*C_p_f;
I_p_e = (Se_p_e-R_p_e)-C_p_e;";
eq:= parse~(StringTools:-Split(MatlabScript, ";"));
eq_a:= subs(
C_p_e=fs(t), C_p_f=v(t), R_p_e=fd(t), I_p_e=fm(t), C_c=1/k, I_i=m,
R_r=c, Se_p_e=fe(t), I_state=int(fm(t),t), C_state=int(v(t),t),
eq); |
Ce code m'a permis d'obtenir la liste de mes équations pour lesquelles j'ai pu réaliser des substitutions.
Problème
Par contre, lorsque j'ai des "équations" provenant de Matlab sont des équations vectorielles, mon code ne fonctionne plus car la notation ";" est utilisé pour la construction des matrices en Matlab. Ainsi, je ne peut plus utilisé le délimiteur ";" avec la fonction StringTools:-Split.
Exemple d'équation vectorielle que je n'arrive pas à transformer :
Code: | Barre_1_Euler_epsilon_B = [u_1*u_2,u_3,0;-u_1*u_3,u_2,0;sin(Barre_1_Euler_epsilon_beta),0,1] |
Pour ce faire, une voie possible est d'utiliser la bibliothèque FromMatlab qui permet d'interpréter/ convertir directement des équations Matlab en Maple.
Voici un exemple du code :
Code: | restart;
with(Matlab);
FromMatlab("Barre_1_Euler_epsilon_beta = Barre_1_Euler_epsilon_eps(2,1);
Barre_1_Euler_epsilon_gamma = Barre_1_Euler_epsilon_eps(3,1);
u_1 = cos(Barre_1_Euler_epsilon_beta);
u_2 = cos(Barre_1_Euler_epsilon_gamma);
u_3 = sin(Barre_1_Euler_epsilon_gamma);
Barre_1_Euler_epsilon_B = [u_1*u_2,u_3,0;-u_1*u_3,u_2,0;sin(Barre_1_Euler_epsilon_beta),0,1];",string);
"Barre_1_Euler_epsilon_beta := Barre_1_Euler_epsilon_eps(2, 1);
Barre_1_Euler_epsilon_gamma := Barre_1_Euler_epsilon_eps(3, 1);
u_1 := map[evalhf](cos,Barre_1_Euler_epsilon_beta);
u_2 := map[evalhf](cos,Barre_1_Euler_epsilon_gamma);
u_3 := map[evalhf](sin,Barre_1_Euler_epsilon_gamma);
Barre_1_Euler_epsilon_B := Matrix([<u_1 . u_2 | u_3 | 0>,
<-u_1 . u_3 | u_2 | 0>, <map[evalhf](sin,Barre_1_Euler_epsilo\
n_beta) | 0 | 1>], scan=columns );" |
Le point positif est que les vecteurs Matlab sont bien interprétés et transformés en vecteur Maple.
Par contre, le signe "=" de Matlab signifie une affectation aussi, il est transformé donc transformé en ":=" dans Maple.
Je n'arrive alors plus à me constituer une liste d'équations dans Maple.
Question:
Est-ce que vous auriez des idées afin que je puisse transformer des affectations vectorielles de Matlab (car il n'y en fait pas d'équations dans Matlab mais des affectations) en équations dans Maple?
Je pense qu'avec l'utilisation de la bibliothèque FromMatlab, je ne devrais pas être loin du résultat souhaité.
J'espère avoir été suffisamment clair même si mon poste n'est pas très synthétique.
Merci d'avance pour votre aide.
[/u] |
|
Revenir en haut de page |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 30 Juil 2015 7:58 Sujet du message: |
|
|
Bonjour,
en rajoutant ces lignes, j'obtiens l'expression sans := dans st
Code: |
s:=%: st:="":
> for k to length(s) do
> if s[k]<>":" then st:=cat(st,s[k]) fi od:
> st;
"Barre_1_Euler_epsilon_beta = Barre_1_Euler_epsilon_eps(2, 1);
Barre_1_Euler_epsilon_gamma = Barre_1_Euler_epsilon_eps(3,\
1);
u_1 = map[evalhf](cos,Barre_1_Euler_epsilon_beta);
u_2 = map[evalhf](cos,Barre_1_Euler_epsilon_gamma);
u_3 = map[evalhf](sin,Barre_1_Euler_epsilon_gamma);
Barre_1_Euler_epsilon_B = Matrix([<u_1 . u_2 | u_3 | 0>, <\
-u_1 . u_3 | u_2 | 0>, <map[evalhf](sin,Barre_1_Euler_epsi\
lon_beta) | 0 | 1>], scan=columns );"
|
A bientôt. |
|
Revenir en haut de page |
|
|
bendesarts
Inscrit le: 27 Fév 2009 Messages: 234
|
Posté le: 30 Juil 2015 15:40 Sujet du message: |
|
|
Merci. Tu réponds parfaitement à mon soucis.
Le programme fonctionne maintenant parfaitement pour une équation vectorielle.
Par contre, j'ai également à traduire quelque opération matricielle. Il faut donc encore enrichir le code afin de pouvoir faire cette traduction.
Code: | restart;
with(Matlab);
Barre_1_Inertia_inertia:=Matrix(3,3, symbol=i);
map(assume, Barre_1_Inertia_inertia, real):
MST1:=FromMatlab("Barre_1_Euler_epsilon_beta = Barre_1_Euler_epsilon_eps(2,1);
Barre_1_Euler_epsilon_gamma = Barre_1_Euler_epsilon_eps(3,1);
u_1 = cos(Barre_1_Euler_epsilon_beta);
u_2 = cos(Barre_1_Euler_epsilon_gamma);
u_3 = sin(Barre_1_Euler_epsilon_gamma);
Barre_1_Euler_epsilon_B = [u_1*u_2,u_3,0;-u_1*u_3,u_2,0;sin(Barre_1_Euler_epsilon_beta),0,1];
Barre_1_Inertia_p_f = inv(Barre_1_Inertia_inertia)*Barre_1_Inertia_state;
",string);
MST2:="":
for k to length(MST1) do
if MST1[k]<>":" then MST2:=cat(MST2,MST1[k]) fi od:
MST2;
eq:= parse~(StringTools:-Split(MST2, ";")); |
Dans le code ci-dessus, j'ai rajouté une ligne de plus qui fait apparaitre le produit de l'inverse d'une matrice par un vecteur.
La traduction de l'inverse d'une matrice à l'aide de la fonction FromMatlab est bien réalisée mais elle fait apparaitre différents cas suivant la nature des termes qui composent la matrice et qui bloquent le code.
J'ai essayé de définir directement la matrice (qui pose problème) positivement pour que le résultat du FromMatlab soit simplifié.
Cependant, la commande FromMatlab avec l'option string fait que les opérations ne sont pas simplifiées.
As-tu une idée pour gérer ce cas de figure où je rencontre une équation vectorielle dont certains termes sont des produits matriciels et qui fait intervenir des inverses de matrices ?
Note:
Après, je pense qu'il n'y a pas d'autres nouveaux élements qui devraient apparaître car il s'agit d'équations avec une forme bien générique que je rencontre dans le contexte de mécanique des solides rigides.
Merci pour ton aide. |
|
Revenir en haut de page |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 31 Juil 2015 8:11 Sujet du message: |
|
|
Bonjour,
Je ne vois pas trop comment procéder ici (déjà il n'y a pas de ~ après parse).
parse agit sur une chaine de caractères (string). |
|
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.
|