我有一个系统Ax = b,其中B是一个常数,但A在每次迭代中都会保持少量变化。我正在使用UMFPACK 5再次解决这个线性系统,就像A更改一样。我可以通过两种方式完成上述工作:
以上哪种方法是正确的?对于上述两个程序,我得到了完全不同的答案(正如预期的那样)。任何帮助或评论表示赞赏。感谢。
答案 0 :(得分:2)
符号分解仅取决于稀疏模式(UMFPACK表示中的Ap和Ai)。数值分解取决于实际值(Ax)。因此,您只需计算一次符号分解,但需要在每个分解中重新计算数值分解。
UMFPACK的文档显示这是对现实的轻微简化。实际上,UMFPACK确实使用实际值来进行符号分解,但它只区分“小”和“大”值。因此,如果矩阵A只有一点变化,那也没关系。如果值(Ax)变化太大以至于先前的“小”值变大,或者相反,那么符号分解可能会改变。但是,如果对新Ax使用旧的符号分解,您仍将获得正确的数值分解和正确的解决方案,但如果使用新的符号分解,UMFPACK(可能)更有效。
因此,是否要重新计算符号分解取决于计算符号分解所需的时间,以及如果使用具有正确Ax的符号分解,则数字分解的速度会更快。我的猜测是,如果你只改变几个值,你不想重新计算符号分解,但你需要进行基准测试。
答案 1 :(得分:0)
第二种方法是正确的,就像你计算数值因子分解一样,你应该在每次迭代中重复它。