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