C++ 在UMFPACK中,我们需要多久进行一次符号和数字因式分解?

C++ 在UMFPACK中,我们需要多久进行一次符号和数字因式分解?,c++,linear-algebra,numerical-computing,umfpack,C++,Linear Algebra,Numerical Computing,Umfpack,我有一个系统Ax=b,其中b是一个常数,但a在每次迭代中都会有少量的变化。我用UMFPACK 5来解这个线性系统,就像一个变量一样。我可以通过两种方式完成上述工作: 仅在开始时计算矩阵A的符号和数字因式分解,并在每次迭代中使用此数值对象求解Ax=b(当然,在稀疏矩阵表示中,Ax随A的变化而变化。Ap和Ai保持不变) 在每次迭代中计算矩阵A的符号和数字因式分解(即,一个新的数字对象作为A的变化),并使用这个新的数字对象求解Ax=b 以上哪种方法是正确的?对于上述两个过程,我得到了完全不同的答案(正

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

  • 仅在开始时计算矩阵A的符号和数字因式分解,并在每次迭代中使用此数值对象求解Ax=b(当然,在稀疏矩阵表示中,Ax随A的变化而变化。Ap和Ai保持不变)
  • 在每次迭代中计算矩阵A的符号和数字因式分解(即,一个新的数字对象作为A的变化),并使用这个新的数字对象求解Ax=b
    以上哪种方法是正确的?对于上述两个过程,我得到了完全不同的答案(正如预期的那样)。欢迎提供任何帮助或意见。谢谢。

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

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

    UMFPACK的文档显示,这是对现实的一个轻微简化。事实上,UMFPACK确实使用实际值进行符号分解,但它只区分“小”值和“大”值。因此,如果矩阵A变化很小,这并不重要。如果值(Ax)的变化如此之大,以至于以前的“小”值变大,或者相反,那么符号分解可能会改变。但是,如果您将旧的符号分解与新的Ax一起使用,您仍然可以得到正确的数值分解和正确的解决方案,尽管如果您使用新的符号分解,UMFPACK(可能)会更有效


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

    嘿,感谢您提供的详细概述。:)My A矩阵正在发生变化,因此每次从10kX10k矩阵中减去/添加的条目不到4个,但这种变化可能会使一些(最多2个)条目成为“小”条目,即接近零。在这种情况下,也许我应该重新计算符号和数字的因式分解。另外,如果可能的话,请你详细说明你说的“如果值错误,你仍然会得到正确的结果”是什么意思。再次感谢你的帮助。