c++ - 蒙特卡洛 C++ 中标准偏差的通用函数

标签 c++ generic-programming montecarlo

我应该在一些蒙特卡洛模拟中计算标准偏差函数。公式是这样的: enter image description here

我认为我的结果与应有的结果相去甚远。我的函数使用来自 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) ;
 }
  1. 谁能看出这里有什么错误吗?
  2. 另外,STL 库中有“累加”函数 - 是否存在累加平方(容器的成员)?

最佳答案

只需使用 Boost.Accumulators (因为你已经使用了 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

关于c++ - 蒙特卡洛 C++ 中标准偏差的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404473/

相关文章:

java - m_coloring 的蒙特卡罗估计

haskell - 如何在计算随机值的 haskell 程序中构造 monad?

r - 在R中以随机顺序分组匹配数字

c++ - 在多继承场景下使用虚基类时,是不是所有的派生类都需要引用虚基类?

c++ - 下面的 boost 代码有什么作用?

rust - 在 Rust 中为什么需要类型注释,即使它们在通用特征中明确指定

language-agnostic - 在正式软件设计中处理非晶子系统

c++ - 重载显式构造函数的不直观行为

c++ - gcc:链接外部库

c++ - 在通用 C++ 代码中移动基于范围的循环?