您的位置:首页 > 其它

高斯消元 学习笔记

2018-03-31 15:00 274 查看

高斯消元简介

高斯消元法,又叫高斯消去法,是用来求解线性方程组的算法,还可以用来求解逆矩阵,但一般很少用到,求解线性方程组的时间复杂度为O(n3)O(n3)

什么是线性方程组?

形如:

⎧⎩⎨x−2y+3z=64x−5y+6z=127x−8y+10z=21{x−2y+3z=64x−5y+6z=127x−8y+10z=21

就是这样,各个方程关于未知量均为一次的方程组。

算法详解

思路

想一想我们以前解这种类型的方程组,都是要加减消元,求出其中一个未知数的值,然后再代回原式,求出其余未知数的解。高斯消元其实就是一个加减消元+回代的过程

我们首先定义一个矩阵来表示这一个方程组

⎡⎣⎢147−2−5−8361061221⎤⎦⎥[1−2364−56127−81021]

矩阵前n列代表$n个方程中未知数的系数,最后一列代表,这一行方程的结果.我们用第二式子减去第一个式子乘以4的得到式子就只含有两个未知数,然后再用第三个式子减去第一个式子乘以7的值,又得到了一个只含有两个未知数的方程

我们就得到了如下的方程和矩阵

⎧⎩⎨x−2y+3z=63y−6z=−126y−11z=−21{x−2y+3z=63y−6z=−126y−11z=−21

⎡⎣⎢100−2363−6−116−12−21⎤⎦⎥[1−23603−6−1206−11−21]

然后对方程2进行除以3得到y−2z=−4y−2z=−4 然后把得到的新式子带入第一个式子和第三个式子,我们

就得到了新的式子

⎧⎩⎨x−z=−2y−2z=−4z=3{x−z=−2y−2z=−4z=3

⎡⎣⎢100010−1−21−2−43⎤⎦⎥[10−1−201−2−40013]

然后们把第三个式子带入就可以求出其余未知数的值

⎧⎩⎨x=1y=2z=3{x=1y=2z=3

代码

#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=cax+by=c转化为x+bay=cax+bay=ca



代码提交地址高斯消元
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: