高斯消元
高斯消元法:一堂充满"火药味"的数学大战
第一章:序幕——咱们的敌人
想象一下,你面前摆着一堆方程,它们嚣张地说:
2x + 3y + z = 7 (方程A) 4x - y + 2z = 9 (方程B) x + y + 3z = 10 (方程C)
你只是个普通的数学家,但今天,你要让它们乖乖听话!
第二章:武器准备——增广矩阵
首先,把敌人排成整齐的队伍(这是国际惯例,方便歼灭):
[ 2 3 1 | 7 ] [ 4 -1 2 | 9 ] [ 1 1 3 | 10 ]
这就是增广矩阵——左边是系数,右边是常数,中间用竖线隔开,像自助餐一样:左边是菜,右边是价格。
第三章:作战计划——三个绝招
你有三个魔法可以施展(初等行变换):
-
换位术:把两行交换位置("你站那边去!")
-
缩放术:把一行整体乘以一个数("大家都减肥/增肥!")
-
消元术:把一行的倍数加到另一行("你去帮我干掉那个变量!")
重要军规:这些魔法不会改变方程组的解!就像你换了身衣服,人还是那个人。
第四章:第一回合——擒贼先擒王
第一步:找个好"老大"(选主元)
看第一列:[2, 4, 1]
谁的绝对值最大?4!在第二行。
但是...等等!第一行的2虽然小,但是...
重要战术:用部分主元法——找绝对值最大的那个!为啥?
-
避免除零(除零会召唤数学恶魔)
-
避免小数字放大误差(像用显微镜看蚂蚁,结果把蚂蚁吓跑了)
于是我们把第二行换到第一行:
[ 4 -1 2 | 9 ] ← 新老大上位 [ 2 3 1 | 7 ] [ 1 1 3 | 10]
第二步:让老大减肥(归一化)
现在老大是4,但我们希望它是1(因为1最听话)。
整行除以4:
[ 1 -0.25 0.5 | 2.25 ] ← 减肥成功! [ 2 3 1 | 7 ] [ 1 1 3 | 10 ]
看到没?老大现在说:"我代表x,我的系数是1!"
第五章:大清洗——干掉所有x
现在要用老大去消灭其他方程里的x。
作战指令:
-
第二行:有2个x,减去第一行×2
-
第三行:有1个x,减去第一行×1
计算过程(看着就行,别晕):
第二行:[2 3 1 | 7] - 2×[1 -0.25 0.5 | 2.25]
= [2 3 1 | 7] - [2 -0.5 1 | 4.5]
= [0 3.5 0 | 2.5]
第三行:[1 1 3 | 10] - 1×[1 -0.25 0.5 | 2.25]
= [0 1.25 2.5 | 7.75]
更新矩阵:
[ 1 -0.25 0.5 | 2.25 ] [ 0 3.5 0 | 2.5 ] ← x已阵亡 [ 0 1.25 2.5 | 7.75 ] ← x已阵亡
第六章:第二轮——瞄准y
现在只看第二行和第三行(第一行已经完成使命)。
第一步:选新老大
第二列下面两行:[3.5, 1.25]
3.5最大,而且不为0(如果为0就喊"No Solution"了,游戏结束)。
第二步:老二减肥
第二行除以3.5:
[ 1 -0.25 0.5 | 2.25 ] [ 0 1 0 | 0.714] ← 注意:3.5/3.5=1, 0/3.5=0, 2.5/3.5≈0.714 [ 0 1.25 2.5 | 7.75 ]
第三步:清洗y
用第二行消去其他行的y:
第一行:有-0.25个y,加上第二行×0.25
第一行:[-0.25] + 0.25×[1] = 0 ✓
第三行:有1.25个y,减去第二行×1.25
第三行:[1.25 2.5 | 7.75] - 1.25×[1 0 | 0.714]
= [0 2.5 | 7.75 - 0.8925]
= [0 2.5 | 6.8575]
更新矩阵:
[ 1 0 0.5 | 2.25 + 0.1785 ≈ 2.4285 ] [ 0 1 0 | 0.714 ] [ 0 0 2.5 | 6.8575 ]
第七章:最后一击——搞定z
第三行除以2.5:
[ 1 0 0.5 | 2.4285 ] [ 0 1 0 | 0.714 ] [ 0 0 1 | 2.743 ] ← z终于现身了!
现在用第三行消去其他行的z:
第一行:有0.5个z,减去第三行×0.5
第一行:[0.5] - 0.5×[1] = 0 ✓ 结果:2.4285 - 0.5×2.743 = 2.4285 - 1.3715 = 1.057
最终矩阵:
[ 1 0 0 | 1.057 ] [ 0 1 0 | 0.714 ] [ 0 0 1 | 2.743 ]
第八章:胜利阅兵——读取答案
就像阅兵式一样,每个变量站得笔直:
x = 1.057 y = 0.714 z = 2.743
检验一下(数学家的强迫症):
2×1.057 + 3×0.714 + 2.743 ≈ 7 ✓ 完美!
第九章:特殊情况——当战争出意外
情况1:遇到"零将军"
如果在选老大时发现整列都是0:
[ 1 2 0 | 5 ] [ 0 0 0 | 3 ] ← 警报!0=3? [ 0 0 1 | 2 ]
这说"0=3"——明显说谎!直接判无解!
情况2:遇到"墙头草"
[ 1 2 0 | 5 ] [ 0 0 0 | 0 ] ← 0=0,永远正确 [ 0 0 1 | 2 ]
这意味着有自由变量,无穷多解!
情况3:完美胜利
所有老大都不为0,每个变量都有唯一值——唯一解!
第十章:实战技巧(士兵手册)
-
浮点数比较用fabs(a)<EPS,别用==
-
就像判断两滴水是否一样——差不多就行!
-
-
选主元要选绝对值最大的
-
找最壮的士兵当老大,别找病秧子!
-
-
消元时从后往前或从前往后都可以
-
就像吃鱼,从头吃还是从尾吃都能吃完
-
-
记得处理-0.00
-
"-0.00"和"0.00"在数学上是双胞胎,长得一样!
-
第十一章:幽默总结
高斯消元就像整理混乱的衣柜:
-
先把最显眼的衣服挂前面(选主元)
-
把每件衣服整理好(归一化)
-
用这件衣服去搭配其他衣服(消元)
-
最后每件衣服都有自己的位置(得到解)
如果发现两件一样的衣服?无穷多种搭配!
如果发现衣服标签写着"不存在"?无解!
记住:你不是在解方程,你是在教这些变量排队!让它们从一群乌合之众变成训练有素的士兵,齐步走:x、y、z...报数!
现在,拿起你的代码武器,去征服那些嚣张的方程组吧!记住,你是数学世界的将军,这些变量都得听你的!
本文来自博客园,作者:#栤,转载请注明原文链接:https://www.cnblogs.com/wth1123/p/19592515

浙公网安备 33010602011771号