纸上得来终觉浅,绝知此事要躬行。
----(宋)陆游
在使用有限差分法的五点格式求解偏微分方程组时,把问题转化为求解数量级从10直到为10^4个未知数的稀疏矩阵的线性方程组,然后使用了Jocobi迭代,G-S迭代,SOR迭代以及CG迭代求解。
不管从程序的运行时间还是结果精度来看,SOR迭代和CG迭代较另外两种迭代法占优,而数值结果显示SOR迭代和CG迭代的收敛速度基本相当(后者稍微占优一点儿),这和理论的推导结果吻合地很好。
从程序使用的内存空间考虑的话,问题变得复杂了。简言之,CG方法依旧胜出,而除了Jacobi迭代法之外的其他迭代方法在处理数量级为10^4个未知数的时候都会遇到out momery的情况。
综合考虑,在能使用CG方法的情况下(它适用于稀疏矩阵的线性方程组的求解,但是要求线性方程组对应的系数矩阵为对称正定阵,在五点差分格式中,满足该条件且矩阵为稀疏矩阵),首选CG方法。
PS:
1.在使用G-S迭代法求解数量级为10^4个未知数的方程组(此时,方程组对应的系数矩阵为10^8的数量级)时,如果使用其对应的矩阵迭代格式的话,那么要涉及到稀疏矩阵的求逆,就五点差分格式转化的方程组而言,在G-S迭代中涉及的稀疏矩阵的逆却不是稀疏矩阵,由于要存储的数据太多,导致out momery而使程序无法计算下去。
2.再拿G-S迭代法来看,发现其分量的迭代格式能够大量地节省存储空间,它只需要系数矩阵和常数项的存储信息而不涉及到逆矩阵的计算和存储。不过呢,较矩阵的迭代格式,分量迭代格式更新的速度太慢。程序中未知数的个数在10^3数量级,后者运行时间大概需要200多秒,前后两次迭代的误差设置为10e-2,而同样规模如果使用G-S的矩阵迭代格式运行时间不到1秒,而前后两次迭代的误差设置为10e-4。所以,从运行时间考虑,G-S方法的分量迭代格式显然慢。
3. 虽然G-S迭代的矩阵格式和分量格式在理论推导上没有什么区别,但是在实际的程序运行过程中却出现了巨大的差异。这主要是matlab的最重要的一个特点是向量化计算产生的。从某个角度来看,分量迭代格式类似于显格式,而矩阵迭代格式类似于隐格式。