Quel est le moyen le plus efficace pour résoudre système d'équations contenant la fonction digamma?

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

Question

Quelle est la manière la plus efficace pour résoudre système d'équations impliquant la fonction digamma?

J'ai un vecteur v et je veux résoudre pour un vecteur w tel que pour tout i:

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

et

w_i> 0

J'ai trouvé la fonction GSL gsl_sf_psi, qui est la fonction digamma (calculée en utilisant une sorte de série.) Y at-il une identité que je peux utiliser pour réduire les équations? Est mon meilleur pari d'utiliser un solveur? J'utilise C ++ 0x; qui solveur est plus facile à utiliser et rapide?


D'après mes recherches préliminaires, digamma est pas facilement inversible (recherche digamma inverse donne des algorithmes qui fonctionnent par la recherche binaire), donc il est logique qu'il n'y aurait pas de simplification du système.

Ainsi, en utilisant un solveur laisse maintenant deux problèmes: faire face au fait que digamma est très lent à calculer, et de traiter avec la restriction que w_i> 0, ou bien digamma (w_i) plantera pour w_i = 0

Pour le premier problème, je pensais que peut-être que je devrais mettre en œuvre un cache pour les valeurs calculées récemment de digamma -. Je pensais que ce serait une bonne idée, mais je ne sais pas beaucoup sur la façon dont le travail des algorithmes trouver racine

Mon idée était de résoudre le second problème était de trouver w'_i = log (w_i). De cette façon, w'_i sont sur toute la ligne. Je me demande si cela est une bonne idée. Il n'y a probablement pas de fonction pour trouver digamma (exp (w ')) directement? En outre, l'algorithme pourrait prendre des mesures dans w » espace et ne pas améliorer les choses parce que la cartographie de w « -.> W perd une certaine précision et donc deux éléments de w » pourrait correspondre à la même w

Il y a encore la question de trouver un bon algorithme de rootfinding rapide. Je pense que je peux demander que, dans une autre question.

Merci ...

Était-ce utile?

La solution

Je suggère que l'utilisation d'un solveur serait la meilleure idée, surtout parce que compte tenu des différentes régions de stabilité et de convergence pour diverses équations peut être difficile et il est inutile de réinventer la roue. Bien que je ne l'ai jamais vraiment résolu un système comme celui que vous avez mentionné, je pense que l'une des bibliothèques suivantes sont très susceptibles d'avoir une solution que vous voulez:

En outre, si aucune de ces a exactement ce que vous voulez, vous pouvez voir comment GNU Octave ou quelque chose à résoudre aussi bien le système, puis lire leur documentation sur l'algorithme qu'ils utilisent pour mettre en œuvre les fonctions nécessaires pour le résoudre. De là, il est plus sur trouver comment l'algorithme est utilisé, comment le mettre en œuvre, et dans quels cas est-il utile (documentation d'Octave, Matlab, Mathematica est très complet et énumère les publications qui ont l'algorithme défini dans la plupart des cas) , il y a aussi Scilab et SageMath si vous cherchez opensource / alternatives gratuites, et il y a des façons d'utiliser les routines de ceux-ci à partir de C ++ (mais je ne sais pas comment facile ou difficile qui serait)

L'espoir qui aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top