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 :

« 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 : 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;
 
}
## 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
 
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
))