Я должен вычислить функцию стандартного отклонения в некоторых симуляциях Монте-Карло. Формула такая:
Я думаю, что мои результаты далеки от того, какими они должны быть. Моя функция использует кортежи из библиотеки 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) ;
}
- Может ли кто-нибудь увидеть здесь какие-либо ошибки?
- Кроме того, в библиотеке STL есть функция «накопить» - существует ли накопление в квадрате (члены контейнера)?