如何使用Matlab中的旋转将矩阵转换为对角占优矩阵

时间:2015-08-24 01:05:39

标签: matlab matrix

您好我正在尝试解决以下类型的线性系统:

A*x=b, 
where A is the coefficient matrix, 
x is the vectors of unknowns and 
b is the vector of solution. 

系数矩阵(A)是n×n稀疏矩阵,对角线中偶数为零。为了准确地解决这个系统,我在Matlab中使用了一种名为bicgstab(Biconjugate梯度稳定方法)的迭代方法。

该系数矩阵(A)具有

det(A)=-4.1548e-05 and a rcond(A)=  1.1331e-04. 

因此矩阵病态。我首先尝试执行缩放和结果,其中:

det(A)= -1.2612e+135 but the rcond(A)=5.0808e-07... 

因此矩阵仍然是病态的......我验证了非对角元素的所有绝对值的总和,其中163.60和对角元素的所有绝对值的总和在哪里32.49 ...因此矩阵系数不是对角占优势的,并且不会使用我的函数bicgstab收敛...

我正在寻找可以帮助我执行转向系数矩阵(A)的人,因此它可以是对角占优势的。或任何解决这个问题的建议......

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,这里应该注意很多事情:

  1. 不要使用行列式来估计奇点的数量"你的矩阵行列式是所有矩阵的特征值的乘积,因此与条件数更好的度量相比,它的缩放可能会产生误导,导致下一个点......

  2. 你的调节(根据rcond)并不是那么糟糕,你是使用单精度还是双精度?大问题通常可以在这个范围内获得条件数,并且仍然是可以解决的,但当然这取决于许多因素的非常复杂的相互作用,其中条件数仅起很小的作用。这导致了另一个复杂的问题:

  3. 对角线优势可能对你没有任何帮助。据我所知,BiCGStab的收敛不需要对角线优势,而且我也不认为对角线优势是已知的,甚至可以帮助它。对角线优势通常是由其他迭代方法(例如Jacobi方法或Gauss-Seidel)做出的假设。实际上,BiCGStab的收敛行为根本不是很清楚,它通常只在内存是一个非常严重的问题时使用,但共轭梯度不适用。

  4. 如果您真的对使用Krylov方法(例如BiCGStab)感兴趣来解决问题,那么您通常需要更多地了解矩阵的来源,以便您可以选择合理的预处理器。

    所以这需要更多信息。你对这个矩阵有更多了解吗?它是由某种身体问题引起的吗?你知道吗,例如它是对称的还是肯定的(我不会假设两者都是因为你没有使用CG)。

    让我以一些非常通用的可操作建议结束,因此不一定是最佳的:

    1. 如果内存不是问题,请考虑使用重新启动的GMRES而不是BiCGStab。我的经验是GMRES具有更强大的收敛性。
    2. 尝试使用近似分解预处理器,例如ILU。 MATLAB具有内置的功能。