Gauss算法,称为高斯消元算法,用来解决n元一次方程,在解决线性方程问题起着重要作用。

简述

  运用高斯消元的方法,我们可以在O(n3)的时间求出n元线性方程,但是由于时间复杂度的原因,请注意题目数据范围的提示。

  高斯消元三大定理(在小学就学过了吧):

    1.两个方程互换位置,解不变;

    2.一个方程进行加减乘除,解不变;

    3.一个方程乘上数k加上另一个方程,解不变;

  这便是我们解决的基础;

过程:

  这里给出luogu例题链接,这样方便寻找;

  我们这里不用luogu的样例示范(因为不是整数好麻烦),这里给出方程

  2 x + 3 y - z = 21;

  x + 2 y + 2 z = 7;

   3 x + y + 5 z = 8; 

  我们将系数提出,然后就可以得到一个3 * 3的矩阵,之后将每个方程等号右边放到矩阵的最右边,就得到了:

  

  这里每个方程的结果与系数我用黑线隔开了,想必也更清楚;

  有了定理,我们理一下目标:

  我们如果将每一个方程只留下一个未知数的系数,那么最后就可以求解了,如:

  

  当然系数不一定只会是1,但是只要除一下就好,根据这个定义,我们将第 i 个未知数的前系数非零而且其他系数都为零,这个系数在矩阵的位置为 i ,i;

  这样的矩阵称为“简化阶梯矩阵”;

  我们只要将每个矩阵化成简化阶梯矩阵即可;

步骤:

  1.枚举第 i 个未知数(外循坏);

  2.决定在哪一行求解这个未知数:

    这里采用先对每一行 j 第 i 个系数找到最大值,有最大值的这一行定义为第ms行(名字随便起的,没有其他意思),然后将第ms行交换至第 i 行

  3.判断第i行第i个数的值是否为0,这里由于数学期望和精度问题,我们将这个判断改为这个数的值是否小于我们定义的那个精度,如果小于(那就相当于为0了),

    那么无解(因为这个项的系数是所有中最大的,所以其他的也都为0,一定无解);

  4.然后进行消元,就是将其他方程这个项的系数归0,这里有精度问题,但是从期望来讲,是不成问题的;

Code:

  (我才不会说其实我有模拟操作但是太麻烦不想写了。。。)

  不过我很良心,所以我有输出模拟,运行一下我的代码就行了;

  

  1. #include<bits/stdc++.h>
  2. #define maxn 107
  3. #define db double
  4. using namespace std;
  5. int n;
  6. const db cmp=1e-8;
  7. db a[maxn][maxn];
  8.  
  9. //模拟啦 biu~
  10. void biu(int x){
  11. printf("work %d \n",x);
  12. for(int i=1;i<=n;i++){
  13. for(int j=1;j<=n+1;j++)
  14. cout<<a[i][j]<<" ";
  15. cout<<endl<<endl;
  16. }
  17. }
  18.  
  19. int main(){
  20. scanf("%d",&n);
  21. for(int i=1;i<=n;i++)
  22. for(int j=1;j<=n+1;j++)
  23. scanf("%lf",&a[i][j]);
  24. for(int i=1;i<=n;i++){
  25. int ms=i;
  26. for(int j=i;j<=n;j++)
  27. if(fabs(a[j][i])>fabs(a[ms][i]))
  28. ms=j;
  29. if(fabs(a[ms][i])<cmp){
  30. puts("No Solution");
  31. return 0;
  32. }
  33. for(int j=1;j<=n+1;j++)
  34. swap(a[i][j],a[ms][j]);
  35. biu(2);
  36. for(int j=1;j<=n;j++){
  37. if(j==i) continue;
  38. db rate=a[j][i]/a[i][i];
  39. for(int k=i+1;k<=n+1;k++)
  40. a[j][k]-=a[i][k]*rate;
  41. }
  42. biu(4);//良心模拟。。。
  43. }
  44. for(int i=1;i<=n;i++) printf("%.2f\n",a[i][n+1]/a[i][i]);
  45. return 0;
  46. }

例题

  P4035 [JSOI2008]球形空间产生器

题目描述

有一个球形空间产生器能够在 nnn 维空间中产生一个坚硬的球体。现在,你被困在了这个 nnn 维球体中,你只知道球面上 n+1n+1n+1 个点的坐标,你需要以最快的速度确定这个 nnn 维球体的球心坐标,以便于摧毁这个球形空间产生器。

输入格式

第一行是一个整数 nnn (1<=N=10)(1<=N=10)(1<=N=10)。接下来的 n+1n+1n+1 行,每行有 nnn 个实数,表示球面上一点的 nnn 维坐标。每一个实数精确到小数点后 666 位,且其绝对值都不超过 200002000020000。

输出格式

