Go back to Flu Mortality


#include <stdio.h> #include <gsl/gsl_errno.h> #include <gsl/gsl_odeiv.h>

int func (double t, const double y[], double dydt[], void *params);

void SIR_solver (double *params, double *t, double *yin, double *ansS) {

const gsl_odeiv_step_type * T = gsl_odeiv_step_rkf45;
gsl_odeiv_step * s = gsl_odeiv_step_alloc (T, 2);
gsl_odeiv_control * c = gsl_odeiv_control_y_new (1e-6, 0.0);
gsl_odeiv_evolve * e = gsl_odeiv_evolve_alloc (2);

gsl_odeiv_system sys = {func, NULL, 2, params};

double t1 = t[0];
double t2 = t[1];

double h = 1e-6;

double y1 = yin[0];
double y2 = yin[1];

double y[2] = { y1, y2 };
  
  for (int i = 1; i <= t2; i++)
       {
         double ti = i * t1 / t2;
   
         while (t1 < ti)
           {
             gsl_odeiv_evolve_apply (e, c, s, &sys, &t1, ti, &h, y);
           }
           
         ansS[i] = y[0];
       }
gsl_odeiv_evolve_free (e);
  gsl_odeiv_control_free (c);
  gsl_odeiv_step_free (s);

}

int func (double t, const double y[], double dydt[], void *params) {

double beta = ((double *)params)[0];
double alpha = ((double *)params)[1];
double N = ((double *)params)[2];

dydt[0] = -1*beta*y[0]*y[1];
dydt[1] = (beta*y[0]*y[1]) - (alpha*y[1]);

return GSL_SUCCESS;

}