4

我有一个系统 Ax = b,其中 B 是一个常数,但 A 在每次迭代中都会发生少量变化。我正在使用 UMFPACK 5 再次解决这个线性系统,就像 A 的变化一样。我可以通过两种方式完成上述操作:

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

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

4

2 回答 2

2

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

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

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

于 2012-03-02T15:34:07.453 回答
0

第二种方法是正确的,就好像你计算数值分解你应该在每次迭代中重复它一样。

于 2012-03-01T19:45:23.523 回答