You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求提供左向高斯消元法示例:对比右向高斯消元法

左向高斯消元法(3×3示例 + 与右向的对比)

没问题,我来给你拆解左向高斯消元法,对比你熟悉的右向版本一步步讲,保证你能看明白~

首先明确核心差异:你熟悉的右向高斯消元是用当前主元消去右侧下方的元素,操作方向是向右向下;而左向高斯消元是按列依次处理,每一步计算依赖左侧已经完成的结果,相当于从左到右逐步构建LU分解的下三角矩阵(L)和上三角矩阵(U),不需要提前修改整个矩阵的下方区域。

3×3左向高斯消元实战示例

我们用一个具体的3×3矩阵来演示,目标是将矩阵分解为 ( A = L \times U )(L是对角线为1的下三角矩阵,U是上三角矩阵):

原始矩阵A

A = [
    [4, 2, 1],
    [2, 5, 3],
    [1, 3, 6]
]

第一步:处理第1列(j=1)

这是最左侧的列,没有左侧已处理数据,直接计算:

  • 上三角矩阵U的第1行第1列元素:U[1][1] = A[1][1] = 4
  • 下三角矩阵L的第1列(第2、3行):用当前行的第1列元素除以U的主元
    • L[2][1] = A[2][1] / U[1][1] = 2/4 = 0.5
    • L[3][1] = A[3][1] / U[1][1] = 1/4 = 0.25

此时L和U的初步状态:

L = [
    [1, 0, 0],
    [0.5, 1, 0],
    [0.25, 0, 1]
]
U = [
    [4, 2, 1],
    [0, ?, ?],
    [0, ?, ?]
]

第二步:处理第2列(j=2)

这一步需要减去左侧第1列的贡献,再计算当前列的L和U元素:

  • 计算U的第2行第2列:U[2][2] = A[2][2] - L[2][1] * U[1][2]
    代入数值:5 - 0.5*2 = 5 - 1 = 4
  • 计算L的第3行第2列:L[3][2] = (A[3][2] - L[3][1] * U[1][2]) / U[2][2]
    代入数值:(3 - 0.25*2)/4 = (3 - 0.5)/4 = 2.5/4 = 0.625
  • 同时计算U的第2行第3列(后续会用到):U[2][3] = A[2][3] - L[2][1] * U[1][3]
    代入数值:3 - 0.5*1 = 2.5

此时L和U的更新状态:

L = [
    [1, 0, 0],
    [0.5, 1, 0],
    [0.25, 0.625, 1]
]
U = [
    [4, 2, 1],
    [0, 4, 2.5],
    [0, 0, ?]
]

第三步:处理第3列(j=3)

这一步需要减去前两列的贡献,计算U的最后一个元素:

  • 计算U的第3行第3列:U[3][3] = A[3][3] - L[3][1]*U[1][3] - L[3][2]*U[2][3]
    代入数值:6 - 0.25*1 - 0.625*2.5 = 6 - 0.25 - 1.5625 = 4.1875

最终的L和U矩阵

L = [
    [1,    0,      0     ],
    [0.5,  1,      0     ],
    [0.25, 0.625,  1     ]
]
U = [
    [4,    2,      1     ],
    [0,    4,      2.5   ],
    [0,    0,      4.1875]
]

你可以验证一下 ( L \times U ) 的结果,完全等于原始矩阵A,和右向消元得到的LU分解结果是一致的!

左向 vs 右向的核心区别

  • 右向消元:先处理主元行,再用主元行消去下方所有行的当前主元列元素,操作时会修改主元右侧和下方的整个区域,适合一次性处理完整矩阵的场景。
  • 左向消元:按列从左到右计算,每一步只依赖左侧已处理的L和U数据,不需要提前修改未处理的区域,更适合内存有限的场景(比如处理超大矩阵时,只需要加载左侧已处理的小块数据)。

内容的提问来源于stack exchange,提问作者Nawal

火山引擎 最新活动