Je travail sur un model de dynamique des populations. J'ai besoin d'ecrire une fonction qui m'ecrive et resolve un systeme d'equations differentielles, a partir d'une matrice d'interaction decrivant un reseau trophique.
J'ai reussi a ecrire cette fonction pour un nombre connus d'especes. Voici mon script pour un reseau de 5 especes:
Code : Tout sélectionner
##----------------------------------------------------------------##
## Write and solve the ODE model for a 5 species community ##
##----------------------------------------------------------------##
Solve.fdwb.5sp <- function(y, pop.init = c(n1=10,n2=10,n3=10,n4=10,n5=10), step = 1000)
{
## The argument y must be a product of the function Draw.int.strength()
library(odesolve)
# Creation of the ODE system:
qim <- y[[4]] # Interaction parameters
a11=qim[1,1]
a12=qim[1,2]
a13=qim[1,3]
a14=qim[1,4]
a15=qim[1,5]
a21=qim[2,1]
a22=qim[2,2]
a23=qim[2,3]
a24=qim[2,4]
a25=qim[2,5]
a31=qim[3,1]
a32=qim[3,2]
a33=qim[3,3]
a34=qim[3,4]
a35=qim[3,5]
a41=qim[4,1]
a42=qim[4,2]
a43=qim[4,3]
a44=qim[4,4]
a45=qim[4,5]
a51=qim[5,1]
a52=qim[5,2]
a53=qim[5,3]
a54=qim[5,4]
a55=qim[5,5]
k <- y[[3]] # Carrying capacity
K1=k[1]
K2=k[2]
K3=k[3]
K4=k[4]
K5=k[5]
LV.model <- function(t, x, parms)
{
n1 <- x[1]
n2 <- x[2]
n3 <- x[3]
n4 <- x[4]
n5 <- x[5]
# Populations dynamic ODEs
dn1 <- (1-(n1/K1)) * (a11*n1) + (a12*n2*n1) + (a13*n3*n1) + (a14*n4*n1) + (a15*n5*n1)
dn2 <- (1-(n2/K2)) * ((a21*n1*n2) + (a22*n2)) + (a23*n3*n2) + (a24*n4*n2) + (a25*n5*n2)
dn3 <- (1-(n3/K3)) * ((a31*n1*n3) + (a32*n2*n3) + (a33*n3)) + (a34*n4*n3) + (a35*n5*n3)
dn4 <- (1-(n4/K4)) * ((a41*n1*n4) + (a42*n2*n4) + (a43*n3*n4) + (a44*n4)) + (a45*n5*n4)
dn5 <- (1-(n5/K5)) * ((a51*n1*n5) + (a52*n2*n5) + (a53*n3*n5) + (a54*n4*n5)) + (a55*n5)
return(list(c(dn1, dn2, dn3, dn4, dn5)))
}
t <- seq(from=1, to=step, length=step) # Time sequence
parms <- c(a11,a12,a13,a14,a15,
a21,a22,a23,a24,a25,
a31,a32,a33,a34,a35,
a41,a42,a43,a44,a45,
a51,a52,a53,a54,a55,
K1,K2,K3,K4,K5)
pop.dyn <- lsoda(y=pop.init, times=t, func=LV.model, parms) #Solver
return(pop.dyn)
}
Voici un exemple des objets y[[4]] et y[[3]] utilise' dans cette fonction:
Code : Tout sélectionner
y[[4]] # Matrice d'interaction entre 5 sp
[,1] [,2] [,3] [,4] [,5]
[1,] 0.3085765 0.00000000 -0.3634194 -0.5988247 -0.4239148
[2,] 0.0000000 0.20881228 0.0000000 -0.2723391 0.0000000
[3,] 0.1205536 0.00000000 0.0000000 -0.3395979 0.0000000
[4,] 0.8772238 0.01030920 0.7149582 0.0000000 -0.2277903
[5,] 0.3504805 0.00000000 0.0000000 0.2576328 -0.1433585
y[[3]] # Vecteur contenant la capacite' biotique de chaque sp
[1] 100.000000 100.000000 10.000000 4.641589 2.154435
Mon probleme est que je voudrais generaliser cette fonction pour pouvoir l'appliquer a des communautes d'especes de differentes tailles.
Si j'ai bien compris l'enjeu du probleme, il me faut ecrire une fonction qui sache elle meme ecrire un script du model dans un fichier texte (avec le bon nombre de parametres, d'equations, ...) puis qui rappele ce script pour en resoudre le systeme d'equation.
Je voudrais donc savoir (1) si ce raisonement est bon ?
(2) Si oui, est ce que quelqu'un saurait me donner au moins une piste sur la facon de programmer une telle chose.
(2 bis) Si non, comment faire ?
J'espere que quelqu'un saura m'aider
Merci d'avance
Johan