3

求解涉及 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。

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

谢谢...

4

1 回答 1

1

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

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

希望有帮助。

于 2010-04-11T07:37:40.340 回答