假设我生成一个均值为 50、标准差为 1 的正态分布。
boost::normal_distribution<> normal(50, 1);
然后我想将这个正态分布乘以给出的 yield 函数:
f(x) = 100 - x
然后求解最大 x\in [0, 100]。
特别是,我想解决:
((最大 x/in [0,100]) 正常 (x) * (100 - x)
有人可以帮我编写代码,或者引导我朝着正确的方向前进吗?
最佳答案
正态分布的 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);
关于c++ - 使用正态分布优化预期 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31523301/