【模板】高斯消元法

题目背景

Gauss消元

题目描述

给定一个线性方程组,对其求解

输入输出格式

输入格式:

第一行,一个正整数 nnn

第二至 n+1n+1n+1 行,每行 n+1n+1n+1 个整数,为 a1,a2⋯an a_1, a_2 \cdots a_na1,a2anbbb ,代表一组方程。

输出格式:

共n行,每行一个数,第 iii 行为 xix_ixi (保留2位小数)

如果不存在唯一解,在第一行输出"No Solution".

思路:

高斯消元是一种求解线性方程组的形式他将一个完全的矩阵变为一个上三角矩阵,从而得到结果

方法看这里: 

 我不会发ppt,所以给大家一个网址,下载就可

 代码:

#include<iostream>
#include<cstdio>
using namespace std;
#define rii register int i
#define rij register int j
double x[105][105],ans[105];
int n,gp;
void gsxy(int wz)
{
    double ltt=x[wz][wz];
    if(ltt==0)
    {
        gp=1;
        cout<<"No Solution";
        return;
    }
    for(rii=1;i<=n+1;i++)
    {
        x[wz][i]/=ltt;
    }
    for(rii=wz+1;i<=n;i++)
    {
        double kkk=x[i][wz];
        for(rij=1;j<=n+1;j++)
        {
            x[i][j]-=x[wz][j]*kkk;
        }
    }
    if(wz==n)
    {
        ans[n]=x[n][n+1];
    }
    else
    {
        gsxy(wz+1);
    }
}
void hd(int wz)
{
    if(gp==1)
    {
        return ;
    }
    for(rii=wz-1;i>=1;i--)
    {
        double ltt=x[i][wz];
        x[i][wz]=0;
        x[i][n+1]-=ans[wz]*ltt;
    }
    ans[wz-1]=x[wz-1][n+1];
    if(wz==2)
    {
        return;
    }
    else
    {
        hd(wz-1);
    }
}
int main()
{
    int inf=1<<29;
    cin>>n;
    for(rii=1;i<=n;i++)
    {
        ans[i]=-inf;
    }
    for(rii=1;i<=n;i++)
    {
        for(rij=1;j<=n+1;j++)
        {
            cin>>x[i][j];
        }
    }
    gsxy(1);
    hd(n);
    if(gp==1)
    {
        return 0;
    }
    for(rii=1;i<=n;i++)
    {
        printf("%.2lf\n",ans[i]);
    }
}

猜你喜欢

转载自www.cnblogs.com/ztz11/p/9252374.html