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

MATLAB Discussion :

[ode45] Le calcul ne s'arrête pas tout de suite quand l'event est signalé


Sujet :

MATLAB

  1. #1
    Invité
    Invité(e)
    Par défaut [ode45] Le calcul ne s'arrête pas tout de suite quand l'event est signalé
    Salut à tous,


    Voilà je dispose de deux bouts de code :
    Le fichier question2.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function question2(t,ci_init)
    options=odeset('Events',@equilibrium);
    [t,y] = ode45(@odefunction,t, ci_init,options) ;
    plot(t,y(:,1),'r-',t,y(:,2)/1000,'b-.',t,y(:,3)/1000,'g-.',t,y(:,4),'m--',t,y(:,5),'c--') ;
    legend('T', 'Ca', 'Cs', 'Wa', 'Ws') ;
    Xlabel('temps (annees)') ;
    ylabel('T (°C)   Ca (Gt)   Cs (Gt)    Wa (g/cm^2)    Ws (g/cm^2)');
    title('Etude du cycle carbone-climat') ;
    grid;
    end

    Le fichier equilibrium.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function [lookfor stop direction] = equilibrium(t,x) 
    actualState = odefunction(x);
    if abs(actualState) <= [0.01 0.01 0.01 0.01 0.01]'
        lookfor = 0; %Searches for this expression set to 0
        stop = 1; %Do not stop when event is located 
        direction = 0; %Either direction accepted 
        disp(['Equilibre atteint pour tous les paramètres après ' num2str(floor(t)) ' années'])
     
    else 
        lookfor = 1;
        stop = 0; %Do not stop when event is located 
        direction = 0; %Either direction accepted 
    end
     
     
    end
    Voilà ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    question2([0 200], [15 3000 2000 3 9])
    Equilibre atteint pour tous les paramètres après 91 années
    Equilibre atteint pour tous les paramètres après 89 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années
    Equilibre atteint pour tous les paramètres après 88 années

    Or, j'aimerais que la phrase indiquant que l'équilibre est atteint après x années ne s'affiche qu'une seule fois !

    Normalement, dès que le lookfor = 0 le calcul avec ODE45 doit s'arrêter, au début ça marchait, maintenant plus, quelqu'un peut m'aider ???

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Je pense qu'il y a un soucis au niveau de cette condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if abs(actualState) <= [0.01 0.01 0.01 0.01 0.01]'
    Ne serait-ce pas plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if any(abs(actualState)<=0.01)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if all(abs(actualState)<=0.01)
    Et sinon évite d'utiliser LOOKFOR comme nom de variable, c'est déjà le nom d'une fonction MATLAB

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    Merci de votre réponse, malheureusement, cela ne change rien au résultat...
    J'ai également changé le nom de la variable lookfor, rien n'y fait.

    Comment cela se fait-il que Matlab PUISSE continuer à calculer alors que l'event est détecté et qu'il est demandé d'arrêter le calcul dès sa détection ???

    C'est quand même fou ...

Discussions similaires

  1. [Batch] L'arrêt du service Windows n'arrête pas tout
    Par Omegnight dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 01/06/2015, 16h57
  2. Réponses: 4
    Dernier message: 06/07/2010, 10h55
  3. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  4. Réponses: 4
    Dernier message: 25/08/2008, 02h51
  5. [W3C] Éléments de ma page ne se placent pas tout de suite
    Par Garra dans le forum Balisage (X)HTML et validation W3C
    Réponses: 22
    Dernier message: 24/01/2007, 02h04

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