LU分解的误差分析与稳定性改进算法
字数 1494 2025-11-05 08:30:59
LU分解的误差分析与稳定性改进算法
题目描述
LU分解是求解线性方程组 \(Ax = b\) 的经典算法,但在实际计算中,由于浮点数舍入误差,直接分解可能导致数值不稳定(尤其当矩阵主元接近零时)。本题要求分析LU分解的误差来源,并介绍通过列主元选取(Partial Pivoting) 改进稳定性的方法。
解题过程
-
LU分解的基本形式
- 目标:将矩阵 \(A\) 分解为下三角矩阵 \(L\) 和上三角矩阵 \(U\),即 \(A = LU\)。
- 直接分解过程(以3×3矩阵为例):
- 第一步:用第一行消去第二行和第三行的第一个元素,得到 \(L_{21} = a_{21}/a_{11}\),\(L_{31} = a_{31}/a_{11}\)。
- 第二步:在剩余子矩阵(右下角2×2部分)重复消元。
- 问题:若 \(a_{11}\) 很小,计算 \(L_{ij}\) 时可能产生大数,放大舍入误差。
-
误差来源分析
- 舍入误差(Round-off Error):浮点数运算(如除法 \(a_{ij}/a_{kk}\))会丢失精度。
- 增长因子(Growth Factor):
- 定义:\(\rho = \frac{\max_{i,j,k} |a_{ij}^{(k)}|}{\max_{i,j} |a_{ij}|}\),其中 \(a_{ij}^{(k)}\) 是第 \(k\) 步消元后的矩阵元素。
- 若 \(\rho\) 很大,说明中间计算值远大于原始值,误差可能失控。
- 示例:若 \(A = \begin{bmatrix} 10^{-10} & 1 \\ 1 & 1 \end{bmatrix}\),直接分解需计算 \(L_{21} = 1/10^{-10} = 10^{10}\),导致数值不稳定。
-
稳定性改进:列主元选取(Partial Pivoting)
- 核心思想:在每一步消元前,选择当前列中绝对值最大的元素作为主元,交换行以避免小主元。
- 步骤:
- 第 \(k\) 步时,找到第 \(k\) 列中行索引 \(p \geq k\) 使 \(|a_{pk}| = \max_{i \geq k} |a_{ik}|\)。
- 交换第 \(k\) 行与第 \(p\) 行。
- 记录行交换信息到置换矩阵 \(P\),此时分解形式为 \(PA = LU\)。
- 优势:确保每一步的乘子 \(|L_{ij}| \leq 1\),控制增长因子 \(\rho \leq 2^{n-1}\)。
-
数值示例
- 设 \(A = \begin{bmatrix} 0.001 & 2 \\ 1 & 1 \end{bmatrix}\),直接LU分解:
- \(L_{21} = 1/0.001 = 1000\),
- \(U_{22} = 1 - 1000 \times 2 = -1999\)(精度损失)。
- 列主元选取:
- 交换两行得 \(PA = \begin{bmatrix} 1 & 1 \\ 0.001 & 2 \end{bmatrix}\),
- \(L_{21} = 0.001/1 = 0.001\),
- \(U_{22} = 2 - 0.001 \times 1 = 1.999\),结果更稳定。
- 设 \(A = \begin{bmatrix} 0.001 & 2 \\ 1 & 1 \end{bmatrix}\),直接LU分解:
-
算法总结
- 列主元LU分解的复杂度仍为 \(O(n^3)\),但显著提升数值稳定性。
- 实际应用(如MATLAB的
lu(A))默认使用列主元策略。