Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mise à jour de variables

Sujet résolu
    31 mars 2021 à 15:47:13

    Bonjour,

    J'écris un programme en Matlab pour simuler l'évolution de deux descendants représentés par leurs nombres de gènes. J'ai un ancêtre commun qui a n0 gènes, et j'ai des listes B et D qui contiennent les probabilités B(i,1) et D(i,1) de naissance et de mort d'un gène chez une espèce qui en aurait i. J'initialise la liste B à l'aide de la fonction rand, et je construis D en utilisant B et rand de nouveau. 

    La simulation fonctionne lorsque je fais "Run". Mais quand je veux relancer la simulation, la simulation se déroule de nouveau exactement de la même manière. J'ai regardé les contenus des variables B et D dans le "Workspace" : ils ne changent pas. Pourquoi ? Quand j'exécute "principal.m", j'appelle la fonction "define_alea_transition.m", donc B et D devraient être reconstruits, non ? Je voudrais que ce soit le cas en tous cas. Comment devrais-je procéder ?

    Voici le code de principal.m

    rng('default')
    
    n = 100 ;%nombre maximal d'introns
    n0 = 20 ;%nombre d'introns dans le gène chez l'ancêtre commun
    
    [B,D] = define_alea_transition(n);
    
    
    t = 100;
    t_ = 0; 
    
    graphe1 = scatter([n0],[1], 100,'b','filled');
    title(['temps courant=',num2str(t_)]);
    grid('on');
    axis([-0.1,100.1,0.5,1.5]);
    xlabel('classes d introns');
    drawnow;
    
    hold on;
    graphe2 = scatter([n0],[1], 100,'b','filled');
    
    
    tirage1 = rand(1,1);
    tirage2 = rand(1,1);
    
    descendant1 = n0;
    descendant2 = n0;
    
    if tirage1 < B(n0+1,1)
        descendant1 = n0+1;
    else
        if tirage1 < B(n0+1,1)+D(n0+1,1)
            descendant1 = n0-1
        end
    end
    
    if tirage2 < B(n0+1,1)
        descendant2 = n0+1;
    else
        if tirage2 < B(n0+1,1)+D(n0+1,1)
            descendant2 = n0-1
        end
    end
    
    t_ = t_+1;
    
    delete(graphe1);
    hold on;
    graphe1 = scatter([descendant1],[1], 100,'b','filled');
    grid('on');
    axis([-0.1,100.1,0.5,1.5]);
    title(['temps courant =',num2str(t_)]);
    drawnow;
        
    delete(graphe2);
    hold on;
    graphe2 = scatter([descendant2],[1], 100,'g','filled');
    grid('on');
    axis([-0.1,100.1,0.5,1.5]);
    title(['temps courant =',num2str(t_)]);
    drawnow;
    
    for i=(2:t)
        
        t_ = t_ + 1;
        
        tirage1 = rand(1,1);
        tirage2 = rand(1,1);
        
        if tirage1 < B(descendant1+1,1)
            descendant1 = descendant1+1;
        else
            if tirage1 < B(descendant1+1,1)+D(descendant1+1,1)
                descendant1 = descendant1-1;
            end
        end
        
        if tirage2 < B(descendant2+1,1)
            descendant2 = descendant2+1;
        else
            if tirage2 < B(descendant2+1,1)+D(descendant2+1,1)
                descendant2 = descendant2-1;
            end
        end
        
        delete(graphe1);
        hold on;
        graphe1 = scatter([descendant1],[1], 100,'b','filled');
        grid('on');
        axis([-0.1,100.1,0.5,1.5]);
        title(['temps courant =',num2str(t_)]);
        drawnow;
        
        delete(graphe2);
        hold on;
        graphe2 = scatter([descendant2],[1], 100,'g','filled');
        grid('on');
        axis([-0.1,100.1,0.5,1.5]);
        title(['temps courant =',num2str(t_)]);
        drawnow;
        
    end


    Et le code de define_alea_transition.m

    function [B,D] = define_alea_transition(n)
        B = zeros(n+1,1);
        for i=(1:n)
            B(i,1) = rand(1,1);
        end
        
        D = zeros(n+1,1);
        for i=(2:n+1)
            D(i,1) = (1-B(i,1))*rand(1,1);
        end
    end



    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2021 à 17:37:15

      ça vient de l'initialisation de rng qui est fait à chaque fois; il va reprendre à chaque fois les mêmes valeurs, remplace 'default' par 'shuffle' par exemple
      • Partager sur Facebook
      • Partager sur Twitter
        31 mars 2021 à 21:02:02

        Parfait, merci pour votre aide.
        • Partager sur Facebook
        • Partager sur Twitter

        Mise à jour de variables

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown