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 :

Marche aléatoire 2D - Créer une zone avec des conditions différentes


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Marche aléatoire 2D - Créer une zone avec des conditions différentes
    Bonjour à tous,

    Autant dire tout de suite que je suis un vrai débutant en programmation. Je suis étudiant en M2 de biologie et j'ai un petit projet à faire sous MATLAB même si je n'ai jamais eu de cours sur ce sujet...

    Mon but est de modéliser un mouvement brownien (que l'on peut retrouver dans les trajectoires de certaines protéines membranaires dans une cellule).
    J'ai déjà plus ou moins réussi à le modéliser en utilisant une marche aléatoire en 2D. Ceci dit, j'aimerais aller plus loin et insérer des zones où les conditions de déplacement seraient différentes (probabilité moins grande de se déplacer, baisse du coefficient de diffusion etc...) afin de modéliser un mouvement confiné.

    Voici le script que j'ai déjà écrit :

    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
    % Marche aléatoire dans un espace à deux dimensions
    ipmax=5; %nombre de particules
    itmax=50000; %nombre de pas
    J=rand; %rand correspond à une sélection aléatoire d'une valeur dans [0,1[
    x(1)=100*J; %position initiale de la particule en X
    y(1)=100*J; %position initiale de la particule en Y
    opt={'r' 'g' 'k' 'b' 'm'}; %couleurs des trajectoires
    hold on
    for i=1:ipmax
        plot(x,y,opt{i})
        for i=1:itmax
            J=rand;
            if J<0.25
                x(i+1)=x(i)+1;
                y(i+1)=y(i);
            elseif (J>0.25)&&(J<0.5)
                x(i+1)=x(i)-1;
                y(i+1)=y(i);
            elseif (J>0.5)&&(J<0.75)
                x(i+1)=x(i);
                y(i+1)=y(i)+1;
            else
                x(i+1)=x(i);
                y(i+1)=y(i)-1;
            end
        end
    end
    axis ([-500 500 -500 500])
    hold off
    J'ai ensuite essayé ce type de commande pour créer des carrés/rectangles où je pourrai par la suite changer certaines conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (x(i+1)>100)&&(x(i+1)<200)&&(y(i+1)>100)&&(y(i+1)<200);
     
    ........
     
    else 
     
    ........
    Évidemment ça ne fonctionne et j'avoue être complètement bloqué ?

    Pourriez-vous m'aider ?

    Merci d'avance pour vos réponses !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour commencer, pense à effectuer une préallocation de tes variables x et y au début de ton programme.
    Ensuite évite d'utiliser la même variable pour tes deux boucles for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=1:ipmax
        plot(x,y,opt{i})
        for i=1:itmax
    Pense à indenter ton code comme je l'ai fait dans ton message, cela le rendra plus lisible (Ctrl+A ; Ctrl+I dans ton éditeur MATLAB).

    Ta ligne plot(x,y,opt{i}) est plutôt à mettre à la fin de ta première boucle, sinon tu manques le dernier tracé.
    Citation Envoyé par Cohnii
    Évidemment ça ne fonctionne et j'avoue être complètement bloqué ?
    Ce genre de condition me semble bon... Qu'as-tu essayé qui n'a pas fonctionné ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci pour ta réponse !

    J'ai changé le nom d'une des variables et j'ai mis la ligne plot à la fin de la boucle comme tu me le conseillais, effectivement le script fonctionne déjà mieux.

    En ce qui concerne la préallocation, j'ai lu la FAQ mais tout ça reste assez flou pour moi... Comment puis-je l'intégrer dans mon script ?

    Pour répondre à ta question, j'ai essayé ce genre de script juste pour voir si ça fonctionnait :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    clear all; close all;
    % Marche aléatoire dans un espace à deux dimensions
    npmax=5; %nombre de particules
    itmax=50000; %nombre de pas
    J=rand; %rand correspond à une sélection aléatoire d'une valeur dans [0,1[
    x(1)=100*J; %position initiale de la particule en X
    y(1)=100*J; %position initiale de la particule en Y
    opt={'r' 'g' 'k' 'b' 'm'}; %couleurs des trajectoires
    hold on
     
    for n=1:npmax
     
        for i=1:itmax;
            J=rand;
     
            if (x(i+1)>100)&&(x(i+1)<200)&&(y(i+1)>100)&&(y(i+1)<200);
     
     
                if J<0.25
                    x(i+1)=x(i)+10;
                    y(i+1)=y(i);
                elseif (J>0.25)&&(J<0.5)
                    x(i+1)=x(i)-10;
                    y(i+1)=y(i);
                elseif (J>0.5)&&(J<0.75)
                    x(i+1)=x(i);
                    y(i+1)=y(i)+10;
                else
                    x(i+1)=x(i);
                    y(i+1)=y(i)-10;
                end
     
            else
     
     
     
                if J<0.25
                    x(i+1)=x(i)+1;
                    y(i+1)=y(i);
                elseif (J>0.25)&&(J<0.5)
                    x(i+1)=x(i)-1;
                    y(i+1)=y(i);
                elseif (J>0.5)&&(J<0.75)
                    x(i+1)=x(i);
                    y(i+1)=y(i)+1;
                else
                    x(i+1)=x(i);
                    y(i+1)=y(i)-1;
                end
            end
            plot(x,y,opt{n})
            axis ([-500 500 -500 500])
        end
    end
        hold off
    Lorsque je lance le programme, le message d'erreur suivant s'affiche :

    ??? Attempted to access x(2); index out of bounds because numel(x)=1.
    
    Error in ==> untitled at 16
            if (x(i+1)>100)&&(x(i+1)<200)&&(y(i+1)>100)&&(y(i+1)<200);
    Ça serait un problème de concaténation si j'ai bien compris mais je ne sais pas comment le résoudre...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Concernant la preallocation, il suffit de savoir que tu as itmax valeurs dans tes vecteurs x et y finaux

    Concernant ton erreur, elle est due au fait que tu effectues les vérifications sur les prochains échantillons (i+1, qui n'existent donc pas encore) et non ceux de l'itération précédente (i).

  5. #5
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Pour alléger ton code tu peux remplacer
    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
     
    J=rand;
         if (x(i+1)>100)&&(x(i+1)<200)&&(y(i+1)>100)&&(y(i+1)<200);
                if J<0.25
                    x(i+1)=x(i)+10;
                    y(i+1)=y(i);
                elseif (J>0.25)&&(J<0.5)
                    x(i+1)=x(i)-10;
                    y(i+1)=y(i);
                elseif (J>0.5)&&(J<0.75)
                    x(i+1)=x(i);
                    y(i+1)=y(i)+10;
                else
                    x(i+1)=x(i);
                    y(i+1)=y(i)-10;
                end
          % etc
         end
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    J=ceil(4*rand); %J est entier compris entre 1 et 4 inclus
    deltaX = [1 -1 0 0];
    deltaY = [0 0 1 -1];
    if () %Condition de zone
         facteurDeZone = 10;
    elseif () %Autre condition de zone
         facteurDeZone = 5;
    else
         facteurDeZone = 1;
    end
    x(i+1)=x(i)+facteurDeZone * deltaX(J);
    y(i+1)=y(i)+facteurDeZone * deltaY(J);

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses et désolé de répondre si tard !

    Vous m'avez bien aidé, je vais essayer de continuer tout seul et si jamais j'ai un problème, je n'hésiterai pas à venir vous consulter

Discussions similaires

  1. Créer une vue avec des conditions
    Par jamdinhe dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/12/2012, 09h59
  2. Créer une zone avec Scroll dans une page html
    Par youcef81 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 04/12/2006, 10h53
  3. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  4. Créer une liste avec des noms de fichiers
    Par Jeffboj dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 05h48
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37

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