有且只有一行,依次给出球心的 nnn 维坐标( nnn 个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后 333 位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。

  这个只要构造出矩阵即可;

  可惜我不会在博客上用数学公式。。。

  所以就随便写写了;

  设xi为第i维的坐标;

  sum(j=1,n) { (a[ i , j ] - x [ j ]) }=r^2;

  这样的方程共有11个,我们要将r消掉,所以将相邻的两个方程相减,得到11个方程,然后将多项式拆开,合并,移项得到;

  sum(j=1,n){ 2*(a[ i , j ] - a[ i + 1 , j ) * x [ j ] } = sum(j=1,n){ a[ i , j ] - a[ i + 1 , j ] };

  这样就可以将左边的作为方程左边,右边作为结果,列出矩阵,这里还不需要检验,直接上代码。。。

 

  1. #include<bits/stdc++.h>
  2. #define db double
  3. using namespace std;
  4. int n;
  5. db a[17][17],c[17][17];
  6. const db cmp=1e-8;
  7. db calc(db x){return x*x;}
  8.  
  9. int main(){
  10. scanf("%d",&n);
  11. for(int i=1;i<=n+1;i++){
  12. for(int j=1;j<=n;j++){
  13. scanf("%lf",&a[i][j]);
  14. if(i==1) continue;
  15. c[i-1][j]=2*(a[i-1][j]-a[i][j]);
  16. c[i-1][n+1]+=calc(a[i-1][j])-calc(a[i][j]);
  17. }
  18. }
  19. for(int i=1;i<=n;i++){
  20. int ms=i;
  21. for(int j=i+1;j<=n;j++)
  22. if(fabs(c[j][i])>fabs(c[ms][i])) ms=j;
  23. if(ms!=i) for(int j=1;j<=n+1;j++)
  24. swap(c[i][j],c[ms][j]);
  25. for(int j=1;j<=n;j++){
  26. if(i==j) continue;
  27. db rate=c[j][i]/c[i][i];
  28. for(int k=i+1;k<=n+1;k++)
  29. c[j][k]-=c[i][k]*rate;
  30. }
  31. }
  32. for(int i=1;i<=n;i++) printf("%.3f ",c[i][n+1]/c[i][i]);
  33. return 0;
  34.  
  35. }

其实还有一些拓展内容,到时候再补充。。。

高斯消元初步(Gauss算法)的更多相关文章

  1. 高斯消元(Gauss消元)

    众所周知,高斯消元可以用来求n元一次方程组的,主要思想就是把一个n*(n+1)的矩阵的对角线消成1,除了第n+1列(用来存放b的)的其他全部元素消成0,是不是听起来有点不可思议??! NO NO NO ...

  2. 【BZOJ3270】【高斯消元】博物馆

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  3. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...

  4. 高斯消元&&luogu3389

    高斯消元(Gauss) 高斯消元和我们做二元一次方程组差不多 流程: 1.把系数和右边的值就是用二维数组存下来->转化成矩阵 我们的目标是把这个矩阵装换成 上三角的形式 对角线系数全部为1,1下 ...

  5. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  6. HDU2449 Gauss Elimination 高斯消元 高精度 (C++ AC代码)

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU2449.html 题目传送门 - HDU2449 题意 高精度高斯消元. 输入 $n$ 个 $n$ 元方程 ...

  7. Gauss 高斯消元

    高斯消元…… (裸的暴力) 如果你有一个n元的方程组你会怎么办? Ans:直接用初中的解方程组的方法呀! 没错,直接暴力加减消元.那什么是“高斯消元”?说白了,就是普通的加减消元罢了. 本人再考场上打 ...

  8. 算法复习——高斯消元(ssoi)

    题目: 题目描述 Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面.虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了.x+y=3x- ...

  9. 算法竞赛进阶指南0x35高斯消元与线性空间

    高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装 ...

随机推荐

  1. 使用jib-maven-plugin将Spring Boot项目发布为Docker镜像

    目录 介绍 使用 总结 介绍 将spring boot(cloud)项目发布到docker环境作为镜像,一般常用的一个是com.spotify的docker-maven-plugin这个maven插件 ...

  2. JMS监听Oracle AQ

    该文档中,oracle版本为11g,jdk版本1.8,java项目为maven构建的springboot项目,springboot的版本为2.1.6,并使用了定时任务来做AQ监听的重连功能,解决由于外 ...

  3. MongoDB分片集群部署方案

    前言 副本集部署是对数据的冗余和增加读请求的处理能力,却不能提高写请求的处理能力:关键问题是随着数据增加,单机硬件配置会成为性能的瓶颈.而分片集群可以很好的解决这一问题,通过水平扩展来提升性能.分片部 ...

  4. linux下安装nacos

    一.安装 1.下载安装包: https://github.com/alibaba/nacos/releases 2.解压 : tar -xzvf nacos-server-1.2.1.tar.gz 3 ...

  5. 1.5V升压3V集成电路升压芯片

    干电池1.5V升压3V的升压芯片,适用于干电池升压产品输出3V供电 1.5V输入时,输出3V,电流可达500MA. PW5100是一款效率大.10uA低功耗 PW5100输入电压:0.7V-5V PW ...

  6. 1.5V转3V电源芯片,1.5V转3V稳压芯片

    1.5V干电池的供电电压一般是0.9V-1.6V左右,因为供电电压不稳,所以需要1.5V转3V的稳压电源芯片,当0.9V-1.6V输入电压时,输出电压能稳定3V输出,给模块供电,MCU供电,LED灯供 ...

  7. 手动添加Ini4idea,解决pycharm无法打开ini文件

    1. 查看本地pycharm的版本号 help -> about 2. 进入官网:http://plugins.jetbrains.com,选中pycharm及相关版本,搜索ini,切到版本,下 ...

  8. Samba共享工具安装

    Samba 是一种在局域网上共享文件的一种通信协议,它为局域网内的不同计算机之间提供文件的共享服务. (1)下载并安装 Samba 工具. 确定 Ubuntu 已连接到互联网, 执行如下命令下载 Sa ...

  9. (14)-Python3之--虚拟环境virtualenv

    1.安装virtualenv pip install virtualenv 如果是在Linux下需要把virtualenv添加到/usr/bin目录下 # find / -name virtualen ...

  10. IDEA 2019 Unable to get current time from Google's servers 解决

    取消android support即可