ディガンマ関数を含む連立方程式を解くための最も効率的な方法は何ですか?
私はベクトル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'空間でステップを実行し、物事を改善しない可能性があります。
優れた高速の求根アルゴリズムを見つけるという問題はまだあります。私は別の質問でそれを尋ねるかもしれないと思います。
ありがとう...