Bonjour à tous!
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 :
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« illegal input detected before taking any integration steps ».
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*/
## Sur R##
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ))
Partager