如何向Boost C++ Gauss-Kronrod积分器动态传递参数PAR?
解决Boost Gauss-Kronrod积分动态传入参数PAR的问题
方法1:使用捕获变量的Lambda表达式
将Lambda定义在main函数内部,通过值捕获或引用捕获PAR,即可实现参数的动态传入:
#include <boost/math/quadrature/gauss_kronrod.hpp> #include <cmath> #include <cstdio> using namespace boost::math::quadrature; int main(){ double result, error; double PAR = 2.0; // 可随时修改该值 double PI = M_PI; // 在main内定义Lambda,捕获当前PAR值 auto f2 = [PAR](double t) { return std::exp(-t*t / 2)*std::cos(PAR*t); }; result = gauss_kronrod<double, 15>::integrate(f2, 0, PI, 5, 1e-9, &error); printf("result =%.15lf, error = %.15lf\n",result,error); // 修改PAR后重新计算 PAR = 3.0; auto f3 = [PAR](double t) { return std::exp(-t*t / 2)*std::cos(PAR*t); }; result = gauss_kronrod<double, 15>::integrate(f3, 0, PI, 5, 1e-9, &error); printf("result =%.15lf, error = %.15lf\n",result,error); return 0; }
若需多次修改PAR且不想重复定义Lambda,可使用引用捕获(需确保PAR的生命周期覆盖积分计算过程):
// 引用捕获PAR,后续修改PAR会直接影响Lambda的计算逻辑 auto f = [&PAR](double t) { return std::exp(-t*t / 2)*std::cos(PAR*t); }; PAR = 1.5; result = gauss_kronrod<double, 15>::integrate(f, 0, PI, 5, 1e-9, &error);
方法2:使用函数对象(仿函数)
如果需要更灵活的参数管理,可定义带成员变量的仿函数类封装参数:
#include <boost/math/quadrature/gauss_kronrod.hpp> #include <cmath> #include <cstdio> using namespace boost::math::quadrature; class Integrand { private: double par_; public: // 构造函数传入参数 Integrand(double par) : par_(par) {} // 重载()运算符,作为积分计算的入口 double operator()(double t) const { return std::exp(-t*t / 2)*std::cos(par_*t); } }; int main(){ double result, error; double PI = M_PI; // 初始化带指定参数的函数对象 Integrand f(2.0); result = gauss_kronrod<double, 15>::integrate(f, 0, PI, 5, 1e-9, &error); printf("result =%.15lf, error = %.15lf\n",result,error); // 重新构造带新参数的对象进行计算 Integrand f_new(3.0); result = gauss_kronrod<double, 15>::integrate(f_new, 0, PI, 5, 1e-9, &error); printf("result =%.15lf, error = %.15lf\n",result,error); return 0; }
关键说明
Boost的gauss_kronrod::integrate函数支持任何可调用对象(Lambda、仿函数、函数指针等),只要该对象能接收一个double类型参数并返回double。原代码的核心问题是Lambda定义在main外部,无法捕获main内部的PAR变量,将Lambda移至main内部并捕获变量即可解决问题。
内容的提问来源于stack exchange,提问作者Debasish Banerjee
相关产品推荐
相关产品推荐

