Blame doc/examples/ode-initval.c

Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_matrix.h>
Packit 67cb25
#include <gsl/gsl_odeiv2.h>
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
func (double t, const double y[], double f[],
Packit 67cb25
      void *params)
Packit 67cb25
{
Packit 67cb25
  (void)(t); /* avoid unused parameter warning */
Packit 67cb25
  double mu = *(double *)params;
Packit 67cb25
  f[0] = y[1];
Packit 67cb25
  f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1);
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
jac (double t, const double y[], double *dfdy, 
Packit 67cb25
     double dfdt[], void *params)
Packit 67cb25
{
Packit 67cb25
  (void)(t); /* avoid unused parameter warning */
Packit 67cb25
  double mu = *(double *)params;
Packit 67cb25
  gsl_matrix_view dfdy_mat 
Packit 67cb25
    = gsl_matrix_view_array (dfdy, 2, 2);
Packit 67cb25
  gsl_matrix * m = &dfdy_mat.matrix; 
Packit 67cb25
  gsl_matrix_set (m, 0, 0, 0.0);
Packit 67cb25
  gsl_matrix_set (m, 0, 1, 1.0);
Packit 67cb25
  gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0);
Packit 67cb25
  gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0));
Packit 67cb25
  dfdt[0] = 0.0;
Packit 67cb25
  dfdt[1] = 0.0;
Packit 67cb25
  return GSL_SUCCESS;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
main (void)
Packit 67cb25
{
Packit 67cb25
  double mu = 10;
Packit 67cb25
  gsl_odeiv2_system sys = {func, jac, 2, &mu};
Packit 67cb25
Packit 67cb25
  gsl_odeiv2_driver * d = 
Packit 67cb25
    gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd,
Packit 67cb25
				  1e-6, 1e-6, 0.0);
Packit 67cb25
  int i;
Packit 67cb25
  double t = 0.0, t1 = 100.0;
Packit 67cb25
  double y[2] = { 1.0, 0.0 };
Packit 67cb25
Packit 67cb25
  for (i = 1; i <= 100; i++)
Packit 67cb25
    {
Packit 67cb25
      double ti = i * t1 / 100.0;
Packit 67cb25
      int status = gsl_odeiv2_driver_apply (d, &t, ti, y);
Packit 67cb25
Packit 67cb25
      if (status != GSL_SUCCESS)
Packit 67cb25
	{
Packit 67cb25
	  printf ("error, return value=%d\n", status);
Packit 67cb25
	  break;
Packit 67cb25
	}
Packit 67cb25
Packit 67cb25
      printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
Packit 67cb25
    }
Packit 67cb25
Packit 67cb25
  gsl_odeiv2_driver_free (d);
Packit 67cb25
  return 0;
Packit 67cb25
}