Каков наиболее эффективный способ решения системы уравнений с использованием функции дигаммы?
У меня есть вектор 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.
Остается вопрос о поиске хорошего и быстрого алгоритма поиска корней. Я думаю, что могу задать это в отдельном вопросе.
Спасибо ...