3

ディガンマ関数を含む連立方程式を解くための最も効率的な方法は何ですか?

私はベクトルvを持っていて、すべてのiについて次のようにベクトルwを解きたいです。

digamma(sum(w))-digamma(w_i)= v_i

w_i> 0

gsl関数gsl_sf_psiを見つけました。これは、ディガンマ関数です(ある種の系列を使用して計算されます)。方程式を減らすために使用できるIDはありますか?ソルバーを使用するのが最善の策ですか?私はC++0xを使用しています。どのソルバーが最も使いやすく高速ですか?


私の予備調査によると、ディガンマは簡単に反転できません(逆ディガンマを検索すると、バイナリ検索で機能するアルゴリズムが得られます)。したがって、システム全体が単純化されないことは理にかなっています。

したがって、ソルバーを使用すると、2つの問題が残ります。ディガンマの計算が非常に遅いという事実に対処することと、w_i> 0であるという制限に対処することです。そうしないと、ディガンマ(w_i)がw_i=0でクラッシュします。

最初の問題については、最近計算されたディガンマの値のキャッシュを実装する必要があると思いました。これは良い考えだと思いましたが、求根アルゴリズムがどのように機能するかについてはよくわかりません。

私の考えは、2番目の問題を解決することでした。w'_i= log(w_i)を見つけることでした。そうすれば、w'_iは全線上にあります。これはいい考えかしら。digamma(exp(w'))を直接見つける関数はおそらくないのでしょうか?また、w'-> wからのマッピングはある程度の精度を失い、w'の2つの要素が同じwにマッピングされる可能性があるため、アルゴリズムはw'空間でステップを実行し、物事を改善しない可能性があります。

優れた高速の求根アルゴリズムを見つけるという問題はまだあります。私は別の質問でそれを尋ねるかもしれないと思います。

ありがとう...

4

1 に答える 1

1

ソルバーを使用するのが最善のアイデアだと思います。主な理由は、さまざまな方程式のさまざまな安定性と収束領域を考慮するのは難しい場合があり、車輪の再発明は無駄だからです。私はあなたが言ったようなシステムを実際に解決したことはありませんが、次のライブラリの1つがあなたが望む解決策を持っている可能性が高いと思います。

また、どちらも希望どおりでない場合は、GNU Octaveなどがシステムをどのように解決するかを確認し、解決に必要な関数を実装するために使用するアルゴリズムに関するドキュメントを読むことができます。そこから、アルゴリズムがどのように使用され、どのように実装され、どのような場合に価値があるかを理解することが重要です(Octave、Matlab、Mathematicaのドキュメントは非常に包括的であり、ほとんどの場合にアルゴリズムが定義されている出版物をリストしています) 、オープンソース/無料の代替手段を探している場合はScilabとSageMathもあり、C ++内からこれらのルーチンを使用する方法があります(しかし、それがどれほど簡単か難しいかはわかりません)

お役に立てば幸いです。

于 2010-04-11T07:37:40.340 に答える