Я хотел бы выполнить следующую одномерную интеграцию в С++ с использованием gsl,
I(x) = int_{x/4}^1 dy y^{3/2+a} (1-y)^{1/2} exp(1.13*sqrt(log(4y/x))),
, где a
и x
рассматриваются как константы интегрирования, и я хотел бы иметь возможность выполнить интегрирование для x
, выбранных в интервале 0.000001<x<0.001
для фиксированного a
, предоставленного пользователем.
Вот моя попытка:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include <gsl/gsl_integration.h>
#include <stdio.h>
#include <math.h>
double integrand(double y, void * params) {
double a = *(double *) params;
double x = *(double *) params;
double intg = pow(y,3e0/2e0+a)*pow(1-y,1e0/2e0)*exp(1.13*sqrt(log(4*y/x)));
return intg;
}
double integral(double a) {
gsl_integration_workspace * w
= gsl_integration_workspace_alloc (1000);
gsl_function F;
F.function = &integrand;
F.params = &a;
double result, error;
for(int i = 0; i<100; i++) {
double x = (0.001-0.000001)*i/100 + 0.000001;
gsl_integration_qags (&F, x/4, 1e0, 0, 1e-7, 1000,
w, &result, &error);
}
gsl_integration_workspace_free (w); // Free memory
return result;
}
int main(){
std::cout << "x" << x << "result "<< integral(-0.046)<<std::endl;
}
Проблема, с которой я сталкиваюсь, заключается в том, как передать значение x
, заданное циклом for, в подынтегральное выражение? На данный момент код возвращает nan
, потому что я не передаю x
в подынтегральное выражение, а только в зависимость от x в нижней границе интегрирования. Все еще новичок в C++, поэтому заранее извиняюсь за возможную простоту моего вопроса.