c++ - 在 UMFPACK 中,我们需要多久进行一次符号和数值分解?

标签 c++ linear-algebra numerical-computing umfpack

我有一个系统 Ax = b,其中 B 是一个常数,但 A 在每次迭代中不断变化。随着 A 的变化,我再次使用 UMFPACK 5 来求解这个线性系统。我可以通过两种方式执行上述操作:

  1. 一开始计算矩阵A的符号和数值因式分解,并在每次迭代中使用这个数值对象求解Ax = b(当然在稀疏矩阵表示中,Ax随着A的变化而变化.Ap 和 Ai 保持不变)。
  2. IN EACH 迭代计算矩阵 A 的符号和数值因式分解(即随着 A 的变化一个新的数值对象)并使用这个新的数值对象求解 Ax = b。

以上哪种方式是正确的?对于上述两个过程,我得到完全不同的答案(正如预期的那样)。任何帮助或评论表示赞赏。谢谢。

最佳答案

符号分解仅取决于稀疏模式(UMFPACK 符号中的 Ap 和 Ai)。数值分解取决于实际值 (Ax)。所以你只需要计算一次符号分解,但你需要在每次分解中重新计算数值分解。

UMFPACK 的文档表明这是对现实的轻微简化。事实上,UMFPACK 确实使用实际值进行符号分解,但它只区分“小”值和“大”值。因此,如果矩阵 A 仅发生一点变化,那无关紧要。如果值 (Ax) 变化太大以至于之前的“小”值变大,或者相反,则符号因式分解可能会发生变化。但是,如果您将旧的符号分解与新的 Ax 一起使用,您仍然会得到正确的数字分解和正确的解决方案,尽管如果您使用新的符号分解,UMFPACK(大概)更有效。

因此,您是否要重新计算符号因式分解取决于计算符号因式分解需要多长时间,以及如果您使用具有正确 Ax 的符号因式分解,数值因式分解的速度有多快。我的猜测是,如果您只更改几个值,您不想重新计算符号分解,但您需要进行基准测试。

关于c++ - 在 UMFPACK 中,我们需要多久进行一次符号和数值分解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522687/

相关文章:

c++ - 窗口移动后点击坐标

c++ - 海湾合作委员会 assembly "+t"

javascript - 不断移动位置的两点之间的线性运动

用于图像处理掩蔽任务的 Java 库

math - Clojure 矩阵表示

Python 打印计算比执行计算需要更多时间

c++ - 隐式转换中的隐式参数

c++ - 错误 C2227、C2065,类中的类

optimization - Clojure 中的快速复数运算

api - 用于矢量化数值计算的最佳 Scala 集合类型