error: ‘foo’ is not captured Lambda function and boost integration

error: ‘foo’ is not captured Lambda function and boost integration

我正在尝试使用 Boost 库求积法执行数值积分。我是这样用梯形做的

double integrand(double xp, double yp, double x, double y, double a, double b) {
    double eps;
    if(x - xp == 0 && y - yp == 0)
        eps = 1e-6;
    else
        eps = 0.0;

    return std::log(std::hypot(x - xp + eps, y - yp + eps)) * w(xp, yp);
}
double integrate(double x, double y, double a, double b) {
    auto inner_integral = [m, n, a, b](double yp) {
        auto f = [z, m, n, a, b](double xp) { return integrand(xp, yp, x, y, a, b); };
        return boost::math::quadrature::trapezoidal(f, 0.0, a, 1e-8);
    };
    return boost::math::quadrature::trapezoidal(inner_integral, 0.0, b, 1e-8);
}

这很好用,但是因为我们有一个接近 log(0) 的不确定性,所以需要很多时间,所以我搜索了一个替代方案。在 Boost 中,他们有一些针对这种情况的集成方法,所以我决定尝试 tanh_sinh 方法。我按照给定的例子这样实现的。

double Integrate(double x, double y, double a, double b) {
    boost::math::quadrature::tanh_sinh<double> integrator;
    auto inner_integral = [x, y, a, b](double yp) {
        auto f = [yp, x, y, a, b](double xp) { return integrand(xp, yp, x, y, a, b); };
        return integrator.integrate(f, 0.0, a);
    };
    return integrator.integrate(inner_integral, 0.0, b);
}

问题是当我编译时它说 error: ‘integrator’ is not captured 后跟 note: the lambda has no capture-default 和一个巨大的错误。

我做错了什么?为什么不起作用?

问题正是它所说的。您的 lambda 未捕获 integrator。将 [x,y,a,b] 更改为 [x,y,a,b,integrator] 以按值捕获或将 [x,y,a,b,&integrator] 更改为按引用捕获。

或者,您可以使用 [=] 按值捕获所有内容,或使用 [&].

按引用捕获所有内容

语法见lambda expressions