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 

Exportation d'équations Matlab dans Maple

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



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 29 Juil 2015 22:31    Sujet du message: Exportation d'équations Matlab dans Maple Répondre en citant

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



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 30 Juil 2015 7:58    Sujet du message: Répondre en citant

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



Inscrit le: 27 Fév 2009
Messages: 234

MessagePosté le: 30 Juil 2015 15:40    Sujet du message: Répondre en citant

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



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 31 Juil 2015 8:11    Sujet du message: Répondre en citant

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
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 -> Programmation 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.