diff --git a/_posts/2024-06-21-GAMES001-NOTES-12.md b/_posts/2024-06-21-GAMES001-NOTES-12.md index 50a2ead..95769a5 100644 --- a/_posts/2024-06-21-GAMES001-NOTES-12.md +++ b/_posts/2024-06-21-GAMES001-NOTES-12.md @@ -12,8 +12,49 @@ sidebar: > 这个系列是GAMES001-图形学中的数学([GAMES 001: Mathematics in Computer Graphics](https://games-cn.org/games001/))的同步课程笔记。课程旨在总结归纳图形学学习过程中重要的数学概念、理论和方法,并将以索引的形式在每一章节中穿插讲解该数学专题在图形学中的应用。本课程既可以作为GAMES系列其它课程学习的基础或"手册",也可以作为站在不一样的视角复习图形学知识的平台。本节主要介绍求解线性系统的相关技术。 +求解线性系统实际上就是解矩阵方程 + +$$ +\mathbf{A} \boldsymbol{x} = \mathbf{b} +$$ + +在图形学的各个研究方向中,许多问题的本质就是求解一个线性系统。 + +
+ +
+ ## 直接求解 +### 高斯消元 + +求解线性系统的基本方法是直接进行求解,其中[高斯消元法](https://en.wikipedia.org/wiki/Gaussian_elimination)是这类方法的典型代表。具体来说,高斯消元法会同时对系数矩阵$$\mathbb{A}$$和向量$$\mathbf{b}$$进行行变换,使得矩阵$$\mathbb{A}$$变成一个上三角矩阵。得到上三角矩阵后即可从下往上反向回代计算出解$$x$$。 + +
+ + + +
+ +换个角度来看,矩阵的行变换等价于左乘一个下三角矩阵。因此,高斯消元法可以理解为对矩阵进行[LU分解](https://en.wikipedia.org/wiki/LU_decomposition)。通过LU分解,我们将系数矩阵$$\mathbb{A}$$分解为一个下三角矩阵$$\mathbb{L}$$和一个上三角矩阵$$\mathbb{U}$$的乘积。然后,通过求解两个较简单的线性系统$$\mathbb{L} \mathbf{y} = \mathbf{b}$$和$$\mathbb{U} \mathbf{x} = \mathbf{y}$$就可以得到最终解$$x$$。 + +
+ + +
+ +从编程的角度来讲,高斯消元法的核心在于计算矩阵的LU分解,其伪代码可以参考如下。显然,LU分解的复杂度为$$O(n^3)$$。因此,LU分解是一个复杂度比较高的算法,不过可以利用一些并行的方法来进行加速。 + +
+ +
+ +使用高斯消元法时还需要注意,如果当前选择的对角线元素值接近0时会产生数值计算上的不稳定。为了处理这种情况,可以考虑每次都选择当前列中绝对值最大的那一行作为主元,然后再利用主元来消去其它行。这种带选择主元的高斯消元法也称为列主元高斯消元法或部分主元高斯消元法(Gaussian Elimination with Partial Pivoting, GEPP)。 + +
+ +
+ ## 迭代求解 ## Reference