首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用boost::math中的高斯-克朗罗德求积对复杂函数进行积分

使用boost::math中的高斯-克朗罗德求积对复杂函数进行积分
EN

Stack Overflow用户
提问于 2019-05-15 03:09:51
回答 1查看 365关注 0票数 3

我正在尝试使用Boost提供的高斯-克朗罗德求积在C++中将一个具有实数参数和复数返回值的函数(如f(x) =1+i)在域0,5上进行数值积分。

我已经使用boost来解决实际的积分器问题,所以库安装正确。documentation说“高斯-克朗罗德求积支持在实数行上定义的被积函数,并返回复数值。”

代码语言:javascript
复制
#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 << "\n";
    return 0;
}

我的预期结果是5+ 5i。我得到了编译器错误

代码语言:javascript
复制
/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定义。我是不是误读了文档,无法进行复杂的集成?

编辑:将代码更改为user14717提供的版本会给我一个新的编译器错误:

代码语言:javascript
复制
/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;
                                        ^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-15 03:21:40

修复方法如下:

代码语言:javascript
复制
#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 << "\n";
    return 0;
}

你的错误是你在复杂类型上模板化了。模板参数必须是真实类型。

我注意到文档没有在这里提供示例,所以您实际上没有办法知道这一点。我会为此提交一个补丁。。。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56137060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档