高斯消元简介
高斯消元法,又叫高斯消去法,是用来求解线性方程组的算法,还可以用来求解逆矩阵,但一般很少用到,求解线性方程组的时间复杂度为 O(n3) O ( n 3 )
什么是线性方程组?
形如:
就是这样,各个方程关于未知量均为一次的方程组。
算法详解
思路
想一想我们以前解这种类型的方程组,都是要加减消元,求出其中一个未知数的值,然后再代回原式,求出其余未知数的解。高斯消元其实就是一个加减消元+回代的过程
我们首先定义一个矩阵来表示这一个方程组
矩阵前n列代表$n个方程中未知数的系数,最后一列代表,这一行方程的结果.我们用第二式子减去第一个式子乘以4的得到式子就只含有两个未知数,然后再用第三个式子减去第一个式子乘以7的值,又得到了一个只含有两个未知数的方程
我们就得到了如下的方程和矩阵
然后对方程2进行除以3得到 y−2z=−4 y − 2 z = − 4 然后把得到的新式子带入第一个式子和第三个式子,我们
就得到了新的式子
然后们把第三个式子带入就可以求出其余未知数的值
代码
#include<bits/stdc++.h>
#define MAXN 205
using namespace std;
const double eps=1e-8;
int n;
double a[MAXN][MAXN],del;
bool gauss()
{
for(int i=1;i<=n;i++)
{
int k=i;
for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[k][i])) k=j;//寻找当前求解的未知数系数最大的一个方程
if(fabs(del=a[k][i])<eps) return 0;
for(int j=i;j<=n+1;j++) swap(a[i][j],a[k][j]);//把它提到当前这一行
for(int j=i;j<=n+1;j++) a[i][j]/=del;//把当前未知数的系数变为,见下面详解①
for(k=1;k<=n;k++)//回代的过程
if(k!=i)
{
del=a[k][i];
for(int j=i;j<=n+1;j++) a[k][j]-=a[i][j]*del;//由于当前的未知数已经是一了,直接乘以方程中当前未知数的系数就可以
}
}
return 1;
}
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]);
bool flag=gauss();
if(!flag) printf("No solution");
else for(int i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]);
return 0;
}
详解
①:就相当于把
ax+by=c
a
x
+
b
y
=
c
转化为
x+bay=ca
x
+
b
a
y
=
c
a
代码提交地址高斯消元