Problème d'un système d'équations en C et exécuté sur R
Bonjour à tous! :D
Voilà je débute depuis hier sur C. Je dois réaliser un système à trois équations sur C puis le lancer sur R.
Alors j'ai écrit mon script (joint ci-dessous) et je l'ai compilé sans problème en .so (via la commande R CMD SHLIB) afin de l'ouvrir sur R.
Puis, une fois sur R, j'ai envoyé la commande dyn.load("nomfichier.so").
Seulement, voilà : lorsque je fais une résolution du système d'équation à l'aide du package deSolve sous R, j'ai toujours l'erreur suivante :
« illegal input detected before taking any integration steps ».
De ce fait, j'ai essayé de trouver de la documentation là-dessus (comme celle de K Soetaert, T Petzoldt, RW Setzer, 2010) mais je ne trouve d'aide nulle part. Je pense que le problème vient de mon script en C mais comme je débute je ne sais pas où, ni par quoi, ni commencer et comment :?
J'ai quand même essayé de refaire le script en C avec un système d'équations encore plus simple et là, par contre, je n'arrive pas à compiler (dû à des erreurs de syntaxe) mais lorsque je regarde le script, je ne vois rien. Puis pourquoi trouver des fautes sur un script un peu plus simple et pas sur l'autre ?
Je vous joins donc le script en C et également la partie sur R (au cas où)
En espérant que quelqu'un puisse m'aider, car là je désespère. :(
Merci.
/*Sur C*/
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <R_ext/Rdynload.h>
#include <Rmath.h>
#include <stdio.h>
#include <math.h>
static double parms[3]
#define beta1 parms[0]
#define beta2 parms[1]
#define delta parms[2]
/* initializer */
void initmod(void (* odeparms)(int *, double *))
{
int N=3; /* N=3 car 3 paramètres */
odeparms(&N, parms);
}
#define S y[0]
#define I y[1]
#define R y[2]
#define dS ydot[0]
#define dI ydot[1]
#define dR ydot[2]
void derivs (int *neq, double *t, double *y, double *ydot, double *yout, int *ip)
{
if (ip[0] <1) error("nout should be at least 1");
double beta;
beta = beta1 * exp(-beta2);
dS=-(beta*S*I);
dI=(beta*S*I)-(delta*I);
dR=(delta*I);
yout[0]=S+I+R;
} |
## Sur R##
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
dyn.load("SI_2.so")
is.loaded("derivs")#vérifie si la fonction est bien chargée
#Données
##########
#vecteur temps:
time.out <- seq(400,1000,by =0.1)
#variables initiales:
init<-c(S=0.99,I=1-0.99, R=0)
#paramètres par défaut:
values<-c(beta1=0.02, beta2=0.08, delta=0.001)
ts.si <- data.frame(lsoda(
y = init, # Initial conditions for population
times = time.out, # Timepoints for evaluation
func = "derivs", # Function SI coder en C
parms = values, # Vector of parameters by default
dllname="SI_2",
initfunc="initmod",
nout=1,
outnames="N",
atol = 0
)) |