簡體   English   中英

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

[英]How to use Boost's Brent minimization algorithm with a specific tolerance rather than bits?

The documentation for the brent_find_minima function is at 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, class T>
std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t& max_iter);

但是,我對如何將位轉換為容差有點困惑。 例如,我有一些測量距離的目標 function

double distance(double x);

它測量一些由x參數化的值距離 我想說我希望求解器將這個 function 的最小值返回到 0.1 的精度,這代表了我關心的精度。

如何將 0.1 轉換為位?

我不是這方面的專家,但是查看Boost 的 Brent minimization algorithm 的源代碼,看起來比特計數用於確定基於當前猜測大小的停止條件。 具體來說,停止條件由當前猜測 x 和當前 window 包含最小值的大小確定:

|x - 當前范圍中點| ≤ 2ε|x| + ε/2 - (電流范圍大小) / 2

在這里,ε 是從比特數(具體來說,它是 2 1 - bits )導出的一個小數。 請注意,特別是,如果 |x| 變大,則 ε 需要變得越來越小,以便隨着當前范圍的大小減小,左側的邊界不會是一個很大的數字。

我不得不承認我還沒有在這里計算出完整的數學,但基於此,看起來你需要的位數將是寫出 integer 部分的位數答案,加上足夠的額外位來獲得一個在總數的 0.1 以內的值。 寫出 integer 部分答案的位數是 log 2 n,要達到總數 0.1 以內的位數是 4 (1 / 2 4 = 0.06),所以我最好的猜測是你如果正確答案是 n,則需要log 2 n + 4位。 要估計 n,請查看范圍的兩個端點並取絕對值較大的那個。

如果這不正確,請告訴我,我將刪除此答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM