微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用具有特定容差而不是位的 Boost 布伦特最小化算法?

如何解决如何使用具有特定容差而不是位的 Boost 布伦特最小化算法?

brent_find_minima 函数的文档位于 https://www.boost.org/doc/libs/1_76_0/libs/math/doc/html/math_toolkit/brent_minima.html

template <class F,class T>
std::pair<T,T> brent_find_minima(F f,T min,T max,int bits);

template <class F,int bits,boost::uintmax_t& max_iter);

但是,我对如何将位转换为容差有点困惑。例如我有一些测量距离的目标函数

double distance(double x);

测量一些值距离,由x参数化。我想说的是,我希望求解器将这个函数的最小值返回给我,精度为 0.1,这代表了我关心的精度。

如何将 0.1 转换为位?

解决方法

我不是这方面的专家,但查看 source code for Boost's Brent minimization algorithm 时,位计数似乎用于确定基于当前猜测大小的停止条件。具体来说,停止条件由当前猜测x和包含最小值的当前窗口的大小决定:

|x - 当前范围中点| ≤ 2ε|x| + ε/2 - (电流范围大小) / 2

这里,ε 是从比特数推导出来的一个小数(具体来说,它是 21 - bits)。请注意,特别是如果 |x|变大,则 ε 需要变得越来越小,以便随着当前范围的大小减小,左侧的边界不会是一个大数。

我必须承认我还没有在这里计算出完整的数学,但基于此,看起来您需要的位数将是写出整​​数的位数答案的一部分,加上足够的额外位,以获得一个在总数的 0.1 以内的值。写出答案整数部分的位数是log2 n,并且在总数的0.1以内的位数是4(1 / 24 sup> = 0.06),所以我最好的猜测是,如果正确答案是 n,您将需要 log2 n + 4 位。要估计 n,请查看范围的两个端点,并取绝对值较大的那个。

如果这是不正确的,请告诉我,我会删除此答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。