0

查看 scipy.linalg.solveh_banded 的源代码,它只是包装了 Lapack pbsv。我正在为我认为应该由 Lapack ptsv 函数提供的三对角(厄米特,或在我的情况下为实对称)系统寻找更有效的求解器。此外,如果我沿着主对角线的(所有正)值的动态范围太大,即使这不应该是一个实际问题,solveh_banded 也会崩溃(我猜四舍五入会使最小值看起来实际上是负数,所以它是被视为具有负特征值)并且有一些机会特定于三对角线的例程不会遇到这个问题。

根据我对 Lapack 的阅读,似乎 ptsv 应该包含在任何具有 pbsv 的发行版中(文档总是将它们一起列出)。我不确定哪个会更有效(pbsv 假定对称但具有任意带宽,而 ptsv 假定三对角线但不一定是对称的)但似乎值得尝试 ptsv。

不幸的是,ptsv 似乎没有在 scipy 中公开,我相信这在实践中意味着它不包含在 scipy.linalg.flapack 中,因此不能通过 scipy.linalg.get_lapack_funcs(('ptsv',)) 获得。

我意识到与 scipy 的 Fortran/Lapack 链接很复杂,但有人知道为什么 pbsv 和 ptsv 会被区别对待吗?有什么我可以手动编辑的东西来尝试像 pbsv 一样包装 ptsv(不幸的是,flapack 似乎只是作为“.so”提供,所以我遇到了死胡同)?

FWIW 我将 Enthought EPD 与英特尔 MKL 一起使用。但是,鉴于 scipy.linalg (独立于分布)始终包含solveh_banded,但没有三对角求解器,我认为它必须比EPD / MKL问题更深。

4

1 回答 1

1

并非所有的 Lapack 都暴露在 scipy 中。

如果一个函数没有公开,那么很可能是因为没有人需要它,或者因为没有人需要它,所以编写了包装器。

例如,这里有一些公开附加功能的拉取请求

https://github.com/scipy/scipy/pull/124

https://github.com/scipy/scipy/pull/76

https://github.com/scipy/scipy/pull/185

我不知道如何在 github 上找到 solveh_banded 的初始提交。

于 2012-04-20T14:56:48.007 回答