基础数论算法(⑨) 高斯消元与LU分解


高斯消元

高斯消元是什么?其实虽然名字高大上,换个名字就是加减消元法。
首先,我们有一个线性方程组
a11x1+a12x2+..+a1nxn=b1
a21x1+a22x2+..+a2nxn=b2
……..
an1x1+an2x2+..+annxn=bn
写成一个矩阵:

a11a21...an1a12a22...an2............a1na2n...annb1b2...bn

然后我们第一步就是设法消去 x1 这个元。做法很简单:把从第二行开始的每一行各项乘上 a11ak1 ,然后与第一行相减。
不过有个问题,如果 a11 恰好为0,那么就必须找一行该项不为0的数和它交换。
实现:

//zhx的代码
for(int a=1;a<=n;a++)
{
    if(fabs(m[a][a])<=eps)
    {
        for(int b=a+1;b<=n;b++)
        {
            if(fabs(m[b][a])>eps) swap(m[a],m[b]);
            break;
        }
    }
    for(int b=a+1;b<=n;b++)
    {
        ratio=m[b][a]/m[a][a];
        for(int c=1;c<=n+1;c++)
        {
            m[b][c]-=m[a][c]*ratio;
        }
    }
}
for(int a=n;a>=1;a--)
{
    solution[a]=m[a][n+1];
    for(int b=a+1;b<=n;b++)
    {
        solution/=m[a][a];
    }
}

LU分解

lu分解是个神奇的东西,这里先挖个坑,之后再填绝不是因为作业写不完了什么的
公式:
1,将矩阵分解为A=LU,
ukj=akjk1r=1lkrurj,j=k,k+1,...,n

lik=aikk1r=1lirurkukk,i=k,k+1,...,n

lkk=1
这里的b为L矩阵,c为U矩阵
2,解方程
yk=bkk1r=1lkrurj,k=1,2,...,n

xk=ykk1r=1lirxrukkk=n,n1,...,1

你可能感兴趣的:(数论)