Как наиболее эффективно решить систему уравнений, содержащую функцию дигаммы? - PullRequest
3 голосов
/ 11 апреля 2010

Каков наиболее эффективный способ решения системы уравнений с использованием функции дигаммы?

У меня есть вектор v, и я хочу найти для вектора w такой, что для всех i:

дигамма (сумма (w)) - дигамма (w_i) = v_i

и

w_i> 0

Я нашел функцию gsl gsl_sf_psi, которая является функцией дигаммы (вычисленной с использованием некоторого ряда.) Можно ли использовать тождество, чтобы уменьшить уравнения? Мой лучший выбор - использовать солвер? Я использую C ++ 0x; какой решатель самый простой в использовании и быстрый?


Исходя из моего предварительного исследования, дигамма не так легко обратима (поиск обратной дигаммы дает алгоритмы, работающие с помощью бинарного поиска), поэтому имеет смысл, что не будет никакого упрощения для всей системы.

Таким образом, использование решателя теперь оставляет две проблемы: иметь дело с тем, что дигамма вычисляется очень медленно, и с ограничением, что w_i> 0, или же дигамма (w_i) будет аварийно завершать работу при w_i = 0.

Что касается первой проблемы, я подумал, что, возможно, мне следует реализовать кэш для недавно вычисленных значений дигаммы - я подумал, что это было бы хорошей идеей, но я не знаю, как работают алгоритмы поиска корней.

Моя идея заключалась в том, чтобы решить вторую проблему - найти w'_i = log (w_i). Таким образом, w'_i на всей линии. Интересно, хорошая ли это идея? Вероятно, нет функции для непосредственного нахождения дигаммы (exp (w '))? Кроме того, алгоритм может выполнять шаги в w 'пространстве и не улучшать вещи, потому что отображение из w' -> w теряет некоторую точность, и поэтому два элемента w 'могут отображаться на один и тот же w.

Остается вопрос о поиске хорошего и быстрого алгоритма поиска корней. Я думаю, что могу задать это в отдельном вопросе.

Спасибо ...

1 Ответ

1 голос
/ 11 апреля 2010

Я бы предположил, что использование решателя было бы наилучшей идеей, главным образом потому, что рассмотрение различных областей устойчивости и сходимости для различных уравнений может быть сложным, и нет смысла заново изобретать колесо. Хотя я никогда не решал систему, подобную той, которую вы упомянули, я думаю, что одна из следующих библиотек, скорее всего, найдет решение, которое вам нужно:

Кроме того, если ни один из них не имеет именно того, что вам нужно, вы можете увидеть, как GNU Octave или что-то подобное решает систему, а затем прочитать их документацию об алгоритме, который они используют для реализации функций, необходимых для ее решения. Далее речь пойдет о том, как выяснить, как используется алгоритм, как его реализовать и в каких случаях это целесообразно (документация к Octave, Matlab, Mathematica очень обширна и содержит список публикаций, в которых алгоритм определен в большинстве случаев). Существуют также Scilab и SageMath, если вы ищете альтернативы с открытым исходным кодом или бесплатные, и есть способы использовать из них подпрограммы из C ++ (но я не уверен, насколько это будет легко или сложно)

Надеюсь, это поможет.

...