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

标签 c++ optimization normal-distribution

假设我生成一个均值为 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/

相关文章:

c++ - 什么时候在cocos2d-x中用参数初始化Custom create function中的变量?

c++ - 避免在给定示例上重新分配内存

matlab - 在matlab中基于正态分布生成随机数

c++ - C++应用程序中的非永久巨大外部数据存储

c++ - 为什么C++中的 `const char *`类型可以存储Unicode?

c++ - Boost::Spirit:优化表达式解析器

php - 使用 PHP 的 echo 编写 HTML 与编写纯 HTML 会导致性能上的差异吗?

r - 二元正态分布的离散近似

r - 使用ggplot2在直方图上绘制置信区间

C++ 排序的对象集