Как ссылаться на матрицу Якоби как нулевой указатель, используя библиотеку GSL - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь научиться использовать библиотеку GSL, и я застрял в чем-то с функцией "gsl_odeiv2_system" (см. https://www.gnu.org/software/gsl/doc/html/ode-initval.html#c.gsl_odeiv2_system)

. Говорят, что не каждая шаговая функция нуждается в матрице Якобичтобы вычислить интеграцию, поэтому я пытаюсь пересоздать пример, который они приводят без него, но я не понимаю, что делать, когда они говорят: «Якобианский элемент структуры может быть заменен нулевым указателем для этих алгоритмов)».

функция написана так:

gsl_odeiv2_system sys = {func, jac, 2, &mu};

, а аргумент Jac написан так:

int
jac (double t, const double y[], double *dfdy,
 double dfdt[], void *params) {
(void)(t); /* avoid unused parameter warning */
double mu = *(double *)params;
gsl_matrix_view dfdy_mat = gsl_matrix_view_array (dfdy, 2, 2);
gsl_matrix * m = &dfdy_mat.matrix;

gsl_matrix_set (m, 0, 0, 0.0);
gsl_matrix_set (m, 0, 1, 1.0);
gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0);
gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0));

dfdt[0] = 0.0;
dfdt[1] = 0.0;
return GSL_SUCCESS;
}

1 Ответ

0 голосов
/ 09 октября 2019

Они означают, что вы должны сдать, например, NULL в качестве второго параметра для system. Как ниже.

#include <gsl/gsl_odeiv2.h>
#include <gsl/gsl_errno.h>

int f (double t, const double y[], double x[], void *params) {
  //Some calculation
  // x[0] = ...;
  // x[1] = ...;
  return GSL_SUCCESS;
}

struct parameters {
  double alpha;
  int step;
  parameters (double a, int s) : alpha(a), step(s) {}
};

int main () {

  parameters p(1.0,1);
  gsl_odeiv2_system system = {f, NULL, 2, &p};
  gsl_odeiv2_driver * driver = gsl_odeiv2_driver_alloc_y_new (
    &system, gsl_odeiv2_step_rkf45, 1.e-6, 1.e-6, 0.);

  ...

  return 0;
}
...