Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Find Location (Mean) Example

Boost , Math Toolkit 2.5.0 , Find Location and Scale Examples

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Сначала нам нужны некоторые, чтобы получить доступ к нормальному распределению, алгоритмы, чтобы найти местоположение (и некоторые результаты std, конечно).

#include <boost/math/distributions/normal.hpp> // for normal_distribution
  using boost::math::normal; // typedef provides default type is double.
#include <boost/math/distributions/cauchy.hpp> // for cauchy_distribution
  using boost::math::cauchy; // typedef provides default type is double.
#include <boost/math/distributions/find_location.hpp>
  using boost::math::find_location; // for mean
#include <boost/math/distributions/find_scale.hpp>
  using boost::math::find_scale; // for standard devation
  using boost::math::complement; // Needed if you want to use the complement version.
  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;  // Default 'standard' normal distribution with zero mean and
double sd = 1.; // normal default standard deviation is 1.

Предположим, мы хотим найти другое нормальное распределение, среднее которого смещается так, что только доля p (здесь 0,001 или 0,1%) ниже определенного выбранного предела (здесь -2, два стандартных отклонения).

double z = -2.; // z to give prob p
double p = 0.001; // only 0.1% below z
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; // Note: uses complement.
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); // Same standard_deviation (scale) but with mean (location) shifted.

И пересчитать долю ниже выбранного нами предела.

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
Controlling Error Handling from find_location

Мы также можем контролировать политику обработки различных ошибок. Например, мы можем определить новую (возможно, неразумную) политику, чтобы игнорировать ошибки домена ('плохие' аргументы).

Если мы не используем бульварное пространство имен::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;
// find_location with new policy, using typedef.
l = find_location<normal>(z, p, sd, ignore_domain_policy());
// Default policy policy<>, needs "using boost::math::policies::policy;"
l = find_location<normal>(z, p, sd, policy<>());
// Default policy, fully specified.
l = find_location<normal>(z, p, sd, boost::math::policies::policy<>());
// A new policy, ignoring domain errors, without using a typedef.
l = find_location<normal>(z, p, sd, policy<domain_error<ignore_error> >());

Если мы хотим использовать вероятность, которая является компонентами нашей вероятности, мы даже не должны думать о написании find_location<нормальные>(z, -p, d>), но используйте версию дополнения, см.<28w>.

z = 2.;
double q = 0.95; // = 1 - p; // complement.
l = find_location<normal>(complement(z, q, sd));
normal np95pc(l, sd); // Same standard_deviation (scale) but with mean(location) shifted
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

PrevUpHomeNext

Статья Find Location (Mean) Example раздела Math Toolkit 2.5.0 Find Location and Scale Examples может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Find Location and Scale Examples ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:08:32/0.025898933410645/1