2012-05-17 14 views
5

ブーストのerf-functionのアルゴリズムの詳細はありますか?モジュールのドキュメントはあまり正確ではありません。私が知る限り、いくつかの方法が混在しています。私にとっては、AbramowitzとStegunのバリエーションのように見えます。boost :: math :: erfのアルゴリズム

  • どのメソッドが混在していますか?
  • メソッドはどのように混在していますか?
  • erf-function(定数時間)の複雑さは何ですか? Boost Math Toolkitため

セバスチャン

答えて

4

ドキュメントはアブラモウィッツとStegunの間referencesの長いリストを持っています。 erf-functionインターフェイスには、数値精度(したがって実行時の複雑さ)を制御するために使用できるpolicyテンプレートパラメータが含まれています。

#include <boost/math/special_functions/erf.hpp> 
namespace boost{ namespace math{ 

template <class T> 
calculated-result-type erf(T z); 

template <class T, class Policy> 
calculated-result-type erf(T z, const Policy&); 

template <class T> 
calculated-result-type erfc(T z); 

template <class T, class Policy> 
calculated-result-type erfc(T z, const Policy&); 

}} // namespaces 

UPDATE:ERF-機能を早く提供される基準のセクション "実装" の逐語的なコピーの下

実装

のすべてのバージョンこれらの関数は、最初に通常の反射式を使用して引数を正にします。

erf(-z) = 1 - erf(z); 

erfc(-z) = 2 - erfc(z); // preferred when -z < -0.5 

erfc(-z) = 1 + erf(z); // preferred when -0.5 <= -z < 0 

これらの関数の汎用バージョンは、不完全なガンマ関数によって実装されています。

(仮数)のサイズが認識されると(現在、53,64,113ビットの実数、および倍精度24ビットを2倍に昇格することによって処理される)、JMによって考案された一連の有理近似が使用されます。

erf(z) = z * (C + R(z*z)); 

有理数近似R(Z *:ERFは奇関数であり、したがってERFを使用して計算されるという観察に基づいて、Z < = 0.5について

次いでERFに合理的な近似を使用します、 z)は、絶対誤差に対して最適化されています。絶対誤差が定数Cに比べて十分小さい限り、R(z * z)の計算中に発生する丸め誤差は、結果から効果的に消えます。その結果、この領域のerfとerfcのエラーは非常に低くなります。非常に少数のケースで最後のビットが正しくありません。

は、z> 0.5の場合、我々は観察し、その小区間[a、b)は、次いで上:ある定数cについて

erfc(z) * exp(z*z) * z ~ c 

したがってためのZ>我々が使用ERFC計算0.5:

erfc(z) = exp(-z*z) * (C + R(z - B))/z; 

再度R(Z - B)の絶対誤差のために最適化され、定数CはERFC(Z)* EXPの平均である(Z * z)* zは、範囲の終点で取られます。再び、R(z-B)の絶対誤差がcに比べて小さい限り、c + R(z-B)は正しく丸められ、結果の誤差はexpの精度のみに依存する関数。実際には、非常に少数の場合を除いて、エラーは結果の最後のビットに限定されます。

erfc(z) = exp(-z*z) * (C + R(1/z))/z; 
:合理的な近似の範囲の左端に[+∞]上記近似に修正される範囲を超える大きなZについて0

なるように定数Bが選択されます

有理近似はexcruciating detailで説明されています。詳細が必要な場合は、いつでもsource codeをご覧ください。

+0

ありがとうございます。ポリシーテンプレートへのヒントと、私が知ったコードの短い見直しで、O(1)実装につながる反復回数を設定することが可能であることが示されています(反復回数は一定です)。しかし、他の質問はまだ開いています。もちろん、参考文献にはAbramowitz/Stegunが含まれていますが、この本はerf以上のものを含んでいます。コードを読むことは常にオプションですが、時間がかかりすぎるため、コードを読む必要がないようにアルゴリズムを文書化する必要があります。 – Euphoriewelle

+0

@Euphoriewelle Boostマニュアルの実装セクションのコピーを使用して私の答えを更新しました。実装上の問題に関するほとんどの質問に答えるべきだと思います。詳細については、ソースが本当に究極のガイドであることを恐れています。 – TemplateRex

+0

ありがとうございました!ほとんどのユーザーにとって、あなたの答えは十分であるはずです。私は他の選択肢がないと思うし、マイナーな細部のコードを読むつもりです。 – Euphoriewelle

関連する問題