Math 求解包含digamma函数的方程组最有效的方法是什么?

Math 求解包含digamma函数的方程组最有效的方法是什么?,math,gsl,equations,equation-solving,Math,Gsl,Equations,Equation Solving,求解涉及digamma函数的方程组最有效的方法是什么 我有一个向量v,我想解一个向量w,这样对于所有I: digamma(sum(w))-digamma(w_i)=v_i 及 w_i>0 我找到了gsl函数gsl_sf_psi,这是digamma函数(使用某种级数计算)。有一个恒等式可以用来简化方程吗?使用解算器是我的最佳选择吗?我正在使用C++0x;哪种解算器最容易使用且速度最快 从我的初步研究来看,digamma不容易可逆(搜索逆digamma会给出通过二进制搜索工作的算法),因此整个系统

求解涉及digamma函数的方程组最有效的方法是什么

我有一个向量v,我想解一个向量w,这样对于所有I:

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

w_i>0

我找到了gsl函数gsl_sf_psi,这是digamma函数(使用某种级数计算)。有一个恒等式可以用来简化方程吗?使用解算器是我的最佳选择吗?我正在使用C++0x;哪种解算器最容易使用且速度最快


从我的初步研究来看,digamma不容易可逆(搜索逆digamma会给出通过二进制搜索工作的算法),因此整个系统不会简化是有意义的

因此,使用解算器现在会留下两个问题:处理digamma计算速度非常慢的事实,以及处理w_i>0的限制,否则digamma(w_i)将在w_i=0时崩溃

对于第一个问题,我想也许我应该为最近计算的digamma值实现一个缓存——我认为这是一个好主意,但对根查找算法的工作原理知之甚少

我的想法是解决第二个问题,找到w''u i=log(w'u i)。那样的话,我就全完了。我不知道这是不是个好主意。可能没有直接查找digamma(exp(w'))的函数?此外,该算法可能会在w'空间中采取步骤,而不会改善情况,因为从w'->w的映射会失去一些精度,因此w'的两个元素可能映射到同一个w

仍然存在找到一个好的、快速的寻根算法的问题。我想我可以在另一个问题中问这个问题


谢谢…

我建议使用解算器将是最好的主意,主要是因为考虑各种方程的各种稳定性和收敛区域可能很棘手,重新设计轮子是没有用的。虽然我从未真正解决过像您提到的那样的系统,但我认为以下库之一很可能有您想要的解决方案:

  • 当然,你可以在谷歌上搜索更多内容:)[这些是我熟悉的]
另外,如果这两个都不是您想要的,您可以看到GNU Octave或类似的东西是如何解决系统的,然后阅读他们的文档,了解他们用于实现解决系统所需的函数的算法。从这里开始,更多的是了解如何使用算法,如何实现算法,以及在哪些情况下值得(Octave、Matlab、Mathematica的文档非常全面,列出了在大多数情况下定义了算法的出版物),也有ScILAB和SageMath,如果你正在寻找开源/免费的替代品,并且有办法从C++中使用这些例程(但我不确定这将是多么容易或困难)


希望这能有所帮助。

不确定,但您是否能获得更好的答案,然后再回来这里询问有关算法的具体问题?感谢您抽出时间回答。我已经更新了这个问题。尼斯,谢谢你对这个问题的更新,让我了解了如何解决这些系统,以及我可以预期的问题。顺便说一句,我相信您已经知道这一点,但GSL也有根查找算法:)