2015-07-20 5 views
0

Пусть я генерировать нормальное распределение со средним 50 и стандартное отклонение 1.ожидаемый выигрыш, используя нормальное распределение

boost::normal_distribution<> normal(50, 1); 

Я хотел бы затем умножить это нормальное распределение с помощью функции выигрыша определяется по формуле:

F (X) = 100 - х

, а затем решить для максимального х \ в [0, 100].

В частности, я хотел бы решить:

((макс х/в [0100]) нормально (х) * (100 - х)

Может кто-то пожалуйста, помогите мне код этого, или свинец я в правильном направлении

+0

Может ли вы объяснить проблему немного больше? Вы ищете максимум 'x (100-x)', где 'x' имеет нормальное распределение? Вы хотите выбрать несколько 'x's из нормального распределения и найти максимум' x (100-x) 'для тех значений' x' или вы хотите узнать теоретический максимум? –

+0

@triple_r Заметим, что нормальное распределение, normal (x), и, f (x) = 100 - x, имеют одну и ту же независимую переменную. Я просто хочу умножить две функции для каждого х, а затем максимизировать по всем х \ в [0, 100]. Это ясно? –

+0

О, так как 'normal (x)' вы имеете в виду функцию плотности вероятности для нормального распределения на 'x'? что-то вроде [этого] (http://www.itl.nist.gov/div898/handbook/eda/section3/gif/norpdf.gif)? –

ответ

1

The (функция распределения вероятностей) PDF для нормального распределения имеет приятный замкнутую форму:

pdf(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

так что можно найти максимум аналитически решения для:

\frac{d}{dx}\left(pdf(x)(100-x)\right)=0

, который будет приводить к x=75-sqrt(626) или x=49.98 для вашего случая.

Однако, если вы хотите сделать это в коде, а не аналитически, вы можете использовать алгоритм оптимизации. В вашем случае, вероятно, простой алгоритм, такие как золотое сечение (в одном измерении) будет работать нормально (here, for example):

using boost::math::normal; 

normal ndist(50.0, 1.0); 

double f(const double &x) 
{ 
    return pdf(ndist, x) * (100.0 - x); 
} 

double max(double (*f)(const double &), double &a, double &b, const double tol = 1e-5) 
{ 
    static double goldenratio = 0.618034; 
    double c = b - goldenratio * (b - a); 
    double d = a + goldenratio * (b - a); 
    while(abs(c - d) > tol) 
    { 
     double fc = (*f)(c); double fd = (*f)(d); 
     if (fc > fd) 
     { 
      b = d; 
      d = c; 
      c = b - goldenratio * (b - a); 
     } else 
     { 
      a = c; 
      c = d; 
      d = a + goldenratio * (b - a); 
     } 
    } 
    return 0.5 * (b + a); 
} 

хорошая отправная скобка 0 и 100:

double a = 0.0; 
double b = 100.0; 
maximum = max(f, a, b); 
+0

Не могли бы вы объяснить, как решить эту производную в C++? –

+0

с поиском золотого сечения вам не нужно вычислять производную. Некоторым алгоритмам оптимизации нужна производная, и для этих алгоритмов вы можете либо вычислить производную аналитически (символически), либо поставить свой код, либо использовать метод численного дифференцирования.Например, с центральной разностной схемой 'dfdx = (f (x + eps) - f (x-eps))/(2.0 * eps)' ('eps' - небольшое число, скажем,' eps = 1e-10 '). –

+0

Я смущен алгоритмом оптимизации. Кроме того, почему бы вам не указать, что такое fc и что такое fd? Они никогда не объявляются, как кажется. –

Смежные вопросы