Guest User

Untitled

a guest
May 25th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. % FKPP - version individu-centre 1D remplacement aleatoire
  2. % Des individus sont distribues sur un intervalle
  3. % Certains mutants sont porteurs d'un gene favorable qui donne
  4. % un avantage de croissance r
  5. % Tous les individus de deplacent selon une marche aleatoire avec
  6. % des sauts en sqrt(2*D)
  7. % Les wild-types (non-porteurs) on un taux de croissance 0
  8. % A chaque reproduction d'un mutant, l'individu le plus
  9. % proche est remplace par la progeniture
  10. % Le nombre total d'individu est constant = N0
  11. % la croissance est limitee par le fait la probabilite de remplacer un
  12. % wild-type est de 1 - umut, ou umut est
  13. % la densite de population de mutant
  14. % L'avantage de ce code est qu'il ne depend pas de la densite umut
  15. % umut n'est calculee que pour l'affichage
  16. %
  17. % prob(mutant en x se reproduise) = dt*r
  18. % prob(remplacer un wild-type) ~ (1-umut(x))
  19.  
  20. %% parametre des equations
  21. r = 0.5; % taux de croissance
  22. D = 0.1; % coefficient de diffusion
  23.  
  24. %% parametres de simulation, espace
  25. % x in [x0,x1]
  26. h = 0.1; % intervalle de discretisation spatiale
  27. S = 20.0; % longueur de l'intervalle
  28. x0 = 0; % bord gauche de l'intervalle
  29. x1 = S; % bord droit de l'intervalle
  30. xi = x0:h:x1; % discretisation
  31. J = length(xi); % nombre de points de discretisation
  32.  
  33. %% Individu-centre
  34. N0 = 10000; % population totale
  35.  
  36. % chaque individu possede une position x et trait g
  37. % g = 1 : gene favorable (mutants)
  38. % g = 0 : pas de gene favorable
  39. x = x0 + S*rand([1,N0]); % individus distribues sur [x0,x1]
  40. g = false(1,N0);
  41. g( x < S/10 ) = true; % individus sur la gauche de l'intervalle sont porteurs
  42. w = zeros(1,N0); % probabilite pour l'individu de se reproduire
  43.  
  44. %% parametres de simulation, temps
  45. t0 = 0;
  46. tfinal = 30.0;
  47. t = t0;
  48. dt = 0.1
  49.  
  50. %% Difference finie pour comparaison
  51. % methode implicite Crank-Nicolson
  52. ufd = zeros(J,1); % stocke seulement l'etat au temps t
  53. newufd = zeros(J,1);
  54. % Le Laplacien discretise est une matrice L de taille JxJ
  55. % En 1D elle est symetrique et tridiagonale
  56. L0 = sparse(1:J,1:J,-2); % matrice creuse, compacte en memoire
  57. L0 = spdiags(ones(J,2),[-1 1],L0); % forme la matrice tridiagonale
  58. L0(1,:) = 0; % u(x0) est donne par les conditions au bord
  59. L0(J,:) = 0; % u(x1) est donne par les conditions au bord
  60. % condition initiales
  61. ufd = zeros(J,1);
  62. ufd( xi < S/10 ) = 1.0;
  63. % Schema implicite Crank-Nicolson
  64. A = (speye(J) - dt/h^2*D/2*L0);
  65.  
  66. %% Initialisation
  67. figure(1); clf;
  68. umut = ksdensity(x(g),xi,'support',[x0,x1]); % kernel density approximation des mutants
  69. plot(xi,sum(g)*umut*S/N0,xi,ufd)
  70.  
  71. %% BOUCLE PRINCIPALE
  72. tic
  73. while t < tfinal
  74. drawnow;
  75. % on calcule pour chaque mutant une probabilite de se reproduire
  76. % (les individus non porteurs ne se reproduisent pas)
  77. w = dt*r*g; % probabilite de se reproduire
  78. irep = find(rand(1,N0) < w); % realisation
  79. % un individu se reproduisant remplace l'individu le plus proche
  80. % (autre que lui-meme)
  81. % la probabilite de choisir un wild-type est environ 1-umut
  82. for i = 1:length(irep)
  83. [~,rempl] = min(abs(x - x(irep(i))) + 10*(x == x(irep(i))));
  84. g(rempl) = true;
  85. end
  86.  
  87. % on deplace les individu en marche aleatoire
  88. x = x + sqrt(dt)*sqrt(2*D)*randn(size(x));
  89. x = abs(x); % condition en x0 reflechissant
  90.  
  91. umut = ksdensity(x(g),xi,'support',[x0,x1]); % kernel density approximation des mutants
  92.  
  93. % solution differences finies implicite pour comparaison
  94. newufd =A\(ufd + dt*r*ufd.*(1-ufd) + dt/h^2*D/2*L0*ufd);
  95. newufd(1) = newufd(2);
  96. newufd(J) = newufd(J-1);
  97. ufd = newufd;
  98.  
  99. % affichage
  100. plot(xi,sum(g)*umut*S/N0,xi,ufd);
  101. axis([x0 x1 0 1.1]);
  102. t = t + dt;
  103. fprintf("t = %.5f, Nmut = %d\n",t, sum(g));
  104. end
  105. toc
Add Comment
Please, Sign In to add comment