在 Monte Carlo 模拟中,使用 Metropolis 准则, 通常必须将随机数与玻尔兹曼分布进行比较,其中是模拟中两个状态之间的转换。
一个常见的优化是检查是否,在这种情况下,肯定小于。
对于我的模拟,指数函数的计算似乎花费了最多的时间,我正在寻找降低成本的方法。
我想到的一种方法是基于这样一个事实,即对于偶数,泰勒级数的下限,而对于奇数,它是上限。因此,可以编写如下函数,
static inline int fast_metropolis(double a, double x){
double est = 1.0 + x;
double f = x;
int i = 1;
while(true){
if(rand_num < est) return 1;
f *= x / (i + 1);
est += f;
if(rand_num > est) return 0;
f *= x / (i + 2);
est += f;
i += 2;
}
return 0;
}
不幸的是,事后看来,上面的代码并不是非常消极的论点,因为边界的绝对值增加了。
上面描述的方法是否有任何替代方法,即我们可以迭代地改进一些上限和下限,同时确保它们的绝对值正在减少?
还是我最好使用指数函数的一些“快速”估计?