|
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 |
}
|