Construire des matrices grâce à la balise <matrice>

Introduction

Dans certains modèles, des matrices sont utilisées qui possèdent une structure répétitive et sont de grande taille. Plutôt que de saisir les éléments de la matrice un à un, il peut alors être utile d'utiliser une balise <matrice>. Un exemple concrêt d'utilisation est donnée dans l'exemple n°4 : les matrices de Leslie.

 <matrice>
  <ligne l=1 c=2:-1>f</ligne>
  <diagonale pos=-1>s</diagonale>
 </matrice>

Le code ci-dessous peut se lire comme suit : on construit une matrice dont les éléments sont par défaut des zéro (c'est le sens du "tag" defaut=0 dans la balise). La taille de la matrice n'est pas spécifiée. La matrice ainsi définie est carrée et sa dimension est le nombre de variables du modèle. On remplace ensuite tous les zéros de la première ligne sauf le premier par le paramètre f. Puis on remplace les zéros situés sous la diagonale par le paramètre s.

L'avantage de ce codage est que l'on peut redimensionner le système étudié simplement en changeant le nombre de variables du modèle, sans même à avoir à retoucher à la matrice !

Les balises utilisées pour construire une matrice

Utilisation des indices pour définir les composants de la matrice

Dans certains modèles matriciels, on a besoin de définir des composants dont la valeur dépend de la position. On peut pour se faire utiliser dans la définition d'une matrice les indices l (le numéro de ligne), c (le numéro de ligne), nl (le nombre de lignes), nc (le nombre de colones), et enfin n (la taille de la matrice lorsqu'elle est carrée). Chacun de ces indices est remplacé par sa valeur lorsqu'il fait partie d'une expression précédée du symbole &.

Pour illustrer cette possibilité de façon plus concrête, nous allons avoir recours au modèle de dérive de Wright-Fisher (voir exemple n°3). Soit une population de 50 individus, chaque individu pouvant être porteur de l'allèle A en une ou deux copies. La population peut donc comprendre de 0 à 50 copies de A. Le vecteur p contient les proportions de population dans chacune de ces classes de fréquence allélique (p[0] est donc la proportion de populations ayant perdu l'allèle A).

<modele>
 <variable>p[51] = 0 1 0 </variable>
 <equation>
  <matrice>
   <bloc l=1:-1 c=1:-1>dbinomiale(&(l-1),&((c-1)/(n-1)),&(n-1)) </bloc>
  </matrice>
 </equation>
</modele>

Dans ce modèle, les probabilités de transition d'une classe de fréquence à une autre sont données par une distribution binomiale. dbinomiale(&(l-1),&((c-1)/(n-1)),&(n-1)) correspond donc à la probabilité de tirer au hasard l-1 copies de l'allèle A dans une population de taille n-1 où la fréquence de cet allèle est (c-1)/(n-1). Pour l=1 et c=10 cette expression sera, au moment du chargement du modèle, transformée en dbinomiale(0,0.2,50).

Les indices sont aussi utilisés pour définir des sommes et des produits dont ont ne peut pas définir a priori le nombre de termes.

Finalement, les balises matrices peuvent être utilisées en dehors du cas des modèles matriciels. L'exemple ci-dessous illustre ce type de possibilité...

<modele>
<nom>Croissance logistique stochastique</nom>
<variable>n[0:100]=0 0 0 0 0 0 1 0</variable>
<parametre>f=2 m=0.1</parametre>
<equation>
 <matrice nc=1 defaut=0>
  <operation type=+ l=1:-2 c=1>m*&l*n[&l]</operation>
  <operation type=+ l=2 c=1>n[&(l-2)]*&(l-2)*f*(1-&(l-2)/&(nl-1))</operation>
  <operation type=- l=2:-2 c=1>n[&(l-1)]*&(l-1)*f*(1-&(l-1)/&(nl-1))</operation>
  <operation type=- l=2 c=1>m*&(l-1)*n[&(l-1)]</operation>
 </matrice>
</equation>
</modele>

... et permet de produire le joli graphique ci-dessous. À vous d'interpréter !


Haut Index