加载中...

高斯消元

用O(\(n^3\))时间复杂度, 求解含有n个方程的n元线性方程组

\[\begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1\\[1ex] a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2\\[1ex] \quad\quad\quad\quad\quad\quad\quad \vdots \\[1ex] a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = b_n\\[1ex] \end{cases} \]

枚举每一列 c

① 找到绝对值最大的一行

② 将该行换到最上面

③ 将该行第1个数变成1

④ 将下面所有行的第c列消成0


//高斯消元解线性方程组模板

//a[N][N]是增广矩阵
int gauss()
{
    int c,r;
    for(c=0,r=0,c<n;c++)
    {
        int t=r;
        for(int i=r;i<n;i++)	//找到绝对值最大的行
            if(fabs(a[i][c])>fabs(a[t][c]))
                t=i;
        if(fabs(a[t][c])<eps)continue;
        
        for(int i=c;i<=n;i++)swap(a[t][i],a[r][i]);
        //将绝对值最大的行换到最顶端
        for(int i=n;i>=c;i--)a[r][i]/=a[r][c];
        //将当前行的首位变成1
        for(int i=r+1;i<=n;i++)	//用当前行将下面所有的列消成0
            if(fabs(a[i][c])>eps)
                for(int j=n;j>=c;j--)
                    a[i][j]-=a[r][j]*a[i][c];
        
        r++;
    }
    if(r<n)
    {
        for(int i=r;i<n;i++)
            if(fabs(a[i][n])>eps)
                return 2;	//无解
        return 1;	//有无穷多解
    }
    
    for(int i=n-1;i>=0;i--)
        for(int j=i+1;j<n;j++)
            a[i][n]-=a[i][j]*a[j][n];
    return 0;	//唯一解
}


posted @ 2023-04-29 02:09  邪童  阅读(10)  评论(0编辑  收藏  举报