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

时间:2010-04-11 03:16:19

标签: 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计算速度非常慢的事实,以及处理w_i>的限制。 0,否则digamma(w_i)将因w_i = 0而崩溃。

对于第一个问题,我想也许我应该为最近计算的digamma值实现一个缓存 - 我认为这是一个好主意,但对根查找算法的工作方式不太了解。

我的想法是解决第二个问题是找到w'_i = log(w_i)。那样,w'_i就在整条线上。我想知道这是不是一个好主意。可能没有直接找到digamma(exp(w'))的功能?此外,该算法可能在w'空间中采取步骤而不改进,因为w' - > w的映射失去了一些精度,因此w'的两个元素可能映射到相同的w。

仍然存在找到一个好的,快速的根寻找算法的问题。我想我可以在一个单独的问题中提出这个问题。

...谢谢

1 个答案:

答案 0 :(得分:1)

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

此外,如果这些都没有你想要的,你可以看到GNU Octave或类似的东西如何解决系统,然后阅读他们用于实现解决它所需功能的算法的文档。从那里开始,更多的是弄清楚如何使用算法,如何实现它,以及在哪些情况下是值得的(Octave,Matlab,Mathematica的文档非常全面,并列出了在大多数情况下定义了算法的出版物)如果你正在寻找开源/免费的替代方案,还有Scilab和SageMath,并且有一些方法可以在C ++中使用这些例程(但我不确定那将是多么简单或困难)

希望有所帮助。