Les modèles matriciels peuvent être codés de plusieurs façon dans KSimPop. Nous allons illustrer ces possibilités grâce à l'exemple des matrices de Leslie.
On peut tout d'abord écrire ce type de modèle comme un modèle standard en temps discret. On cherche à décrire la dynamique d'une espèce où les individus se répartissent en 10 classes d'âge, la première ne se reproduisant pas. Soit f la fertilté des autres classes d'âge et s la probabilité de transition d'une classe à la suivante. Ce modèle peut être codé comme suit :
<modele>
<nom>Matrice de Leslie</nom>
<temps>discret</temps>
<variable>n1=10 n2=0 n3=0 n4=0 n5=0 n6=0 n7=0 n8=0 n9=0 n10=0</variable>
<parametre>s=0.5 f=1.5</parametre>
<equation>
n2*f+n3*f+n4*f+n5*f+n6*f+n7*f+n8*f+n9*f+n10*f
n1*s
n2*s
n3*s
n4*s
n5*s
n6*s
n7*s
n8*s
n9*s
</equation>
</modele>
Rien de neuf dans la définition de ce modèle : on retrouve la syntaxe utilisée dans la définition de l'exemple n°1. Voici une autre façon de coder le même modèle en le représentant cette fois-ci de façon matricielle :
<modele>
<nom>Matrice de Leslie</nom>
<variable>n[10]=20 0</variable>
<parametre>s=0.5 f=1.5</parametre>
<equation>
0, f, f, f, f, f, f, f, f, f
s, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, s, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, s, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, s, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, s, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, s, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, s, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, s, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, s, 0
</equation>
</modele>
La représentation matricielle du système est ici explicite. Deux nouveautés dans le code qui précède :
Il existe une troisième façon de coder ce modèle en utilisant des commandes de construction de matrice qui sont interprétées par KSimPop au moment de la compilation du modèle. L'utilisation de ces commandes est simplifiée par l'existence d'une interface de saisie.
Dans la fenêtre Fichier modèle, cliquez sur <modele> définissez, dans la fenêtre de saisie du modèle, les paramètres f et s comme habituellement (dans le tableau paramètre) puis choisissez l'onglet Modèle matriciel. Dans l'onglet en question vous pouvez définir la taille du système (ici 10) le nom de la variable (ici n) et ses valeurs initiales (ici 20 et 0).
Vous pouvez en outre définir la matrice de transition en définissant sa valeur par défaut (ici 0) et en ajoutant des commandes de construction. Dans notre cas, il nous faut remplir toutes les cases sauf la première de la première ligne avec le paramètre f. Pour ce faire, cliquez sur le symbole + à droite du tableau des commandes. Une fenêtre d'ajout de commande apparaît. Choisissez la commande ligne, indiquez la position de la ligne (1, puisqu'il s'agit de la première), puis la position de la colone à partir de laquelle il faut remplir (2, puisqu'on veut laisser un 0 dans la première case) et de celle jusqu'où il faut remplir. Il existe deux façon de déterminer cette dernière : soit on indique 10, puisque notre système est de taille 10, soit on commence à compter à partir de la fin (c'est le sens de la case cochée à rebours) et dans ce cas là on indique 1. Cette dernière solution présente des avantages que nous expliquerons plus loin.
La commande étant déterminée, on clique sur OK et elle se rajoute au tableau des commandes. Il nous faut maintenant placer des s parallèlement à la diagonale de la matrice. On clique à nouveau sur + et dans la fenêtre commande on choisit diagonale et on choisit comme position -1. Ceci signifie que l'on va placer le paramètre s une case en dessous de la diagonale de la matrice.
On clique sur OK et la commande est ajoutée au tableau des commandes. Le modèle est alors complètement défini...
Après avoir cliqué sur OK dans la fenêtre Nouveau modèle, on peut charger le modèle et effectuer des simulations comme d'habitude.
NB: à l'exécution des calculs, un message d'avertissement apparaît pour dire qu'on a dépassé les valeurs numériques maximales autorisées. Pas de panique, c'est normal : il n'y a pas de régulation des densités dans le modèle que l'on vient de définir ; elles tendent donc vers l'infini et, pour éviter de planter la machine, KSimPop interrompt le calcul dès qu'elles sont trop élevées.
<modele>
<nom>Matrice de Leslie</nom>
<variable>n[10]=20 0</variable>
<parametre>s=0.5 f=1.5</parametre>
<equation>
<matrice defaut=0>
<ligne l=1 c=2:-1>f</ligne>
<diagonale pos=-1>s</diagonale>
</matrice>
</equation>
</modele>
Dans le code produit ci-dessus, la taille du système n'est précisée qu'à un seul endroit : dans la balise variable. Ce point permet d'illustrer le grand avantage de ce type de codage. Si l'on veut redimensionner notre système, il suffit de changer la valeur entre crochet qui suit le nom de la variable. La taille de la matrice sera par défaut fixée en fonction de celle du vecteur.
Attention néanmoins : la taille du système n'aurait pas pu être changée facilement si l'on avait codé la ligne de f par <ligne l=1 c=2:10>f</ligne> (en décochant la case à rebours et en indiquant 10 comme position de la dernière colone dans l'interface de saisie de la commande). Le nombre de cases affectées par la commande ligne aurait été dans ce cas fixé à 9, indépendamment de la taille de la matrice. En passant d'un système de taille 10 à un système de taille 20 on aurait obtenu une matrice dont la première ligne aurait compris des f sur les cases 2 à 10 mais des 0 sur les cases 11 à 20. La leçon à retenir de cet exemple est qu'il vaut mieux conserver la case à rebours cochée, comme elle l'est par défaut, et qu'en cas de doute il faut vérifier la matrice produite par la compilation en allant jeter un coup d'oeil à la fenêtre log.
Il existe d'autres commandes de construction de matrice et KSimPop permet de plus de définir des éléments de matrice qui sont calculés en fonction de l'indice de ligne et de colone. Ces possibilités sont présentées dans le chapitre Construire des matrices grâce à la balise <matrice>.