解决SEVERAL线性系统的最有效方法Ax = b with SMALL A(最小3x3最大8x8)

时间:2013-03-30 13:21:09

标签: linear-algebra performance

我需要解决数千个时间为Ax = b的SMALL线性系统。这里A是一个不小于3x3且最大为8x8的矩阵。我知道这个http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/所以我不认为即使矩阵很小也能反转矩阵是否明智?那么最有效的方法是什么?我在Fortran编程所以我应该使用lapack库吗?我的矩阵是完整的,通常是非同步的。 谢谢 甲

2 个答案:

答案 0 :(得分:2)

警告:我没有广泛地研究这个问题,但我有一些经验,我很乐意分享。

根据我的经验,解决3x3系统的最快方法是基本上使用Cramer's rule。如果你需要用相同的矩阵A求解多个系统,那么预先计算A的倒数是值得的。这仅适用于2x2和3x3。

如果你必须使用相同的矩阵求解多个4x4系统,那么再次使用逆矩阵明显快于LU的前向和后置替换。我似乎记得它使用较少的操作,并且在实践中差异更大(再次,根据我的经验)。随着矩阵大小的增加,差异缩小,渐渐地差异消失。如果您正在使用差异矩阵求解系统,那么我认为计算逆矩阵没有优势。

在所有情况下,使用逆向求解系统可能比使用LU分解准确度要低得多,因此A是相当不良的。因此,如果准确性是一个问题,那么LU分解肯定是要走的路。

答案 1 :(得分:1)

LU factorization听起来就像是你的票,而lapack例程dgetrf将为你计算,之后你可以使用dgetrs来解决这个线性系统。多年来,Lapack已经针对鳃进行了优化,因此您最好使用它,而不是自己编写任何代码。

计算矩阵逆的计算成本然后乘以右侧矢量计算成本是相同的,如果不是计算矩阵的LU分解,然后前向和后向求解以找到答案。此外,计算逆变量表现出比计算LU分解更奇怪的病态行为,其稳定性仍然是一个相当微妙的问题。知道小矩阵的逆是有用的,但听起来你并不需要它,为什么呢?

此外,如果没有循环携带的依赖项,您可以使用OpenMP并行化,而不会有太多麻烦。