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 :

[for] Vérification de code avec for, d'où est l'erreur?


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut [for] Vérification de code avec for, d'où est l'erreur?
    Bonjour,

    Je dois utiliser matlab pour comparer des graphes obtenus selon différentes méthodes décrivant un même problème.

    Ma version du programme est la 8.1.0.604 (R2013a).

    Je vous rapporte ici seulement l'une des méthodes, il s'agit de l'avancée d'une distance y en fonction du temps t.
    J'ai construit une boucle (c'est comme ça que ça s'appelle?) for, dans laquelle chaque avancée dans le temps doit se faire en ajoutant une valeur de temps dt/2 au temps initial ou précédent. Dans le code que je vous joins, y(t+1) doit être la valeur de y au temps t+dt/2 et y(t+2) sa valeur au temps t+2*(dt/2), donc t+dt.

    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
    dt = (6-0) / 20 ;
    y = 5 ;
    ydot = -2 ;
    ydotnew = 0 ;
     
    %The proposed method
     
    for t = 0:dt/2:6 ;
     
        ydot = sin(5*t) - 0.4*y ;
     
        y(t+2) = y(t) + dt * ydot(t) ;
        ydot(t+2) = sin(5*(t+2)) - 0.4 * y(t+2) ;
        ydotnew(t+2) = ( ydot(t) + ydot(t+2) ) / 2 ;
        y(t+1) = y(t) + dt/2 * ydotnew(t+2) ;
     
    end
     
    y1 = y ;
     
    plot(t,y1)
    dt reste fixe tout le temps. Il est égal à 6/20, c'est juste pour mettre en évidence son lien avec les extrémités de t qu'il est écrit comme ça.
    y=5 et ydot=-2 sont les conditions initiales. Je ne sais pas s'il y a besoin de ydotnew=0.
    La formule de ydot est donnée.
    L'avancée de la fonction comme décrite plus haut.
    ydotnew(t+2) est la moyenne de ydot au temps t et de ydot au temps t+2.
    Le graphe à obtenir est celui de y selon le temps t, selon la dernière ligne du code avant end.

    Lorsque j'essaie de faire marcher tout cela, voilà la réponse de matlab:

    Attempted to access y(0); index must be a
    positive integer or logical.
    
    Error in Pb01proposed (line 11)
        y(t+2) = y(t) + dt * ydot(t) ;
    Selon le problème sur lequel je me base, y(0) doit être égal à 5, c'est la condition initiale.
    Ma question est double:
    Est-ce que mon code est bien construit? Si oui, où est l'erreur?
    Et comment faire savoir à matlab que y(0)=5 ?
    (Et si déjà, est-ce qu'il y a réellement besoin de ydotnew=0 au début du code? Il n'y a pas réellement de condition initiale pour ce paramètre)

    Je n'étudie pas en français et espère m'être bien exprimée =)
    Merci d'avance,

  2. #2
    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

    l'indexage des tableaux commence à 1, et non 0, sous matlab
    y(0) n'existe donc pas

    Voir la FAQ : Attempted to access variable(0); index must be a positive integer or logical.

    Fabien

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Ok, merci. En fait, si j'ai bien compris, je ne peux pas non plus définir l'avancée de t par dt/2, puisque ça aussi doit être un nombre entier.
    J'ai bien pensé utiliser comme paramètre dans la boucle i au lieu de t, mais à ce moment-là je ne sais pas comment exprimer ydot en fonction de i et non de t, ni comment lui dire que chaque avancée de i correspond à une avancée de dt/2 dans le temps.
    Voilà le code que j'avais écrit, avec i:

    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
     
    dt = (6-0) / 20 ;
    t = 0:dt/2:6 ;
    y = 5 ;
    ydot = sin(5*t) - 0.4*y ;
    ydotnew = 0 ;
     
    %The proposed method
     
    for i=1:20
        y(i+2) = y(i) + dt * ydot(i) ;
        ydot(i+2,t) = sin(5*(t+dt)) - 0.4 * y(i+2) ;
        ydotnew(i+2) = ( ydot(i) + ydot(i+2) ) / 2 ;
        y(i+1) = y(i) + dt/2 * ydotnew(i+2) ;
    end
     
    y1 = y ;
    plot(t,y1)
    t apparaît dans l'expression de ydot, mais ça pose problème. Je n'ai pas le message d'erreur sous les yeux, mais je pense que ceux qui s'y connaissent peuvent voir que ça ne doit pas être comme cela.
    On m'a dit de faire avancer le temps en ajoutant t=t+dt quelque part, mais je ne sais pas exactement où. A ce moment, j'imagine que ydot(i+2,t) deviendra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ydot(i+2) = sin(5*(t)) - 0.4 * y(i+2) ;
    . Mais t fera toujours partie de l'expression.

    Désolée, je n'ai pas tous les jours accès au programme; si quelqu'un a la gentillesse de copier ce code et de rapporter ici le message d'erreur de matlab, ça m'aiderait beaucoup. En attendant, si quelqu'un a compris quel est le problème,

    Merci d'avance !

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    A moins que je n'écrive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ydot(i+2) = sin(5*(i+2)) - 0.4 * y(i+2) ;
    Mais comment signifier à matlab que ce i+2 est en fait t+dt?

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    tu peut aussi utiliser while ou repeat selon le cas
    le for n'etant qu'une boucle while specialisé
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    j'ai pensé à une solution: en définissant un changement de t dans la boucle, il n'y aurait en principe plus de problème à faire entrer t dans l'expression de ydot. Ca donnerait ceci:

    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
    dt = (6-0) / 20 ;
    t = 0:6 ;
    y = 5 ;
    ydot = -2 ;
    ydotnew = 0 ;
     
    %The proposed method
     
    for i=1:20
     
        t(i) = t;
        t(i+1) = t+dt/2;
        t(i+2) = t+dt;
     
       % ydot(i) = sin(5*t(i)) - 0.4*y(i);
     
        y(i+2) = y(i) + dt * ydot(i) ;
        ydot(i+2) = sin(5*(t(i+2))) - 0.4 * y(i+2) ;
        ydotnew(i+2) = ( ydot(i) + ydot(i+2) ) / 2 ;
        y(i+1) = y(i) + dt/2 * ydotnew(i+2) ;
     
    end
     
    y1 = y ;
    plot(t,y1)
    Je n'ai pour l'instant pas la possibilité d'essayer moi-même le code, donc ne sais pas ce que ça donne. Si quelqu'un a un peu de temps et la possibilité de le copier-coller chez lui, ça me rendrait un grand service. (Sinon, ça devra attendre une dizaine de jours avant que je ne puisse le faire moi-même).

    La ligne dans la boucle que j'ai fait précéder par %, je ne sais pas s'il y en a besoin ou pas.
    En vous remerciant encore,

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    J'ai essayé mon code, et cette fois-ci l'erreur est la suivante:
    In an assignment  A(I) = B, the number of elements in B and I must be
    the same.
    
    Error in proposed1 (line 11)
        t(i) = t;
     
    J'ai changé mon i en i=1:7, ce qui devrait lui deonner le même nombre d'éléments que t, mais la même erreur revient.
    J'ai aussi essayé d'utiliser k au lieu de i, mais ça n'a rien changé.
    Est-ce que quelqu'un a une idée, s'il vous plaît?

    (Le nom du fichier a changé parce que je suis sur un autre ordinateur, ce n'est pas important)

Discussions similaires

  1. Optimisation code avec une boucle For
    Par latour500 dans le forum jQuery
    Réponses: 7
    Dernier message: 11/04/2014, 15h02
  2. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 08h33
  3. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  4. [VB.NET] Problème avec For Each...
    Par cyrcroix dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/06/2005, 10h49
  5. qbasic : pause avec FOR-NEXT
    Par clood200 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 08/08/2003, 16h51

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