Bonjour à tous,

Je suis atuellement en train de réaliser un code en C et de le compiler sur R.

Le problème est que lorsque je compile mon code en C j'ai le message suivant "f3I.c:34:0: attention : « I » redéfini [enabled by default]" "
et lorsque j'ouvre le modèle sous R, celui ci ne fonctionne que pour certaines valeurs de paramètres.

Le problème vient de la fonction f3 (le code est en entier à la fin de la discussion):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
if(*t<=te) f3=kapa;
if(*t>te) f3 =  d*I;
Je crois que C n'apprécie pas que j'utilise la variable d'état I, mais je souhaiterai faire varier mon paramètre tau en fonction de cette variable d'état dans mon modèle.
j'ai essayer de réécrire le modèle autrement, par exemple en supprimant la fonction f3 et en l'insérer directement dans le modèle comme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
     if(*t<=te)
    dSdt = -betabis*S*I + alpha * exp(-kapa * (*t-t0)) * S * (1 - (S+I) / K )- delta*S ; 
    if(*t>te)
    dSdt = -betabis*S*I + alpha * exp(-d*I * (*t-t0)) * S * (1 - (S+I) / K )- delta*S ;
Mais cela ne fonctionne pas non plus. Quelqu'un aurait il une idée de comment réécrire le code afin de ne plus avoir ce message d'erreur?

Merci beaucoup pour votre aide et bonne journée.



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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
/* file lorenz.c */
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <R_ext/Rdynload.h>
#include <Rmath.h>
#include <stdio.h>
#include <math.h>
#include <tgmath.h>
 
static double parms[10];
#define K parms[0]
#define kapa parms[1]
#define t0 parms[2]
#define alpha parms[3]
#define sigma parms[4]
#define ts parms[5]
#define te parms[6]
#define gamma parms[7]
#define beta parms[8]
#define d parms[9]
 
 
/* initializer  */
void initmod(void (* odeparms)(int *, double *))
{
    int N = 10;
    odeparms(&N, parms);
}
 
#define S y[0]
#define I y[1]
#define D y[2]
#define R y[3]
#define dSdt ydot[0]
#define dIdt ydot[1]
#define dDdt ydot[2]
#define dRdt ydot[3]
 
 
/* Derivatives and 1 output variable */
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 gammabis ;
if(*t<=ts) gammabis=0* *t;
if(*t>ts) gammabis=gamma; 
 
double betabis ;
if(*t<=ts) betabis=0* *t;
if(*t>ts) betabis=beta; 
 
double delta ;
if(*t<=ts) delta=0* *t;
if(*t>ts) delta=sigma *(1- exp(-kapa * (*t-ts)));
 
double f3 ;
if(*t<=te) f3=kapa;
if(*t>te) f3 =  d*I;
 
double tau ;
tau=alpha * exp(-f3 * (*t-t0));
 
    dSdt = -betabis*S*I + alpha * exp(-tau* (*t-t0)) * S * (1 - (S+I) / K )- delta*S ; 
    dIdt = betabis * S * I - (delta+gammabis) *I;
 
yout[0] = S + I  ;
 
}
 
/* END file mymod.c */