IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Simulink Discussion :

Implementation d'un script Matlab (Neural Network) en Simulink


Sujet :

Simulink

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut Implementation d'un script Matlab (Neural Network) en Simulink
    Bonjour,

    J'aimerais implémenter dans Simulink un controlleur par réseaux de neurones (neural networks - NN) pour un système physique.
    Le réseau de neurones (NN) est modélisé dans ce fichier Simulink par le bloc "MATLAB function". Le NN doit échanger des input et output à chaque pas de calcul avec le système physique (1ere figure).
    Nom : Capture.PNG
Affichages : 2053
Taille : 16,1 Ko

    Par contre, en lançant la simulation, les erreurs affichées concernent l'utilisation de la fonction "logsig" contenue dans mon script (cf. 2eme figure)
    Nom : Capture1.PNG
Affichages : 1878
Taille : 24,5 Ko

    Auriez-vous une idée pour m'aider afin que je puisse utiliser ma fonction NN codée en Matlab dans Simulink, sans devoir la convertir en schéma blocs?

    Je vous remercie grandement pour votre expertise!!!!

    Bien cordialement,
    SCIEBOU

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Une solution consiste à utiliser l'instruction CODER.EXTRINSIC pour déclarer ta fonction.

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour Duf,

    Merci pour ta réponse!

    Juste après la définition de la fonction dans le script (function output = f(input)). J'ai mis:
    coder.extrinsic('save')
    coder.extrinsic('load')

    En fait, je veux enregistrer les paramètres calculés au pas de temps t par le script Matlab, pour les utiliser au pas de temps t+1. Ainsi, je fais les étapes suivantes:

    Au pas de temps t:
    save parameters.mat wo w1 momentum0 momentum1

    Au pas de temps t+1:
    load parameters.mat

    Ce code n'a pas fonctionné proprement. J'ai reçu des messages d'erreurs comme quoi certains variables ne sont pas définies:

    Nom : Capture.PNG
Affichages : 1639
Taille : 18,7 Ko

    Est ce que mon utilisation de coder.extrinsic a été appropriée?

    Auriez-vous des conseils pour que je puisse mettre en oeuvre mon idée, c-a-d enregistrer pour mettre à côté les paramètres calculés au pas de temps t, pour les appeler au pas de temps t+1?

    Une idée que j'ai: est ce qu'il est possible de laisser le workspace de calcul du script Matlab ouvert pendant la simulation Simulink? Ceci permettrait d'éviter de faire une sauvegarde et chargement de données à chaque pas de temps!


    Merci d'avance pour votre aide.

    SCIEBOU

  4. #4
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    je pense pas qu'utiliser load et save soit une bonne idée dans un bloc emmbedded
    si tu veux pouvoir réutiliser les valeurs de variables au cycle précédent t-1, je préconiserais plutot de faire sortir ces variables (dans un seul signal, avec un mux ou un bus) que fait re rentrer dans ton bloc en le retardant (memory ou 1/z)
    sinon tu peux aussi utiliser des variables"persistant"

    Une idée que j'ai: est ce qu'il est possible de laisser le workspace de calcul du script Matlab ouvert pendant la simulation Simulink? Ceci permettrait d'éviter de faire une sauvegarde et chargement de données à chaque pas de temps!
    là je ne te suis pas :
    si ta simulation est appelée depuis un script alors elle partage le même workspace que script, à savoir le workspace de base
    sinon si elle est appelée depuis une fonction, tu peux lancer ta simulation avec l'option 'SrcWorkspace ' à 'current'

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Merci Fab. Tes conseils me sont très utiles.
    Voici mon retour par rapport à tes remarques.

    je pense pas qu'utiliser load et save soit une bonne idée dans un bloc emmbedded
    OK

    si tu veux pouvoir réutiliser les valeurs de variables au cycle précédent t-1, je préconiserais plutot de faire sortir ces variables (dans un seul signal, avec un mux ou un bus) que fait re rentrer dans ton bloc en le retardant (memory ou 1/z)
    OK. J'ai donc essayé ce process. Par contre, j'ai un soucis au niveau de deux sorties w1 et momentum1 du bloc Matlab Function. Ce sont les sorties de dimension matricielle (3x2) qui ne sont pas reconnues. Les sorties wo et momentum0 de dimension (1x4) ont l'air de marcher. Comment peut-on faire pour que toutes mes sorties matricielles soient reconnues ?. Je te joins une impression écran de la structure du simulink et le message d'erreur associé.

    Nom : Forum_17_10_2015_load_save.GIF
Affichages : 1746
Taille : 20,2 Ko

    Nom : Forum_17_10_2015_load_save_2.GIF
