Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

aide sur matlab



  1. #1
    patrice94500

    aide sur matlab


    ------

    Bonjour,
    Je vous présente mon problème:
    imaginez une cellule ronde (cercle) avec M mobiles dedans. Plus vous êtes près de la station de base (centre du cercle), plus votre gain est fort. Je voudrais créer un vecteur avec les noms de mes mobiles ([mb1, mb2, mb3,....mbM], chaque mobile associé à un gain. Au début c'est facile puisque je peux nommer mb1 le mobile au gain le plus fort, g1 (càd le plus près du centre du cercle) et ainsi de suite mais aprés je fais faire un mouvement aléatoire à mes mobiles dans la cellule et mb1 qui était le plus près peut maintenant se trouver loin et donc ne pas avoir le gain g1 mais g3 par exemple.
    J'ai besoin d'additionner les gains par rapport aux mobiles afin de voir si à la fin de la journée si les mobiles ont tous le même gain (équilibrage) ou non.
    Je ne sais pas si j'ai été bien clair.Je peux balancer par mail mon début de programme pour ceux que ça interresse.
    merci.

    -----

  2. Publicité
  3. #2
    jepoirrier

    Re : aide sur matlab

    Salut.

    Je n'ai peut-être pas bien compris ton problème mais as-tu vraiment besoin de nommer tes mobiles mb1, ... mbx ? Si tu n'en as pas besoin, tu peux jouer avec 2 matrices, en permutant entre les 2 à chaque tour et en attribuant des points (gains) à chaque mobile, à chaque tour, pour leur position par rapport au centre ...

    Initialisation : les matrices A et B sont remplies de zéros.
    Départ : tu places les mobiles comme tu veux sur la matrice A. En les plaçant, tu leur donnes leur gain en fonction de leur position par rapport au centre.
    Etape 1 : tu déplaces les mobiles ; leur position finale sera rapportée sur la matrice B (tu peux te servir du fait qu'une case est disponible si = 0). Tu additionnes le nouveau gain à l'ancienne valeur, en fonction de la position. Tu as donc une matrice A avec les positions + gains initiaux et la B avec les positions + gains finaux
    Etape 2 : idem que l'étape 1 mais en remplaçant A par B (et B par A).

    Normalement, çà doit marcher.
    Simple curiosité : tu dois faire çà pour quoi ? un cours ? simple plaisir ? Et çà montre qqch d'intéressant ?

  4. #3
    patrice94500

    Re : aide sur matlab

    J-E,

    laisse moi te soumettre mon code:

    clear all;
    close all;
    Rc=1.2; % rayon de la cellule
    Rm=.325; % distance minimale (en clair les mobiles doivent se trouver entre rm et rc
    M=8; % nombre de mobile
    mobile=zeros(1,M);
    g = zeros(1, M);
    n=0;
    while(n<M)
    x=Rc*(2*rand-1);
    y=Rc*(2*rand-1);
    if((sqrt(x^2+y^2)<=Rc) & (sqrt(x^2+y^2)>=Rm))
    n=n+1;
    xnrt(n)=x;
    ynrt(n)=y;
    r=sqrt(x^2+y^2);
    gp(n)=10^-10.2*r^-3.18;

    end
    end
    figure (1);
    hold on;
    plot(xnrt,ynrt,'ro');
    hold on;
    grid on;
    title('mobile dans une cellule circulaire');
    xlabel('x (km)');
    ylabel('y (km)');
    plot(Rc*cos(0i/20:2*pi),Rc*sin(0i/20:2*pi),'k');
    [gs,ind]=sort(gp); % gs représente les gi triés (s comme sorted)
    gs=fliplr(gs);

    je peux ici nommer mes mobiles par rapport à leur gain mais ensuite quand j'aurais fait mon "random walk", je ne vois pas comment tu veux que je retrouve mes mobiles si ce n'est par leur nom?

    patrice

  5. #4
    patrice94500

    Re : aide sur matlab

    attention l'expression de 0 à pi (0i) a été remplacé par un smiley

  6. A voir en vidéo sur Futura
  7. #5
    jepoirrier

    Post Re : aide sur matlab

    Je suis arrivé à un autre script (avec l'approximation suivante : j'utilise un carré et non un cercle) :

    Code:
    % MMOBILES.M
    
    max = 100; % Nombre maximum de cases sur 1 cote du carre ; initialement, on devait avoir un cercle !!!
    mob = 50; % Nombre de mobiles
    ite = 100; % Nombre maximum d'iterations
    
    a = zeros(max, max, 2); % Creation de la matrice
    
    % Peuplement initial de la matrice "1"
    for i = 1:mob;
        posx = ceil(rand * max);
        posy = ceil(rand * max);
        while a(ceil(rand * max), ceil(rand * max), 1) > 0; % Verif si pas deja occupee
            posx = ceil(rand * max);
            posy = ceil(rand * max);
        end
        a(posx, posy, 1) = 1; % Attribution de la case a un mobile (valeur 1 initiale)
    end % Fin du peuplement initial
    
    % Boucle des iterations
    for i = 1:ite;
        disp(['- Numero d''iteration : ' int2str(i)]);
        if(mod(i, 2))
            j = 1; % j, indice matrice avec valeurs initiales
            k = 2; % k, indice matrice avec valeurs finales
        else
            j = 2;
            k = 1;
        end
        for casex = 1:max; % Parcours de toutes les cases matrice initiale
            for casey = 1:max;
                l = a(casex, casey, j);
                if(l > 0) % Case occupee par un mobile
                    posx = ceil(rand * max);
                    posy = ceil(rand * max);
                    while a(ceil(rand * max), ceil(rand * max), k) > 0; % Verif si pas deja occupee
                        posx = ceil(rand * max);
                        posy = ceil(rand * max);
                    end
                    
                    % Calcul de la valeur a ajouter ; c'est approximatif ici !
                    % Attribution de 1 a (max / 2) points pour les X
                    % Attribution de 1 a (max / 2) points pour les Y
                    milieu = round(max / 2);
                    if(posx > milieu)
                        l = l + (milieu - (posx - milieu));
                    else
                        l = l + posx;
                    end
                    if(posy > milieu)
                        l = l + (milieu - (posy - milieu));
                    else
                        l = l + posy;
                    end
                    
                    % Attribution de la case a un mobile (valeur de l)
                    a(posx, posy, k) = l;
                    disp(['  - PosX = ' int2str(posx) ' - PosY = ' int2str(posy) ' - Valeur = ' int2str(l + 1)])
    
                    a(casex, casey, j) = 0; % Reset de la valeur dans la matrice initiale
                end % Fin du if
            end % Fin du parcours des Y
        end % Fin du parcours de X
    end % Fin de la boucle des iterations
    
    surfc(a(:,:,k)); % Affichage des pics resultants
    Donc, je ne nomme rien. Je regarde si la case est occupée. Si elle l'est, je lui trouve une autre place au hasard dans l'autre matrice et j'additionne la valeur par rapport à son éloignement du centre. Puis je remets à zéro la valeur dans la matrice initiale. J'ai donc juste des points qui se balladent, représentés uniquement par un gain (un peu comme si tu n'avais pas de pion au Monopoly mais juste un bout de papier avec la somme d'argent que tu possèdes).

    (Ce n'est probablement pas optimisé)
    Dernière modification par jepoirrier ; 21/09/2004 à 15h40.

Discussions similaires

  1. aide sur matlab
    Par mihoubi dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 21/06/2007, 18h56
  2. Aide sur matlab
    Par minky_128 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 06/02/2005, 23h36
  3. aide sur matlab
    Par sandra05 dans le forum Physique
    Réponses: 1
    Dernier message: 09/11/2004, 23h17
  4. aide sur matlab
    Par mikey dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 05/08/2004, 18h06
  5. Aide sur Matlab
    Par julesP dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 08/07/2004, 15h26
Découvrez nos comparatifs produits sur l'informatique et les technologies.