ブレント根探索アルゴリズムの標準 (Numerical Recipes とGSL C バージョンは同じ)実装 を読んでいますが、変数 "e" の意味を理解できません。使用法は、「e」がブラケット間の以前の距離であることを示唆しています。では、二分法を使用する場合、なぜ「xm」(距離の半分) に設定されるのでしょうか。
3 に答える
アルゴリズムに詳しくありません。ただし、C ソースとウィキペディアのアルゴリズムの説明を比較することはできます。アルゴリズムは単純明快に見えますが (根を見つける方法に精通している場合)、C 実装は fortran の直接移植のように見えるため、かなり読みにくいです。
私の最善の推測は、それe
がループ条件に関連していることです。
ウィキペディアによると (アルゴリズムの 8 行目):
repeat until f(b or s) = 0 or |b − a| is small enough (convergence)
C ソースには次のよう
e = b - a
に書かれていますif (fabs(e) <= tol ...
。
変数の目的が本で明確に説明されることを願っていますが、明らかにそうではありません:)
わかりました、どうぞ。元の実装 (algol 60)はこちらで見つかりました。アルゴリズムの優れた説明に加えて、次のように述べています (50 ページから)。
最後のステップの前のステップで
e
の値とします。< δ または≥のp/q
場合は、二分法を実行します。それ以外の場合は、デッカーのアルゴリズムと同様に、二分法または補間のいずれかを実行します。したがって、2 ステップごとに少なくとも 2 分の 1 に減少し、< δ の場合、二分法を実行する必要があります。(二分した後、次のステップに進みます。)|e|
|p/q|
1/2|e|
|e|
|e|
e = m
したがって、追加は、e
Brent による Dekker のアルゴリズムの「主な修正」です。
E は「イプシロン」変数で、基本的にどれだけ近いかを示す尺度です。特定のアプリケーションは 20 桁の精度を必要としない場合があるため、epsilon を使用すると、必要な反復回数 (実行時間) と必要な精度のバランスを取ることができます。
浮動小数点数を使用すると正確に計算できない場合があるため、イプシロンはゼロ以外の小さな数値にする必要があります。実際の値はアプリケーションによって異なります...これは基本的に許容できる最大の誤差です。
二分ステップの間、間隔は正確に半分になります。したがって、間隔の現在の幅を保持する e も半分になります。