Frage

Was ist der effizienteste Weg, Gleichungssystem zu lösen, die die digamma Funktion?

Ich habe einen Vektor v und ich möchte für einen Vektor w so lösen, dass für alle i:

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

und

w_i> 0

Ich fand die GSL Funktion gsl_sf_psi, das ist die digamma Funktion (berechnet eine Art von Serie.) Gibt es eine Identität ich die Gleichungen zu reduzieren verwenden kann? Ist meine beste Wette Löser zu benutzen? Ich bin mit C ++ 0x; die Solver ist am einfachsten zu bedienen und schnell?


Aus meiner Voruntersuchung ist digamma nicht leicht umkehrbar (Suche nach inversen digamma gibt Algorithmen, dass die Arbeit durch binäre Suche), so macht es Sinn, dass es keine Vereinfachung für das gesamte System sein würde.

Also, mit einem Löser verlässt nun zwei Probleme: mit der Tatsache zu tun, dass digamma zu berechnen ist sehr langsam, und der Umgang mit der Einschränkung, dass w_i> 0, sonst digamma (w_i) abstürzen für w_i = 0

Für das erste Problem, ich dachte, vielleicht sollte ich einen Cache für kürzlich berechneten Werte von digamma implementieren - ich dachte, dass eine gute Idee wäre, aber wissen nicht viel darüber, wie Wurzelfindungs ??Algorithmen arbeiten

war meine Idee, das zweite Problem zu lösen war w'_i = log (w_i) zu finden. Auf diese Weise w'_i sind auf der ganzen Linie. Ich frage mich, ob dies eine gute Idee ist. Es gibt wahrscheinlich keine Funktion digamma (exp (w ')) direkt zu finden? Auch der Algorithmus könnte Schritte in w nehmen‘Raum und die Dinge nicht verbessern, weil die Abbildung von w‚-.> W einige Präzision und so zwei Elemente verliert w‘auf die gleiche Karte könnte w

Es gibt immer noch die Frage, einen guten zu finden, schnell rootfinding Algorithmus. Ich denke, ich fragen darf, dass in einer separaten Frage.

Danke ...

War es hilfreich?

Lösung

Ich würde vorschlagen, dass ein Solver die beste Idee wäre, vor allem, weil die verschiedenen Stabilitäts- und Konvergenz Berücksichtigung Regionen für verschiedene Gleichungen sein könnte heikel und es hat keinen Sinn, das Rad neu zu erfinden. Während ich habe wirklich noch nie ein System wie das gelöst Sie erwähnt haben, glaube ich, eine der folgenden Bibliotheken sind sehr wahrscheinlich, um eine Lösung haben, die Sie wollen:

Auch wenn keiner von ihnen hat genau das, was Sie wollen, können Sie sehen, wie GNU Octave oder etwas ähnlich dem System lösen und dann ihre Dokumentation über den Algorithmus sie die Funktionen zu implementieren, verwenden lesen erforderlich, es zu lösen. Von dort sind es mehr darum, herauszufinden, ist, wie der Algorithmus verwendet wird, wie es zu implementieren, und in welchen Fällen ist es sinnvoll (Dokumentation von Octave, Matlab, ist Mathematica sehr umfassend und listet die Publikationen, die den Algorithmus in den meisten Fällen definiert haben) gibt es Scilab und SageMath auch wenn Sie sich für Open-Source / freie Alternativen suchen, und es gibt Möglichkeiten, Routinen von diesen aus C ++ (aber ich bin nicht sicher, wie leicht oder schwer das wäre)

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top