高斯消元 学习笔记

高斯消元简介

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

什么是线性方程组?

形如:

x2y+3z=64x5y+6z=127x8y+10z=21 { x − 2 y + 3 z = 6 4 x − 5 y + 6 z = 12 7 x − 8 y + 10 z = 21

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

算法详解

思路

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

147258361061221 [ 1 − 2 3 6 4 − 5 6 12 7 − 8 10 21 ]

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

x2y+3z=63y6z=126y11z=21 { x − 2 y + 3 z = 6 3 y − 6 z = − 12 6 y − 11 z = − 21

100236361161221 [ 1 − 2 3 6 0 3 − 6 − 12 0 6 − 11 − 21 ]

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

100010121243 [ 1 0 − 1 − 2 0 1 − 2 − 4 0 0 1 3 ]

然后们把第三个式子带入就可以求出其余未知数的值
x=1y=2z=3 { x = 1 y = 2 z = 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=c a x + b y = c 转化为 x+bay=ca x + b a y = c a
输出结果

代码提交地址高斯消元

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值