gpt4 book ai didi

c++ - 使用正态分布优化预期 yield

转载 作者:行者123 更新时间:2023-11-28 06:09:41 29 4
gpt4 key购买 nike

假设我生成一个均值为 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(概率分布函数)有一个很好的封闭形式:

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);
}

一个好的起始括号是 0100:

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

关于c++ - 使用正态分布优化预期 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31523301/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com