假设我正在数值求解 delta 函数源的 Poisson 方程:
我可以代表拉普拉斯算子使用有限差分法作为三对角矩阵. 我可以将 delta 函数表示为向量那是无处不在,除了它所在的一个地方(这里表示网格的长度)。
因此,我的结果方程组非常稀疏——矩阵只有非零元素和矢量只有非零元素。
是否有针对求解优化的数值方法对于这个相当具体的案例?我见过一些利用矩阵稀疏性的求解器,但我还没有找到一个也利用矩阵稀疏性的求解器向量。我可能很天真,但我觉得自己很稀疏向量应该大大简化求解。
假设我正在数值求解 delta 函数源的 Poisson 方程:
我可以代表拉普拉斯算子使用有限差分法作为三对角矩阵. 我可以将 delta 函数表示为向量那是无处不在,除了它所在的一个地方(这里表示网格的长度)。
因此,我的结果方程组非常稀疏——矩阵只有非零元素和矢量只有非零元素。
是否有针对求解优化的数值方法对于这个相当具体的案例?我见过一些利用矩阵稀疏性的求解器,但我还没有找到一个也利用矩阵稀疏性的求解器向量。我可能很天真,但我觉得自己很稀疏向量应该大大简化求解。
在查看系统的解决方案时,您会发现几乎所有的条目尽管右侧是“稀疏的”,但它们是非零的。因此,无论您使用哪种算法,它都必须至少访问每个条目一次,因此人们不会期望您可以使用稀疏性来节省大量时间.
例如,可以节省大量计算的右侧是特征向量的倍数由于解决了
也就是说,每个满秩三对角方程组都可以求解. 使用多重网格,任何维度的泊松方程也是如此。
从您的问题中,我不清楚答案是具有理论意义还是实际意义。我会解决这两个问题。
为了使其具有实际重要性,您的系统需要有大量的方程,或者您需要多次求解。我怀疑简单地调用 Lapack 函数dptsv,该函数专门用于求解对称三对角系统,比在稀疏矩阵上调用 MATLAB 反斜杠要快得多。并且它将足够接近最佳时间方法,因此花费更多的精力是不值得的。然而,它并没有利用稀疏的右手边。该算法在Golub 和 Van Loan的第 4.3.6 节中进行了描述。总共需要浮点运算(触发器);用于矩阵分解的触发器和触发器来计算给定右手边的解决方案。
Davis 的《稀疏线性系统的直接方法》一书的第 3 章
涉及求解左侧有三角矩阵的线性系统。他在这个主题上花费了相当多的时间,因为本书中大多数一般稀疏矩阵的方法都依赖于求解这些三角系统次。他指出,如果每个三角形求解都假设右侧向量是密集的,那么这些方法将不切实际。所以他描述了一种线性求解算法,它允许一个通用的、稀疏的右手边向量并在函数中实现它
cs_spsolve。要使用本书中描述的软件求解对称正定系统,需要调用 以cs_chol分解稀疏矩阵,然后调用 2次cs_spsolve。这在理论上很有趣,但我怀疑它会导致比 Lapack 方法更少的计算时间,除非您正在求解许多右手边(例如,在网格中的不同点具有 delta 函数的许多情况)。