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 :

Boucle deux variables


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut Boucle deux variables
    Bonjour à tous,
    J'ai un peu de mal à créer une boucle à deux variables sur matlab.
    Les variables ini et fim sont les itérations en début et en fin de simulation. La variable tempo est le temps de simulation en secondes.
    Dans l'extrait du code ci-après j'aimerais calculer la distance que mon mobile a parcouru toutes les deux minutes. Le long de la courbe que j'obtiens j'ai tracé une droite sur laquelle je mets un point avec le temps parcouru.
    La réponse sera peut être évidente mais je n'arrive vraiment pas à trouver.. Matlab me dit que "d(0) must be a positive integar or logical"
    Dans l'extrait du code c'est un peu brouillon, la partie avec les length est présente car j'ai tenté de définir d(i,j)
    Merci d'avance

    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
    21
    22
    23
    24
    25
    26
    27
     
    int=120;
    disc=10;
    for i=ini:disc:fim
        for j=0:int:tempo
       M = [cos(PSI(i)+pi/2) -sin(PSI(i)+pi/2)
             sin(PSI(i)+pi/2) cos(PSI(i)+pi/2)];
       p_int(i,1) = -Y(i)+Yini;
       p_int(i,2) = X(i)-Xini;
       desenho = M*navio';
       fill((desenho(1,:)+p_int(i,1)),(desenho(2,:)+p_int(i,2)),[0.5 0.5 0.5]);
       k=[0 0];
       l=[0 head_reach];
       q=plot(k,l);
       set(q,'Color','red','LineWidth',4);
     
     d=zeros(length(fim-ini),length(tempo));
     
     d(j+1)=d(j) + sqrt(X(i+1) - X(i)).^2;
     
     text(0,d(j),'2 min    ','HorizontalAlignment','right');
     scatter(0,d(j),'filled','LineWidth',2,'MarkerFaceColor',[0 0 1]);
     
     
     
        end 
    end

  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 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int=120;
    disc=10;
     
    iterations = ini:disc:fim;
    temps = 0:int:tempo;
     
    for i = 1:numel(iterations)
        for j = 1:numel(temps)
            %...
        end
    end
    Il faut ensuite modifier le code en conséquence
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Merci.
    Je vaie essayer cela alors. Le seul probleme ne sera-t-il pas avec mon graphe ? Lorsque j'utilise la fonctionn fill j'appelle le i allant de ini a fim. Or desormais il ira de 1 a numel(iterations)..

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé comme cela :
    disc correspond au temps des itérations. J'ai une itérations toutes les 1/10 de s
    Ce que je veux c'est calculer la distance parcourue toutes les 2 minutes, c'est à dire toutes les 1200 itérations..
    Je pense que mes distances calculées ne sont pas bonnes du tout ..

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    f1 = figure;
    hold on;
     
    int=1200;
    disc=10;
     
    temps = ini:1200:fim;
     
    for i= ini:disc:fim;
      for j = 1:numel(temps)
       M = [cos(PSI(i)+pi/2) -sin(PSI(i)+pi/2)
             sin(PSI(i)+pi/2) cos(PSI(i)+pi/2)];
       p_int(i,1) = -Y(i)+Yini;
       p_int(i,2) = X(i)-Xini;
       desenho = M*navio';
       fill((desenho(1,:)+p_int(i,1)),(desenho(2,:)+p_int(i,2)),[0.5 0.5 0.5]);
       k=[0 0];
       l=[0 head_reach];
       q=plot(k,l);
       set(q,'Color','red','LineWidth',4);
     
     
     
     d(j+1)=d(j) + sqrt(X(i+1) - X(i)).^2;
     
     text(0,d(j),'2 min    ','HorizontalAlignment','right');
     
     
     
           end
       end

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Si ça peut aider, j'arrivais à obtenir ce que je voulais en faisant comme cela :
    Mais je désire maintenant automatiser le programme car je devais, selon le temps de simulations, rajouter le nombre de d suffisants...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d60=0;
       for i=ini:ini+600
           d60 = d60 + sqrt(X(i+1) - X(i)).^2;
       end 
       text(0,d60,'1 min    ','HorizontalAlignment','right');
       text(0,d60,'    19.4 kts','HorizontalAlignment','left');

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Je pense que tu confonds deux choses : les valeurs réelles du phénomène physique et leur stockage numérique (sous forme de tableau)

    Prenons un phénomène P qui varie toutes les 250ms pendant 2s.

    Les valeurs réelles (discrètes) du paramètre temporel : 0, 0.25, 0.5, 1, 1.25, 1.5, 1.75, 2
    Le vecteur numérique associé : t = [0 0.25 0.5 1 1.25 1.5 1.75 2]

    Supposons une relation très simple : P(t) = t2

    Mathématiquement tu écris :
    • P0 = t0*t0
    • P0.25 = t0.25*t0.25
    • P0.5 = t0.5*t0.5
    • ...

    Numériquement tu écriras :
    • P(1) = t(1)*t(1)
    • P(2) = t(2)*t(2)
    • P(3) = t(3)*t(3)
    • ...

    Et non pas :
    • P(0) = t(0)*t(0)
    • P(0.25) = t(0.25)*t(0.25)
    • P(0.5) = t(0.5)*t(0.5)
    • ...
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Merci, je vois bien l'idée. Je ne sais pas si je fais un blocage mais impossible de le coder..
    Je vais continuer de chercher.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Dans l'idée il me faudrait cela en fait je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for n = ini : 1200 : fim
      for j=1:numel(temps)
     
     dj+1 = dj + sqrt(X(n+1) - X(n)).^2;
     
     text(0,dj,'x min    ','HorizontalAlignment','right');
     
     
     
           end
       end

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    J'ai cru comprendre que ce n'était pas terrible mais je peux utiliser genvarname peut être ?

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Clem44120 Voir le message
    La variable tempo est le temps de simulation en secondes.
    Dans l'extrait du code ci-après j'aimerais calculer la distance que mon mobile a parcouru toutes les deux minutes.
    Reprenons depuis le début.

    Le contenu du tableau numérique tempo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tempo = 0:1:6*60; % exemple pour 6 minutes de simulation
    Les temps en secondes à intervalle de 2 minutes : 0, 120, 240, 360

    Ces temps correspondent aux indices [1 121 241 361] du tableau tempo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t = tempo([1 121 241 361])
     
    t =
     
         0   120   240   360
    ce qui s'écrit aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t = tempo(1:120:end)
     
    t =
     
         0   120   240   360
    Donc la boucle peut devenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for n = ini : 1200 : fim
        for j = 1:120:numel(tempo)
            % ...
        end
    end
    Et comme tu veux stocker le résultat dans un tableau d(1), d(2), d(3)... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for n = ini : 1200 : fim
        for j = 1:120:numel(tempo)
            d((j-1)/120+1) = ...
        end
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Super top !
    Cela m'a mis sur la piste. En effet, je mélangeais un peu tout ...
    Petite question supplémentaire, je cherche à utiliser la fonction num2str afin de légender mes points toutes les deux minutes. J'ai bien mes points avec la fonction scatter mais je n'arrive pas à mettre une légende "2 min" puis "4 min" en face des points.
    J'ai essayé de la maniere suivante, sachant que j'ai 5 itérations (j de 1 a 5) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text(0,d(j),'num2str(2*j)','HorizontalAlignment','right');

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text(0, d(j), [num2str(2*j) ' min'], 'HorizontalAlignment', 'right');
    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text(0, d(j), sprintf('%d min', 2*j), 'HorizontalAlignment', 'right');
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Merci pour tout !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter 2 boucles while avec deux variables en même temps.
    Par gagnant16 dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 16/04/2014, 22h04
  2. Réponses: 4
    Dernier message: 21/01/2013, 17h51
  3. Boucle do sur deux variables
    Par bouabid_hanen dans le forum Fortran
    Réponses: 2
    Dernier message: 11/10/2010, 09h35
  4. Boucle for à partir de deux variables de deux listes
    Par bourgui78 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/08/2008, 16h24
  5. Concaténer deux variables dans une boucle
    Par jeremie74 dans le forum Flash
    Réponses: 2
    Dernier message: 22/05/2007, 19h51

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