Какой самый эффективный способ решить систему уравнений, содержащих функцию дигама?

StackOverflow https://stackoverflow.com/questions/2615924

Вопрос

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

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

digamma (сумма (w)) - digamma (w_i) = v_i

а также

w_i> 0.

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


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

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

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

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

Есть еще вопрос поиска хорошего, быстрого корневого алгоритма rootfinding. Я думаю, что могу попросить об этом в отдельном вопросе.

Спасибо...

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top