如何用matlab求解Ax = b,其中A是一个大的非对称稀疏矩阵?

时间:2016-06-11 05:42:19

标签: matlab sparse-matrix

我正在使用Ax = b,其中A非常大(超过1米* 1米大小),matlab中的非对称稀疏矩阵。我以稀疏的方式构建A。但是,直接使用A\b太慢了。我试过了gmres。但是,如果没有预调节器,我无法得到正确的答案,并且使用预调节器(例如ilu),它也太慢了。

如何有效地解决这个问题? THX。

1 个答案:

答案 0 :(得分:1)

很难给出确定的答案,因为它取决于您正在解决的系统的细节。不幸的是,这涉及到很多试验和错误,并且没有保证的方法适用于任何系统。以下是一些需要考虑的事项:

  1. 系统有多稀疏,too slow有多慢? 1M x 1M是一个相当大的系统,但工作取决于非零的数量;所以,如果你的系统有很多非零,那么是的,它需要一段时间才能运行;可能导致运行时间长的另一个方面是系统的数值调节不佳(参见12);只要您使用有效的预处理器
  2. ,预处理应该有助于此
  3. 尝试不同的迭代方法:例如BiCG methodBiCGStab,这也适用于非对称系统
  4. 尝试调整ILU预调节器或使用不同的预调节器:增加跌落容差将导致更稀疏的预调节器,这可能会影响收敛,但会减少每次迭代的总工作量(小于跌落的值)在分解期间从稀疏矩阵中去除容差);您还可以调整预准分子ilu(0)croutilutp的类型;
  5. 确保使用BLAS库的并行和优化实现,例如英特尔MKL Blas或至少Open BLAS;这应该加快直接的方法一点点
  6. 最后你可以尝试使用不同的框架;其他框架还允许您直接选择ILU预处理器的填充级别(为您提供更多的探索选项,这会产生更密集的预处理器,但具有更好的收敛行为);像PetSC这样的其他框架也支持更广泛的preconditionersiterative solvers;