2010-04-11 75 views
3

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

我有一个向量v和我要解决一个向量w,使得对于所有的i:

digamma(总和(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

不知道,但你会得到更好的答案在http://mathoverflow.net/,然后回到这里对算法的具体问题? – 2010-04-11 04:40:58

+0

感谢您花时间回答。我已经更新了这个问题。 – 2010-04-11 18:31:09

+0

不错,感谢您对问题的更新,让我深入了解如何解决这些系统问题,以及我可以期待的问题。顺便说一句,我相信你已经知道这一点,但GSL也有根发现算法:) – Akanksh 2010-04-14 07:25:23

回答

1

我会建议使用解算器将是最好的想法,主要是因为考虑到各种方程的各种稳定性和收敛区域可能会非常棘手,这是没有用的重新发明轮子。虽然我从来没有真正解决像你提到的一个系统,我认为以下库之一极有可能有你想办法解决:

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

希望帮助。

+0

我用gsl。谢谢。 – 2010-04-13 20:32:00

相关问题