超立方体上的数值积分:求高效计算[0,1)^d积分的工具库
适合高维快速积分的工具库及方案
Boost.Math 蒙特卡洛积分模块
Boost的蒙特卡洛积分天生支持任意维度,靠随机采样而非规则网格,速度比你现在用的方法快得多,完全符合你优先速度的需求。它能直接接受带&捕获的lambda,只要lambda的参数能匹配输入的点类型(比如const std::array<double, d>&),调用起来也没什么复杂配置,拿来就能用。GSL 蒙特卡洛积分
GNU科学库的蒙特卡洛积分同样适配任意维度,核心也是随机采样,速度表现出色。对于带捕获的lambda,你可以用std::function把lambda包一下,就能适配GSL的函数接口,或者直接利用C++11+的特性把lambda转成可调用对象传入,满足你的函数要求。自己写极简蒙特卡洛实现
如果不想依赖第三方库,手动写个蒙特卡洛积分也超简单高效:生成N个[0,1)^d里的随机点,算每个点的函数值取平均就行(因为区域体积是1,不用额外乘系数)。这种实现完全可控,速度拉满,而且天然支持带捕获的lambda——直接把lambda传进去就行。给个示例代码:#include <random> #include <functional> #include <array> template <size_t D> double fast_monte_carlo(const std::function<double(const std::array<double, D>&)>& func, size_t num_samples) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<double> dist(0.0, 1.0); double sum = 0.0; for (size_t i = 0; i < num_samples; ++i) { std::array<double, D> point; for (auto& coord : point) { coord = dist(gen); } sum += func(point); } return sum / num_samples; }调用的时候直接传带捕获的lambda:
double weight = 3.5; auto result = fast_monte_carlo<4>([&](const std::array<double, 4>& p) { return p[0] * weight + p[1] + p[2] * p[3]; }, 200000);
内容的提问来源于stack exchange,提问作者0xbadf00d
相关产品推荐
相关产品推荐

