高斯消元

高斯消元

P3389 【模板】高斯消元法


#include
using namespace std;
int m,n;
double a[1001][1001];			//数组a记录矩阵相关信息
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n+1;j++)
        {
            scanf("%lf",&a[i][j]);
        }
    }
    int flag=1;			///flag用来判断该方程是否有解
    for(int i=1;i<=n;i++)			///利用矩阵的性质,对矩阵进行化简成上三角形,来对矩阵进行求解
    {
        int pos=i;
        for(int j=i+1;j<=n;j++)
        {
            if(fabs(a[j][i])>fabs(a[pos][i]))      ///fabs来求精度比较高的浮点型数据的绝对值
            {
                pos=j;		///找第i行及以下的矩阵中第i列的元素的绝对值的最大值,pos记录最大值所在的行数
            }
        }
        if(fabs(a[pos][i])<1e-8)			如果找到的最大值小于1e-8,则该方程无解,flag值赋为0
        {
            flag=0;
            break;
        }
        for(int j=1;j<=n+1;j++)
        {
            swap(a[pos][j],a[i][j]);		///交换第i行与第pos行所有元素,使得第i行的元素首非零元素为最大
        }
        for(int j=i+1;j<=n;j++)
        {
            double k=a[j][i]/a[i][i];		///第i行以下的元素全部减为0,k为倍数
            for(int t=i;t<=n+1;t++)		//对第j行的元素进行处理
            {
                a[j][t]-=k*(a[i][t]);
            }
        }
    }
    if(flag==0)
    {
        printf("No Solution\n");
        return 0;
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=i+1;j<=n;j++)
        {
            a[i][n+1]-=a[j][n+1]*a[i][j];			///最后化简成最简形的矩阵,那么a[i][n+1]就是解
        }
        a[i][n+1]/=a[i][i];
    }
    for(int i=1;i<=n;i++)
    {
        printf("%.2lf\n",a[i][n+1]);
    }
    return 0;
}


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