Я пытаюсь вычислить многократное интегрирование, используя библиотеку gsl, но это кажется бесконечным, потому что значение chisq постоянно равно 0. Вот мой метод интегрирования:
double Integr::Fgg(double x_val, double k_val){
double result, error;
double bound_up[] = {2*M_PI, 2*M_PI, k_max, k_max};
double bound_down[] = {0,0,k_min, k_min};
const gsl_rng_type *T;
gsl_rng *r;
struct f_params params = {x_val, k_val};
gsl_monte_function Fgg = {&Integr::integrant_prot, 4, ¶ms};
size_t calls = 5000;
gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc(T);
//warm up
gsl_monte_vegas_state *s = gsl_monte_vegas_alloc(4);
gsl_monte_vegas_integrate(&Fgg, bound_down, bound_up, 4, 1000, r, s, &result, &error);
//integration
do{
gsl_monte_vegas_integrate(&Fgg, bound_down, bound_up, 4, calls/5, r, s, &result, &error);
}while(fabs(s->chisq - 1.0)>0.5);
gsl_monte_vegas_free(s);
return result;
}
Кто-нибудь может сказать, почему это значение не меняется? Что-то не так с моим кодом или с использованием моего gsl? Я должен признать, что я новичок в gsl.
[редактировать] Интегральная функция:double Integr::integrant_prot(double *args, size_t dim, void *params){
struct f_params *fp = (struct f_params *) params;
return Integr::integrantFgg(fp->x_val, fp->k_val, args[0], args[1], args[2], args[3]);
}
Задача ещё не решена.