Сначала нам нужны некоторые, чтобы получить доступ к нормальному распределению, алгоритмы, чтобы найти местоположение (и некоторые результаты std, конечно).
#include <boost/math/distributions/normal.hpp>
using boost::math::normal;
#include <boost/math/distributions/cauchy.hpp>
using boost::math::cauchy;
#include <boost/math/distributions/find_location.hpp>
using boost::math::find_location;
#include <boost/math/distributions/find_scale.hpp>
using boost::math::find_scale;
using boost::math::complement;
using boost::math::policies::policy;
#include <iostream>
using std::cout; using std::endl;
#include <iomanip>
using std::setw; using std::setprecision;
#include <limits>
using std::numeric_limits;
Для этого примера мы будем использовать стандартное нормальное распределение со средним (местоположением) нулем и стандартным отклонением (масштабным) единством. Это также дефолт для этой реализации.
normal N01;
double sd = 1.;
Предположим, мы хотим найти другое нормальное распределение, среднее которого смещается так, что только доля p (здесь 0,001 или 0,1%) ниже определенного выбранного предела (здесь -2, два стандартных отклонения).
double z = -2.;
double p = 0.001;
cout << "Normal distribution with mean = " << N01.location()
<< ", standard deviation " << N01.scale()
<< ", has " << "fraction <= " << z
<< ", p = " << cdf(N01, z) << endl;
cout << "Normal distribution with mean = " << N01.location()
<< ", standard deviation " << N01.scale()
<< ", has " << "fraction > " << z
<< ", p = " << cdf(complement(N01, z)) << endl;
Normal distribution with mean = 0, standard deviation 1, has fraction <= -2, p = 0.0227501
Normal distribution with mean = 0, standard deviation 1, has fraction > -2, p = 0.97725
Теперь мы можем использовать "find_location", чтобы дать новое офсетное средство.
double l = find_location<normal>(z, p, sd);
cout << "offset location (mean) = " << l << endl;
мероприятия:
offset location (mean) = 1.09023
показать, что нам нужно сместить среднее чуть более одного стандартного отклонения от его предыдущего значения нуля.
Затем мы можем проверить, что мы достигли нашей цели, создав новое распределение со средним смещением (но тем же стандартным отклонением):
normal np001pc(l, sd);
И пересчитать долю ниже выбранного нами предела.
cout << "Normal distribution with mean = " << l
<< " has " << "fraction <= " << z
<< ", p = " << cdf(np001pc, z) << endl;
cout << "Normal distribution with mean = " << l
<< " has " << "fraction > " << z
<< ", p = " << cdf(complement(np001pc, z)) << endl;
Normal distribution with mean = 1.09023 has fraction <= -2, p = 0.001
Normal distribution with mean = 1.09023 has fraction > -2, p = 0.999
Мы также можем контролировать политику обработки различных ошибок. Например, мы можем определить новую (возможно, неразумную) политику, чтобы игнорировать ошибки домена ('плохие' аргументы).
Если мы не используем бульварное пространство имен::math, нам понадобится:
using boost::math::policies::policy;
using boost::math::policies::domain_error;
using boost::math::policies::ignore_error;
Использование Typedef часто удобно, особенно если он повторно используется, хотя это не требуется, как показывают различные примеры ниже.
typedef policy<domain_error<ignore_error> > ignore_domain_policy;
l = find_location<normal>(z, p, sd, ignore_domain_policy());
l = find_location<normal>(z, p, sd, policy<>());
l = find_location<normal>(z, p, sd, boost::math::policies::policy<>());
l = find_location<normal>(z, p, sd, policy<domain_error<ignore_error> >());
Если мы хотим использовать вероятность, которая является компонентами нашей вероятности, мы даже не должны думать о написании find_location<нормальные>(z, -p, d>)
, но используйте версию дополнения, см.<28w>.
z = 2.;
double q = 0.95;
l = find_location<normal>(complement(z, q, sd));
normal np95pc(l, sd);
cout << "Normal distribution with mean = " << l << " has "
<< "fraction <= " << z << " = " << cdf(np95pc, z) << endl;
cout << "Normal distribution with mean = " << l << " has "
<< "fraction > " << z << " = " << cdf(complement(np95pc, z)) << endl;
См. find_location_example.cpp для полного исходного кода: выход программы выглядит следующим образом:
Example: Find location (mean).
Normal distribution with mean = 0, standard deviation 1, has fraction <= -2, p = 0.0227501
Normal distribution with mean = 0, standard deviation 1, has fraction > -2, p = 0.97725
offset location (mean) = 1.09023
Normal distribution with mean = 1.09023 has fraction <= -2, p = 0.001
Normal distribution with mean = 1.09023 has fraction > -2, p = 0.999
Normal distribution with mean = 0.355146 has fraction <= 2 = 0.95
Normal distribution with mean = 0.355146 has fraction > 2 = 0.05