Я хочу численно интегрировать с boost::math::quadrature::trapezoidal(g, a, b, 1e-6);
Здесь я интегрирую функцию g(x). Проблема в том, что я должен выполнить двойной интеграл. Кроме того, у меня есть 4 переменные в функции, которую я хочу интегрировать. 2 из них я передаю при интегрировании (m, n), а другие 2 - это переменные интегрирования (r, z). Это интеграл, который я хочу вычислить:
$$ \int_0^b\int_0^af(r,z)\sin{(\frac{n\pi}{a}z)}J_0(\frac{\alpha_{ 0,м}}{b}r)dzdr $$
Я видел этот пример Выполнение двумерного численного интегрирования с Boost Cpp и замечает, что он использует лямбда-функции для разделения основного интеграла на 2. до сих пор мне это удавалось
double integrate(int m, int n)
{
auto f1 = [](double r, double z, int m, int n) { return integrand(r,z,m,n); };
auto f = [&](double r, m) {
auto g = [&](double z, n) {
return f1(r, z);
};
//return gauss_kronrod<double, 61>::integrate(g, 0, a, 5);
return boost::math::quadrature::trapezoidal(g, 0, a, 1e-6);
};
double error;
//double Q = gauss_kronrod<double, 15>::integrate(f, 0, b, 5, 1e-9, &error);
double Q = boost::math::quadrature::trapezoidal(f, 0, b, 1e-6);
//std::cout << Q << ", error estimated at " << error <<std::endl;
return Q;
}
Реализация функции $f(r,z)$ и остальной части интеграла следующая
double initial(double r, double z, int m, int n)
{
return std::sin(M_PI*n*z/a)*std::cyl_bessel_j(0, boost::math::cyl_bessel_j_zero(0,m)*r/b);
}
double integrand(double r,double z,int n,int m)
{
return initial(r,z,m,n)*std::sin(M_PI*n*z/a)*std::cyl_bessel_j(0, boost::math::cyl_bessel_j_zero(0,m)*r/b);
}
Обычно Initial не нуждается в них и n переменных, но в этом случае мне нужно провести некоторые тесты.
Проблема в том, что я действительно не понимаю, как разделить мою функцию, как в примере для моей проблемы, и выполнить интеграцию, потому что boost принимает только 1 переменную функцию.
Пожалуйста помоги