Интегрирование комплексной функции с использованием квадратуры Гаусса-Кронрода из boost :: math

Я пытаюсь интегрировать функцию с реальными аргументами и комплексным возвращаемым значением, таким как f (x) = 1 + i, в области [0, 5] численно в C ++, используя квадратуру Гаусса-Кронрода, как это предусмотрено Boost.

Я использовал boost, чтобы найти настоящие интеграды, которые работали, поэтому библиотека установлена ​​правильно. Документация гласит: «Квадратурные опорные функции Гаусса-Кронрода определены на реальной линии и возвращают сложные значения».

#include <iostream> #include <cmath> #include <complex> #include <boost/math/quadrature/gauss_kronrod.hpp> using namespace boost::math::quadrature; using complex = std::complex<double>; complex f(double t){ return complex{1, 1}; }; int main() { complex error; complex a{0}; complex b{5}; unsigned int max_depth = 0; complex tolerance = 0; complex Q = gauss_kronrod<complex, 61>::integrate(f, a, b, max_depth, tolerance, &error); std::cout << Q << ", " << error << "
"; return 0; } 

Мой ожидаемый результат будет 5 + 5i. Я получаю ошибку компилятора

/usr/include/boost/math/quadrature/gauss_kronrod.hpp:1871:17: error: no match for 'operator<=' (operand types are 'std::complex<double>' and 'std::complex<double>')

это означает, что некоторые операторы не определены для std :: complex. Я неправильно читаю документацию, и сложная интеграция невозможна?

изменить: изменение моего кода на версию, предоставленную

/usr/include/boost/math/quadrature/gauss_kronrod.hpp: In instantiation of 'static boost::math::quadrature::gauss_kronrod<Real, N, Policy>::value_type boost::math::quadrature::gauss_kronrod<Real, N, Policy>::integrate(F, Real, Real, unsigned int, Real, Real*, Real*) [with F = std::complex<double> (*)(double); Real = double; unsigned int N = 61; Policy = boost::math::policies::policy<boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy, boost::math::policies::default_policy>; boost::math::quadrature::gauss_kronrod<Real, N, Policy>::value_type = double]':
/home/olaf/testing numerical integration/boost/main.cpp:21:91:   required from here
/usr/include/boost/math/quadrature/gauss_kronrod.hpp:1877:47: error: cannot convert 'std::complex<double>' to 'double' in return
                return f(t*inv)*(1 + t_sq)*inv*inv;
                                               ^~~
/usr/include/boost/math/quadrature/gauss_kronrod.hpp:1890:32: error: cannot convert ?std::complex<double>? to 'double' in return
                return f(arg)*z*z;
                                ^
/usr/include/boost/math/quadrature/gauss_kronrod.hpp:1907:40: error: cannot convert 'std::complex<double>' to 'double' in return
                return f(b - arg) * z * z;
                                        ^

Всего 1 ответ


Вот исправление:

 #include <iostream> #include <cmath> #include <complex> #include <boost/math/quadrature/gauss_kronrod.hpp> using namespace boost::math::quadrature; using complex = std::complex<double>; complex f(double t){ return complex{1, 1}; }; int main() { double error; double a{0}; double b{5}; unsigned int max_depth = 0; double tolerance = 0; complex Q = gauss_kronrod<double, 61>::integrate(f, a, b, max_depth, tolerance, &error); std::cout << Q << ", " << error << "
"; return 0; } 

Ваша ошибка в том, что вы используете шаблон сложного типа. Аргумент шаблона должен быть реальным типом.

Я отмечаю, что в документации здесь нет примера, поэтому у вас не было возможности узнать это. Я отправлю патч для этого. , ,