使用 Boost Cpp 执行 2d 数值积分

计算科学 正交 一体化 C 图书馆
2021-12-03 02:25:41

我一直在学习将Boost库的数值求积用于Cpp在文档中,我找到了一个使用Boost1D Gauss-Kronrod Quadrature示例

#include <boost/math/quadrature/gauss_kronrod.hpp>
#include <iostream>

int main(int argc, char *argv[])
{

using namespace boost::math::quadrature;

auto f1 = [](double t) { return std::exp(-t*t / 2); };

double error;
double Q = gauss_kronrod<double, 61>::integrate(f1, 0, std::numeric_limits<double>::infinity(), 5, 1e-14, &error);
std::cout << Q << " " << error<<std::endl;
    return 0;
}

这计算积分

Q=0et2dt

最大公差1e-14和最大深度5我正在尝试以此为基础并计算这样的双积分(容积)

Q=00e(t2+s2+ts)dt ds

我一直在尝试使用两个一维积分来计算这个双积分。我试图查找是否有任何双重积分功能,但没有找到,所以这是我迄今为止尝试过的

#include <boost/math/quadrature/gauss_kronrod.hpp>
#include <iostream>

int main(int argc, char *argv[])
{

using namespace boost::math::quadrature;

auto f1 = [](double t, double s) { return std::exp(-(t*t+s*s+t*s) / 2); };

double error;
double Q = gauss_kronrod<double, 15>::integrate(gauss_kronrod<double, 61>::integrate(f1, 0, std::numeric_limits<double>::infinity(), 5), 0, std::numeric_limits<double>::infinity(), 5, 1e-9, &error);
std::cout << Q << " " << error<<std::endl;
    return 0;
}

在这里,我介绍了 2 个变量的积分。两个一维正交函数是嵌套的。但这会产生编译错误。 我做错了什么,还有其他更简洁的方法来进行二维数值积分吗?

1个回答

您没有找到 2D 正交的原因是我们还没有实现它。至于您的编译失败,这可以解决问题:

#include <boost/math/quadrature/gauss_kronrod.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
    using namespace boost::math::quadrature;

    auto f1 = [](double t, double s) { return std::exp(-(t*t+s*s+t*s) / 2); };
    auto f = [&](double t) {
        auto g = [&](double s) {
            return f1(t, s);
        };
        return gauss_kronrod<double, 61>::integrate(g, 0, std::numeric_limits<double>::infinity(), 5);
    };

    double error;
    double Q = gauss_kronrod<double, 15>::integrate(f, 0, std::numeric_limits<double>::infinity(), 5, 1e-9, &error);
    std::cout << Q << ", error estimated at " << error <<std::endl;
    return 0;
}

这对我来说是 1.2092。