贡献者: addis
1求解线性方程组是科学计算中最普遍也是最为常见的问题,几乎所有与科学计算有关的问题都直接或间接与它有关。不论是常微分方程,偏微分方程,非线性方程,最优化,甚至是图像和信号处理,机器学习等等问题,最终都会转化成求解线性方程组。因此,线性方程组的解法也是科学计算领域里研究最广泛的问题之一。
线性方程的数值解法按照求解过程可以分为:直接法(direct method)和迭代法(iterative method)。其中,直接法顾名思义就是直接求得方程组的解,这个解在很多情况下就是方程组的解析解。一般常用直接法为高斯消元法(Gauss elimination)或者是 LU 分解(LU decomposition)。
而相对应的,迭代法则是通过有限次的迭代,将数值解不断逼近解析解的过程。因此,迭代法通常都会引入一定的误差。这些误差可以通过增加迭代次数和改进方法逐渐逼近于机器精度。目前常见的迭代法包含了:雅可比法(Jacobi method),高斯-赛德尔迭代(Gauss-Seidel method),Krylov 子空间法(Krylov subspace methods)等。由于迭代法对于数值代数的要求较高,这里就不做过多展开了。有兴趣的同学可以在下面留言,我会单独开一个子专栏进行讨论。
事实上,高斯消元法的过程就是构造 LU 分解的上下三角矩阵的过程。关于这个高斯消元法的基本算法见 “高斯消元法解线性方程组” 或参考 Wikipedia 相关页面。
这里我想从更宏观的角度来分析一下高斯消元法和 LU 分解。这个方法的主要思路包含三步,以求解
通过高斯消元或者 LU 分解,得到
经过消元得到新的
经过简单的计算,这样的消元过程总共需要进行
把
那么,整个的替换过程需要
最后,我们利用从2.中得出的
同样的,它也需要
这样看起来,我们把求解一个线性方程组的问题转化成了一个 LU 分解和求解两个线性方程组,但是由于
让我们来用下面的代码直接测试一下高斯消元法的运算复杂度。
运行后可以得到如下输出
以及下面的图片
从结果的拟合曲线可以看出,求解线性方程组的总体运算时间基本符合
假设我们的计算机每秒可以处理
高斯消元 | 后向替换 | |
| | |
| | |
| | |
即使是当今世界上最快的超级计算机,它们的运算速率可以达到
然而,很多实际应用问所需要求解的线性方程组的尺度经常会大于