LUP分解求线性方程组

L、U、P是三个矩阵,满足PA = LU。其中L矩阵是一个单位下三角矩阵,U是一个上三角矩阵,P是一个置换矩阵。

我们要求解的是A x = b

Ax=bPAx=PbLUx=Pb(Ux=yLy=Pb

正向替换

正向替换的目标是通过Ly = Pb来求y

我们可以使用一个π[1n]来替换P。 对i = 1, 2, …, n, 元素π[i]表示Pi,π[i]=1(第i行第π[i]列)。由于L是单位下三角矩阵,所以可以将式子写成

y1=bπ[1]y2l21+y2=bπ[2]y3l31+y3l32+y3=bπ[3]y4l41+y4l42+y4l43+y4=bπ[4]...

可以求出 $y1 = b{\pi [1]}y_1y_2$,然后依次代入可以求出所有的y

然后可以求出$y1, y_2…y_i = b{\pi [i]} - \sum{j=1}^{i-1} l{ij}y_j$

反向替换

反向替换目标是通过 Ux = y求x

与之对应,过程不再细说。结果是$xi = ( y_i - \sum{j=i+1}^{n} u{ij}x_j ) / u{ii}$

LU分解

我们计算出 A = LU,则称这两个矩阵是A的一个LU分解

[a11a12...a1na21a22...a2nan1an2...ann]=[a11ωTvA]=[10v/a11En1][a11ωT0AvωT/a11]=[10v/a11L][a11ωT0U]

其中v是n-1的列向量, ωT是n-1的行向量.

最后一步是因为AvωT/a11也可以进行分解,并且分解的结果是LU

inform7
for(int i=0; i<n; i++)
{
u[i][i] = a[i][i];
for(int k=i+1; k<n; k++)
{
l[i][k] = a[i][k] / u[i][i];
u[k][i] = a[k][i];
for(int k=i+1; k<n; k++)
{
for(int j=k+1; j<n; j++)
{
a[i][j] = a[i][j] - l[i][k] * u[k][j];
}
}
}
}

他有一个限制条件u[i][i]不能是0,否则会出现除0错误

LUP分解

为了保证a[i][i] != 0, 我们可以使用该列中最大元素a[k][1]替换a[1][1],为了使方程组还成立,我们可以将第1行和第k行互换,等价于用一个置换矩阵Q乘在A的左边

QA=[10v/ak1En1][ak1ωT0AvωT/ak1]

和上面类似,就是$a{11}a{k1}$

矩阵求逆

矩阵求逆也可以使用LUP分解 我们可以令 AX = En 其中 En是n阶单位矩阵.X是n个列向量的和

我们可以把它看成n个AXi=Ei来进行求解,然后最后将Xi合并即可