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