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 :

Changer le fixed step pendant la simulation


Sujet :

Simulink

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Changer le fixed step pendant la simulation
    Bonjour,

    Je dois simuler un système assez complexe et certains blocs utilisés m'obligent à prendre un très petit fixed step. Dans ce système, je m'intéresse au régime établi, ce qui implique que toute la phase transitoire ne m'interresse pas, et pourtant c'est elle qui prend le temps le plus long dans la simulation.

    J'ai trouvé une astuce à l'aide de switchs pour ne pas avoir à utiliser les blocs qui m'imposent un petit fixed step lors d'u régime transitoire, je peux dès lors augmenter le fixed step pendant cette période (j'ai essayé et ça marche, mais dès qu'on arrive en régime établi, le fixed step étant trop gros, matlab me sort une erreur).

    Ma question est la suivante:

    Y-a-t'il un moyen ou une astuce pour lancer une simulation ayant dans un premeir temps le gros fixed step, puis dépassé un temps transitoire T, continuer la même simulation mais avec un fixed step plus faible?

    PS: J'ai essayé de travailler avec le variable step mais pour une raison que je ne comprends pas, la simulation donne des résultats totalement aberrant.

    Merci beaucoup pour votre aide

  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,

    Dans ton cas la meilleure solution serait d'utiliser un pas variable
    As-tu testé avec plusieurs solveurs en pas variable? Habituellement les solveurs à pas variables donnent des résultats plus précis que les solveurs à pas fixe, ils sont donc conseillés, il serait donc intéressant de comprendre d'où viennent tes résultats aberrant car ca pourrait être lié à un problème de ton modèle

    Sinon ne pourrais-tu pas découper ta simulation en 2: tu effectues une première simulation pour ta partie transitoire puis tu sauvegardes les états de ton système et tu relances la partie permanente (avec les valeurs des états sauvegardés au préalable).

    Duf
    Simulink & Embedded Coder

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

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci Duf pour ta réponse rapide!

    Ben en lançant une simulation à fixed step sur une courte durée la simulation prend déjà 15 min à se faire, mais les résultats sont ceux attendu (on voit nettement les commutations et les effets CEm que j'étudie).

    Avec le variable step, et avec tous les solvers (je les ai tous testés ) je ne comprends pas pourquoi mais j'obtiens quelque chose qui ressemble de près ou de loin à du bruit blanc.

    Par contre la deuxième option que tu proposes m'intéresse beaucoup! je n'ai absolument aucune idée de comment enregistrer les états de mon système. Peux-tu me guider?

  4. #4
    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
    Pour la deuxième option, l'enregistrement des états de ton système est très facile puisqu'il te suffit de cocher la case Final states dans l'onglet Data import/export de la fenêtre de configuration (Ctrl+E). Ainsi tu récupèreras toutes les valeurs de tes états dans une variable (par défaut elle s'appelle xFinal).

    La difficulté c'est qu'il faut identifier les blocs qui définissent ces états, en général c'est les intégrateurs. Pour plus de lisibilité de tes états (dans xFinal) tu peux définir un nom pour chaque état dans l'intégrateur.

    Une fois que tout ca est fait, il te "suffit" de définir l'état initial de chacun de tes intégrateur comme un paramètre correspondant au résultat sauvé dans xFinal.



    Pour revenir sur le problème du solveur à pas variable, quelle la longueur des pas qu'il prend par rapport à ton pas en pas fixe? Le problème vient peut-être du fait que le modèle est "instable" et que le solveur à pas variable en affinant le pas rend le résultat instable ce que le solveur à pas fixe ne voit pas...
    Simulink & Embedded Coder

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

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Pour revenir sur le problème du solveur à pas variable, quelle la longueur des pas qu'il prend par rapport à ton pas en pas fixe? Le problème vient peut-être du fait que le modèle est "instable" et que le solveur à pas variable en affinant le pas rend le résultat instable ce que le solveur à pas fixe ne voit pas...
    J'y ai pensé donc j'ai mis un step mini dans variable step égal au fixed step que j'ai utilisé pour faire ma simulation mais le résultat est le même, j'ai quelque chose de très moche (on distingue les commutations mais les amplitudes de celles-ci font n'importe quoi) alors qu'avec le fixed step j'ai de belles commutations, toutes de la même amplitude et avec les effets parasites que je veux étudier (si tu veux je peux te montrer des printscreens).

    Pour la méthode que tu m'as donné, j'essaierai demain. je te tiens au courant!

    Merci encore.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour Duf,

    Ta solution marche très bien et je t'en remercie!

    D'ailleurs (j'y ai pensé en le faisant!) j'ai besoin du fixed step pour calculer mes transformées de fourier, le variable step donnant des TF faussées

    Mais imposible d'avoir une simulation correcte avec le variable step. Etrange étrange^^

  7. #7
    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
    C'est cool si ca marche comme ca

    Par contre si tu as le temps, prends quelques minutes (heures? jours?) pour investiguer ce problème de variable-step. D'expérience, il arrive régulièrement que ca cache un problème dans ton modèle...
    Simulink & Embedded Coder

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

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Bonjour,

    Sinon ne pourrais-tu pas découper ta simulation en 2: tu effectues une première simulation pour ta partie transitoire puis tu sauvegardes les états de ton système et tu relances la partie permanente (avec les valeurs des états sauvegardés au préalable).

    Duf
    Bonjour,

    J'ai exactement le même problème que Toukran. J'essaie donc de découper la simulation en 2. Une première simulation pour la partie transitoire avec un pas de temps petit FixedStep=0.001, et je sauvegarde l'état avec xFinal. Je lance ma deuxième simulation (les valeurs des états sauvegardés au préalable dans xFinal) avec FixedStep=1.0. Mais ça ne marche pas voici le message erreur que j'ai obtenu:

    Simulink cannot load the initial SimState because the model, 'test_sample_times', was changed after the SimState was saved. Run the simulation again and resave the SimState.

    Il me semble que si on utilise l'option "Initial State = xFinal", alors Simulink ne veut pas que on change FixedStep.

    To Toukran: J'aimerai savoir comment vous avez fait pour résoudre le problème. Est-ce que vous avez re-initialisé état de votre système à la main (sans utiliser option "initial state = xFinal") et relancé la simulation ? je cherche à éviter ça, car j'ai un système assez compliqué avec un block stateflow, difficile de re-initialiser tous les états...

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour Raymond,

    Personnellement j'ai créé un deuxième fichier simulink où j'ai copié collé mon système.

    Ensuite dans mon premier fichier j'ai mis mon fixed step initial et j'ai demandé d'enregistrer l'état final danss la variable xFinal.

    Enfin dans mon deuxième fichier j'ai mis le deuxième fixed step et j'ai demandé de prendre comme valeur initiale xFinal.

    Et tout a marché parfaitement

    J'espère t'avoir aidé.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Toukran Voir le message
    Bonjour Raymond,

    Personnellement j'ai créé un deuxième fichier simulink où j'ai copié collé mon système.

    Ensuite dans mon premier fichier j'ai mis mon fixed step initial et j'ai demandé d'enregistrer l'état final danss la variable xFinal.

    Enfin dans mon deuxième fichier j'ai mis le deuxième fixed step et j'ai demandé de prendre comme valeur initiale xFinal.

    Et tout a marché parfaitement

    J'espère t'avoir aidé.
    Merci beaucoup pour votre réponse. J'ai essayé avec votre méthode, ça n'a pas marché. Pour illustrer votre méthode et pour faciliter l'explication : voici les deux fichiers que j'ai crée :

    1. constantFixedSize0p01.mdl : Fixed Size =0.01 Stop Time=10, il enregistre l'état final dans xFinal,
    2. constantFixedSize0p1.mdl : Fixed Size = 0.1 Stop Time=20, il prend la valeur initial xFinal.

    Mais, ça ne marche pas, toujours la même erreur, par contre si on remet Fixed Size=0.01, il passe sans problème.

    Est-ce que j'ai bien compris votre approche ? Comment je dois faire pour que entre 10 et 20, il simule avec un pas de temps Fixed Size =0.1 (10 fois plus grand que 0.01) ?
    Fichiers attachés Fichiers attachés

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Et en utilisant des function call? En bidouillant avec un compteur et un switch tu peut peut être trigger ton système avec un raster qui changera à un moment donné. A tester.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par balours Voir le message
    Et en utilisant des function call? En bidouillant avec un compteur et un switch tu peut peut être trigger ton système avec un raster qui changera à un moment donné. A tester.
    Merci pour votre réponse.

    Dans la période transitoire, je dois fixer un pas de temps Fixed Size=0.01, et Stop Time 6000, mais pendant la période stationnaire, le Stop Time est de 876000, un pas de temps 0.01 est trop fin et pas nécessaire (Fixed Size=10 suffit). J'ai essayé de trigger 1 fois tous les 1000 pas de temps, mais la simulation reste terriblement lente. Vous pouvez tester avec un modèle simple, un Fixed Size = 0.01 sur une période 876000, trigger ou pas, le temps d'exécution explose.

    C'est pour ça je pense que "couper le modèle en deux fichiers" est une solution intéressante pour moi.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Raymond33 Voir le message
    Merci beaucoup pour votre réponse. J'ai essayé avec votre méthode, ça n'a pas marché. Pour illustrer votre méthode et pour faciliter l'explication : voici les deux fichiers que j'ai crée :

    1. constantFixedSize0p01.mdl : Fixed Size =0.01 Stop Time=10, il enregistre l'état final dans xFinal,
    2. constantFixedSize0p1.mdl : Fixed Size = 0.1 Stop Time=20, il prend la valeur initial xFinal.

    Mais, ça ne marche pas, toujours la même erreur, par contre si on remet Fixed Size=0.01, il passe sans problème.

    Est-ce que j'ai bien compris votre approche ? Comment je dois faire pour que entre 10 et 20, il simule avec un pas de temps Fixed Size =0.1 (10 fois plus grand que 0.01) ?
    Désolé Raymond, mais moi j'ai fait exactement ce que tu viens d'écrire et je n'ai eu aucun problème.

    Enfin, dans mon cas j'utilise un variable step pour le régime transitoire (pour aller plus vite) et un fixed step assez petit pour mon régime permanent. je ne sais pas si c'est pourquoi je n'ai pas eu l'erreur dont tu parles :s

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Toukran Voir le message
    Désolé Raymond, mais moi j'ai fait exactement ce que tu viens d'écrire et je n'ai eu aucun problème.

    Enfin, dans mon cas j'utilise un variable step pour le régime transitoire (pour aller plus vite) et un fixed step assez petit pour mon régime permanent. je ne sais pas si c'est pourquoi je n'ai pas eu l'erreur dont tu parles :s
    Si j'ai bien compris, dans ton régime transitoire tu as utilisé l'option "variable- step" et dans le régime permanent (qui charge la variable xFinal) tu as utilisé Fixed Size assez petit. Peux tu telecharger mon fichier attaché dans le message #10 et exécuter sur ta machine ? J'espère ce n'est pas un problème de version. Par ailleurs, en lisant le Help de "SimState" je vois une limitation suivante :

    - You cannot make any structural changes to the model between the time at which you save the SimState and the time at which you restore the simulation using the SimState. For example, you cannot add or remove a block after saving the SimState without repeating the simulation and saving the new SimState.

    Je me dit peut être le fait de changer Fixed Size à 0.1 est considéré comme un "structural changes", interdit pour "SimState".

    En tout cas, merci beaucoup pour votre aide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/11/2013, 11h23
  2. Convertir un modèle de variable step vers fixed step
    Par espoir1976 dans le forum Simulink
    Réponses: 9
    Dernier message: 28/12/2012, 00h57
  3. Variable ou fixed step
    Par espoir1976 dans le forum Simulink
    Réponses: 4
    Dernier message: 02/06/2010, 08h23
  4. [Débutant] Changer curseur de souris pendant téléchargement
    Par Xavier78000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/01/2006, 13h32

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