我需要计算子程序 F(U) 的雅可比矩阵。F 和 U 的大小均为 N(=O( ))。使用 Tapenade,我区分了切线模式下的例程。由于需要大量内存,我无法直接计算完整的雅可比行列式。
是否有一个包可用于解析差异化的 FORTRAN 例程以获取稀疏模式?最好在python中。
我计划使用 N 切线计算天真地构造雅可比矩阵,使用稀疏模式来减少内存使用。有没有更好的方法来做到这一点?
由于其他问题,我想坚持使用 Tapenade。
我需要计算子程序 F(U) 的雅可比矩阵。F 和 U 的大小均为 N(=O( ))。使用 Tapenade,我区分了切线模式下的例程。由于需要大量内存,我无法直接计算完整的雅可比行列式。
是否有一个包可用于解析差异化的 FORTRAN 例程以获取稀疏模式?最好在python中。
我计划使用 N 切线计算天真地构造雅可比矩阵,使用稀疏模式来减少内存使用。有没有更好的方法来做到这一点?
由于其他问题,我想坚持使用 Tapenade。
如果您使用 Julia,则SparsityDetection.jl通过使用非标准分析和 concolic fuzzing 直接从函数的 AST 确定稀疏模式来解决 (1),并且SparseDiffTools.jl执行矩阵着色和着色自动微分以进行稀疏计算的雅可比来解决(2)。
还有其他系统可以做到这一点,只是不是在高级语言中。TAF在 Fortran 中是很好的,DAEPACK也是如此,而ADOL-C在 C++ 中可以做到这一点。这些都检测稀疏性并使用矩阵着色技术。我不知道 Python 中的解决方案。
我需要计算子程序 F(U) 的雅可比矩阵。F 和 U 的大小都是。使用 Tapenade,我区分了切线模式下的例程。由于需要大量内存,我无法直接计算完整的雅可比行列式。
有AD(自动微分)软件包可以做这个计算;我知道DAEPACK可以,因为它来自我的博士导师小组。Tapenade 似乎没有稀疏分析功能。
- 是否有一个包可用于解析差异化的 FORTRAN 例程以获取稀疏模式?最好在python中。
我的直觉是它可能不存在,因为它需要大量的静态分析。粗略的谷歌搜索支持了这一点。
- 我计划使用 N 切线计算天真地构造雅可比矩阵,使用稀疏模式来减少内存使用。有没有更好的方法来做到这一点?
大概。这真的取决于你想用雅可比矩阵做什么。如果您主要想解决条件相对较好或适合预处理的线性系统,我建议您考虑无矩阵方法,这将允许您利用计算的切线。无雅可比的 Newton-Krylov 方法甚至可能是可行的,这将使 AD 变得不必要。
但是,如果您真的需要整个雅可比矩阵,我建议您改为使用稀疏 AD。
关于您问题的第 2 项,假设您具有稀疏模式,通常可以用远少于 N 次函数评估来计算雅可比行列式。这个想法是因为雅可比是稀疏的,您可以使用单个函数评估来评估多个列。看看这篇论文的详细信息:
粗略的谷歌搜索显示了这个资源。
它是一组 FORTRAN 子程序,用于确定一般多元函数的雅可比稀疏模式。您将要查看的是 subroutine RP01A
:
C This subroutine automatically generates the sparsity pattern
C of a sparse Jacobian matrix with an arbitrary or band structure.
有一个数字示例列表(尽管 N 非常小),您可以将其用作您自己的问题的起点。我不确定他们的算法是否可以处理类似,但我认为值得一试。