Affichages : 1564
Taille : 54,9 Ko

    sinon tu peux aussi utiliser des variables"persistant"
    Intéressant. Par contre, je ne connais cette notion de variables "persistantes". Peux-tu me donner plus d'indication sur ces variables "persistantes" ?

    là je ne te suis pas :
    si ta simulation est appelée depuis un script alors elle partage le même workspace que script, à savoir le workspace de base
    sinon si elle est appelée depuis une fonction, tu peux lancer ta simulation avec l'option 'SrcWorkspace ' à 'current'
    Mon script Matlab est appelée au cours de la simulation de mon modèle Simulink. En d'autres termes, je cherche à réaliser une optimisation "online", c'est-à-dire que je lance mon simulink et c'est au cours de la simulation du modèle Simulink que je fais appel à un script matlab pour faire mon optimisation Neural Network. Cet appel de fonction est réalisé à l'aide d'une "Matlab Function".

    Je te remercie d'avance pour tes conseils.

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    je pense que cela vient de la fonction à l’intérieur de l'embedded
    es tu sur que dans tous les cas w1 et momentum1 sont bien définies, et surtout bien définies à la même dimension ?
    tu peux également via le model explorer aller forcer la dimension de ces sorties : cependant cela ne fera probablement que déplacer l'erreur

    tu peux joindre ton code ou une version simplifiée de celui ci le cas échéant

    sinon les variables persitant sont des variables qui continue d'exister et gardent leur valeur entre deux appels d'une fonction

    enfin j'avais compris que tu voulais lancer simulink depuis un scritp et non que tu voulais lancer un script depuis simulink
    du coup ce script aura accès au workspace local de la fonction embedded : il faut t'arranger pour y rapatrier (entrées ou paramètres) toutes les données dont le script a besoin

    Fabien

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour Fabien,

    Je te remercie pour ton aide.

    1) à propos de la dimension des signaux

    es tu sur que dans tous les cas w1 et momentum1 sont bien définies, et surtout bien définies à la même dimension ?
    J'ai vérifié et il me semble qu'il n'y a pas d'erreur de dimensions.

    2) à propos du code

    tu peux joindre ton code ou une version simplifiée de celui ci le cas échéant
    J'ai mis mon code en pièce jointe.

    test_NN_controller_5_forum.zip

    3) à propos des paramètres ou entrées nécessaires pour le script

    rapatrier (entrées ou paramètres) toutes les données dont le script a besoin
    Il me semble que le script a toutes les infos requises car les variables du script sont les entrées du bloc sous-système "Matlab function".

    Est-ce que tu peux regarder le script et me dire si tu as des idées ?

    Merci d'avance pour ton aide.

  8. #8
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    j'ai regarder en diagonale
    je vois que tu fait des concaténation de tableau ...

    il te faut pré allouer les espaces mémoires de toutes tes variables de manière à ce que Simulink n'ai pas de doute quand aux tailles des tableaux
    matlab coder n'aime pas trop nom plus les sorties de type tableau dont la taille varie

    pour pré allouer tu peux utiliser des fonctions comme zeros, ones, nan ...

  9. #9
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    sinon plutôt que d'utiliser un bloc "matlab function" tu peux essayer un bloc "interpreted matlab function" qui est moins limité de ce coté
    (car il ne sert pas à générer du code)

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Merci pour ton retour.

    1) J'ai essayé de mettre en oeuvre ton conseil sur la concaténation d'un vecteur. J'ai pré-alloué la mémoire pour les vecteurs qui seront le résultat de la concaténation. Dans le programme, il s'agit des vecteurs A, B, C, et D qui sont pré-alloués.

    Par contre, le problème persiste à savoir je n'arrive toujours pas à obtenir une simulation. En plus, lors de la définition de la préallôcation, j'ai ce warning de Matlab qui a l'air à dire que cette préallôcation n'est pas utile:
    Nom : 25-11-2015.png
Affichages : 1300
Taille : 10,0 Ko

    Je te joins également le programme: test_NN_controller_5_forum_v2.zip

    2) Concernant l'utilisation de "Interpreted MAtTLAB Fcn", il me semble qu'on ne peut utiliser que des fonctions de Matlab simple mais pas un script Matlab. Or j'aimerais utiliser un script Matlab pour la partie Optimisation.

    Je suis bien sûr intéressé si tu as d'autres idées.

  11. #11
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par SCIEBOU Voir le message
    2) Concernant l'utilisation de "Interpreted MAtTLAB Fcn", il me semble qu'on ne peut utiliser que des fonctions de Matlab simple mais pas un script Matlab. Or j'aimerais utiliser un script Matlab pour la partie Optimisation.
    tu peux utiliser des fonctions que tu écris toi même ... mais pas des scripts
    c'est plus souple d'utilisation (car pas compilé)

Discussions similaires

  1. Application d'un script matlab dans un bloc simulink
    Par didilegeek dans le forum Simulink
    Réponses: 9
    Dernier message: 13/07/2012, 14h19
  2. comment utiliser un script MATLAB dans un bloc Simulink
    Par Tchoffo dans le forum Simulink
    Réponses: 1
    Dernier message: 12/05/2012, 16h03
  3. Réponses: 1
    Dernier message: 29/06/2010, 14h23
  4. Script Matlab sous Latex
    Par Tatouille31 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 25/07/2007, 17h07
  5. [Neural Network] comment utiliser nntool ?
    Par sandy07 dans le forum MATLAB
    Réponses: 1
    Dernier message: 17/04/2007, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo