如果一切顺利的话,高斯消除法非常简单,并且在入门课程中一切都进展顺利。
您有一个n × n矩阵A 、一个n × 1 列向量b ,并且您想要找到一个n × 1 列向量x使得Ax = b 。
您减去A和b的第一行的倍数,将a 11下面的所有元素清零。然后减去A和b第二行的倍数,将a 22以下的所有元素清零。继续这样做,直到对角线下方的所有元素都为零。然后您可以使用回代来求解x 。
上述过程称为朴素高斯消除。这篇文章适合那些熟悉朴素高斯消除法但没有意识到它是朴素的人。
创建零
假设矩阵A的前两行如下:
2 * * * …
3 * * * …
然后从第二行中减去新的第一行的 3/2 倍:
2 * * * …
0 * * * …
您将继续从其余行中减去第一行的倍数。
可能会出什么问题?
如果前两行看起来像这样怎么办?
0 * * * …
3 * * * …
在这种情况下,朴素高斯消除法在第一步就失败了。据我所知,当我学习线性代数时,我从未见过这样的例子:朴素的高斯消去法总是有效的。在我学习数值分析课程之前,我认为我从未遇到过这种可能性。
解决该问题的最简单方法是交换前两行:
3 * * * …
0 * * * …
我想早在有人给这个过程命名之前,这个策略就通常是通过手工计算完成的。我说我不记得在线性代数课上遇到过这个问题。也许是在家庭作业中出现的,我不假思索地交换了行。但如果你要编写软件来实现高斯消元法,你就必须系统地考虑这些事情。
您可能有一个程序实际上交换行,或者如果您更注重性能,您可能会在概念上交换行,使用索引跟踪交换,但不移动内存中的数据。
枢轴和旋转
第一行中的第一个元素称为枢轴。更一般地,高斯消去法第k步的a kk元素是主元。当您遇到零主元时,您会遇到一个逻辑问题:如果没有一些帮助(即交换行),朴素的高斯消除就无法进行。不太明显但仍然正确的是,如果遇到小枢轴,就会遇到数值问题。当在计算机上进行浮点运算时,小但非零的主元可能会导致精度损失,甚至可能是灾难性的损失。
交换行以避免小主元称为部分主元。在实践中,部分旋转通常就足够了。完全旋转还允许交换列。您可以深入探索各种旋转策略的细微差别。
高斯消去法是高中课程的一部分,但在应用这种看似简单的算法时,有很多实际问题需要解决。正如数值分析专家劳埃德·特雷芬森 (Lloyd Trefethen) 所说,“看得越仔细,高斯消元法就越微妙、越显着。”
相关帖子
什么是部分旋转?首次出现在约翰·D·库克 (John D. Cook)节目中。
原文: https://www.johndcook.com/blog/2025/03/01/what-is-partial-pivoting/