高斯列主消元

时间:2022-04-07 19:12:53
#include<stdio.h>
#define N 10010
double A[N][N];
double X[N];
int n,m;
int GSLX(int m,int n)//列主消元函数
{
    int p;
    int i,j,k;
    for(i=1;i<n;i++)
    {
        double Max=A[i][i];
        p=i;
        for(j=i;j<=m;j++)
        {
            if(A[j][i]>Max)
            {
                Max=A[j][i];
                p=j;
            }
        }//寻找列最大元素;
        if(p!=i)
            for(j=1;j<=n+1;j++)
            {
                double a;
                a=A[i][j];
                A[i][j]=A[p][j];
                A[p][j]=a;
            }//行变换;
        if(A[i][i]==0)
                return 0;
        for(j=i+1;j<=m;j++)
        {
            double d=A[j][i]/A[i][i]*(-1);
            for(k=i;k<=n+1;k++)
                A[j][k]+=A[i][k]*d;
        }//消元;
    }
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n+1;j++)
            printf("%lf ",A[i][j]);
        printf("\n");                                                    
    }//输出增广矩阵;
    return 1;
}
void SOL(int m,int n)//回代函数;
{
    int i,j;
    for(i=m;i>=1;i--)
    {
        X[i]=A[i][n+1];
        for(j=n;j>i;j--)
            X[i]-=X[j]*A[i][j];
        X[i]/=A[i][i];
    }
    for(i=1;i<=m;i++)
        printf("X%d=%lf\n",i,X[i]);
}
int main()
{
    int i,j,flag;
    scanf("%d %d",&m,&n);//m行,n列;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n+1;j++)
            scanf("%lf",&A[i][j]);          
    }//输入增广矩阵;
    flag=GSLX(m,n);//列主消元;
    if(flag==0)
        printf("矩阵主子式为0,解不唯一\n");
    else
    {
        printf("\n");
        SOL(m,n);//回代;
        printf("\n");
    }
    return 0;
}