C++ 蒙特卡罗C+中标准差的一般函数+;

C++ 蒙特卡罗C+中标准差的一般函数+;,c++,generic-programming,montecarlo,C++,Generic Programming,Montecarlo,我应该在一些蒙特卡罗模拟中计算标准偏差函数。公式如下: 我认为我的结果与预期相差甚远。我的函数使用boost库中的元组,如下所示: double add_square(double prev_sum, double new_val) { return prev_sum + new_val*new_val; } template <typename V> double vec_add_squares(const V<double>& v) { retur

我应该在一些蒙特卡罗模拟中计算标准偏差函数。公式如下:

我认为我的结果与预期相差甚远。我的函数使用boost库中的元组,如下所示:

double add_square(double prev_sum, double new_val)
{
  return prev_sum + new_val*new_val;
}

template <typename V>
double vec_add_squares(const V<double>& v)
{
  return std::accumulate(v.begin(), v.end(), 0.0, add_square);
}

    template <class T> 
    boost::tuple<double,double> get_std_dev_and_error(const vector<T>& input, double r, double N)
{
 double M = double(input.size());

 double sum = std::accumulate(input.begin(),input.end(),0.0);
 double Squared_sum = vec_add_squares(input);

 std::cout << "sum " << Squared_sum << endl;

 // Calls Sum
 double term1 = Squared_sum - (sum/M)*sum;

 double SD = (sqrt(term1) * exp(-2.0 * r *N))/(M-1) ;
 double SE = SD/sqrt(M);
 std::cout << "SD = " << SD << endl;
 std::cout << "SE = " << SE << endl;

 return boost::tuple<double,double>(SD, SE) ;
 }
double add\u square(双上和,双新值)
{
返回上一个总和+新值*新值;
}
模板
双矢量加平方(常数V&V)
{
返回std::累加(v.begin(),v.end(),0.0,加平方);
}
模板
boost::tuple get_std_dev_和_error(常量向量和输入,双r,双N)
{
double M=double(input.size());
double sum=std::累加(input.begin(),input.end(),0.0);
双平方和=向量加平方(输入);
std::cout只需使用(正如您已经使用boost):


例如,您可以为PSIA的答案编写自己的函数。我确实按照上面的代码编写了自己的函数,但我得到了错误的结果,因此它一定是错误的或在程序中实现错误。仅供参考,错误指示器自身的错误可能非常大。获得蒙特卡罗模拟的置信区间比通常认为的要困难。Yes、 它相当大…我知道它是错误的原因是因为我被告知结果。也许是一个询问计算公式的好地方?我真的很喜欢Boost。累加器-我对标准偏差有点太快了,它不是累加器的一部分(不幸的是)…我将添加一张formula@Mathias:你可以在
boost::累加器中找到方差。只需取它的平方根(不要忘记你的额外因子
exp(-2rT)/(M-1)
)。无论如何,不要使用你发布的公式——它在许多情况下非常不稳定(boost使用一个稳定的在线方差公式).当我试图从中重新编写公式时,我仍然无法得到与上面发布的公式相同的公式(除了exp(-2Tr))@AlexandreC。对不起,忘记标记了you@Mathias:您的公式读数约为SD=sqrt(方差)*exp(-2rT)/sqrt(M-1)。应该有M/(M-1)在第一个和之前,分母应该是M而不是M-1,这正是标准的stdev估计器,你可以从boost::累加器中得到;
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>
#include <ostream>

using namespace boost;
using namespace boost::accumulators;
using namespace std;

int main()
{
    accumulator_set<double, stats<tag::sum , tag::variance, tag::mean > > acc;
    double data[] = {1., 2., 3.};
    acc = for_each(data, acc);
    cout << "sum = " << sum(acc) << endl;
    cout << "variance = " << variance(acc) << endl;
    cout << "sqrt(variance()) = " << sqrt(variance(acc)) << endl;
    cout << "mean = " << mean(acc) << endl;
}
sum = 6
variance = 0.666667
sqrt(variance()) = 0.816497
mean = 2