不管哪一种数值算法,其设计原理都是将复杂转化为简单的重复,或者说,通过简单的重复生成复杂,在算法设计和算法实现过程中,重复就是力量[1]。 ----题记
一般地,线性方程组可以表达为
Ax = b
其中,A称为系数矩阵,b称为右端项,x为待求的未知数向量。
迭代法的适用场合。如果未知数个数不多的话,用消去法(包括各种选主元的方式)就可以完美地解决,但是实际情况中,如有限元方程中,系数矩阵常常是大规模稀疏矩阵(所谓稀疏,指的是矩阵中只有少量的元素值非零),这个时候再使用消去法的话(其实,它可以转化为矩阵形式的 LU 分解),就会破坏系数矩阵的稀疏性,导致计算量激增。
先看两种简单情况下的结果。如果系数矩阵为对角阵的话,那么方程可以很容易地求解出来;稍微复杂一些,如果系数矩阵为下三角型矩阵的话,那么可以先求出第一个未知数,再求出第二个未知数,一直顺序进行下去,直至求出最后一个未知数。
在 [1] 中(P139)提到,求解线性方程组的迭代法,其实质是将所给方程组逐步地对角化或三角化,即将线性方程组的求解过程加工成对角方程组或三角方程组求解过程的重复。当加工成对角方程组求解过程的重复时,对应于 Jacobi 迭代法;当加工成三角方程组求解过程的重复时, 对应于 Gauss-Seidel 迭代法。进一步地,如果对 Gauss-Seidel 迭代法使用松弛技术(将两个相伴随的近似值进行加权来更好地逼近目标值的方法,该技术的关键在于加权系数即松弛因子的选取),就得到了超松弛 (SOR) 迭代方法(这里的“超”是指加权的系数的取值可以不必在[0,1]范围内);考虑到对称正定的系数矩阵,由于其上三角矩阵是其下三角矩阵的转置,针对上三角形式,使用 SOR迭代方法,接着针对下三角形式,类似地可以使用 SOR 迭代方法,和前者不同仅仅是未知数迭代的顺序,后者采用的是倒序的方式。额,既然两次使用 SOR 迭代方法,那么自然地就将其称之为 SSOR 迭代法 [2]。Oh,No! 其实不是这样子滴,SSOR 里面的第一个 S 是对称的(Symmetric)这个单词的首字母。将SSOR迭代法中的矩阵用作共轭梯度法中的预处理矩阵,就可以得到相应的SSOR-PCG方法[3]。
迭代法是否奏效,即迭代序列能否逼近问题的真解,就需要考虑收敛性问题了。粗略地分析,从前后两个序列的差来看,自然要求它们之间的距离(可以给出不同形式定义的,常见的有1-范数,2-范数以及无穷范数)越来越小,直至趋于 0。注意到,迭代的序列是一个向量序列,借用数值序列的结论(考虑一个等比数列a_n=k*a_{n-1}趋于0,那么k的绝对值必须小于1),这里要求迭代矩阵的范数(可以将其看成数的绝对值)小于1。
后记:强烈推荐王能超先生的书。
参考资料:
[1] 《计算方法--算法设计及其MATLAB实现(第2版)》 Chap5 线性方程组的迭代法,王能超编著,华中科技大学出版社,2012年
[2] 《矩阵计算(第3版)》10.1.6 对称SOR方法,Gene H. Golub,Charles F. Van Loan著,袁亚湘等译,人民邮电出版社,2011年
[3] 《有限元结构分析并行计算》Chap5 大型稀疏有限元方程组求解的并行预处理迭代解法,周树荃等著,科学出版社,1994年