假设我生成一个平均值为50且标准差为1的正态分布。
boost::normal_distribution<> normal(50, 1);
然后我希望将这个正态分布乘以由下式给出的支付函数:
f(x)= 100 - x
然后求解[0,100]中的最大x \。
特别是,我想解决:
((max x / in [0,100])normal(x)*(100-x)
有人可以帮我编码,或者引导我朝正确的方向前进吗?
答案 0 :(得分:1)
正态分布的PDF(概率分布函数)具有良好的封闭形式:
因此可以通过求解:
来分析找到最大值
这将为您的案件带来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);