尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

洛谷 P3389:[模板] 高斯消元法 ← 高斯-约旦消元法(Gauss-Jordan Elimination)

洛谷 P3389:[模板] 高斯消元法 ← 高斯-约旦消元法(Gauss-Jordan Elimination)
📅 发布时间:2026/7/6 14:25:25

【题目来源】
https://www.luogu.com.cn/problem/P3389

【题目描述】
给定一个线性方程组,对其求解。

【输入格式】
第一行,一个正整数 n。
第二至 n+1 行,每行 n+1 个整数,为 a1,a2,…,an 和 b,代表一组方程。

【输出格式】
共 n 行,每行一个数,第 i 行为 xi(四舍五入保留 2 位小数)。
如果不存在唯一解或无解,在第一行输出 No Solution。

【输入样例】
3
1 3 4 5
1 4 7 3
9 3 2 2​​​​​​​

【输出样例】
-0.97
5.18
-2.39

【数据范围】
1≤n≤100,|ai|≤10^4,|b|≤10^4。
保证数据若有解则所有解均满足 |xi|≤10^3,且 xi±10^(-6) 和 xi 四舍五入后的结果相同(即不会因为较小的精度误差导致四舍五入后的结果不同)。

【算法分析】
● 高斯消元法(Gaussian Elimination)​ 是一种用于求解线性方程组的经典算法,也是线性代数中最基础的工具之一。它通过一系列
初等变换,将增广矩阵化为行阶梯形矩阵或行最简形矩阵,从而求出方程组的解。

● 高斯消元法的本质是系统地消除未知数,将复杂的方程组转化为更容易求解的形式。整个过程分为两个阶段:
(1)
前向消元(Forward Elimination):将矩阵化为上三角矩阵(行阶梯形)。
(2)
回代求解(Back Substitution):从最后一个方程开始,逐个求解未知数。​​​​​​​

● 核心代码解析
(一)选主元

int idx=r; for(int i=r; i<n; i++) { if(fabs(a[i][c])>fabs(a[idx][c])) idx=i; }

从第 r 行开始,往下找第 c 列上绝对值最大的那个元素。
idx 记录绝对值最大的行号。
为什么要找绝对值最大的?—— 减小浮点误差。

(二)判断是否跳过该列?

if(fabs(a[idx][c])<eps) continue;

如果找到的最大值都接近于 0,说明这一列全是 0。
这个未知数在当前剩余的方程中不存在,直接跳过该列(它可能是自由变量)。
continue 跳过后面的代码,进入下一列,但 r 不变(还没找到新的主元)。

(三)交换到当前行

swap(a[r],a[idx]);

把找到的主元行(第 idx 行)换到第 r 行。
swap(a[r], a[idx]) 交换的是整行,包括常数项。

(四)归一化​​​​​​​

double div=a[r][c]; for(int j=c; j<=n; j++) a[r][j]/=div;

div 就是主元的值。
把第 r 行的所有元素(从第 c 列到第 n 列,含常数项)都除以 div。
结果:主元变成了 1,这一行其他元素相应缩放。

(五)消去其他行​​​​​​​

for(int i=0; i<n; i++) { if(i!=r && fabs(a[i][c])>eps) { double val=a[i][c]; for(int j=c; j<=n; j++) { a[i][j]-=val*a[r][j]; } } }

对所有行(不只是下面的行),如果第 c 列不为 0,就消掉它。
val = a[i][c] 是第 i 行第 c 列的当前值。
a[i][j] -= val * a[r][j] 就是用第 r 行(归一化后主元为 1)去消。
消完后,第 i 行的第 c 列变成 0。
注意:这里消的是所有行(包括上面的),这是
高斯-约旦消元法的特点,直接得到对角矩阵,不用回代。

【算法代码】

#include <bits/stdc++.h> using namespace std; const int N=105; const double eps=1e-8; double a[N][N]; int n; int gauss() { int r=0; for(int c=0; c<n; c++) { //1.Select pivot int idx=r; for(int i=r; i<n; i++) { if(fabs(a[i][c])>fabs(a[idx][c])) idx=i; } if(fabs(a[idx][c])<eps) continue; swap(a[r],a[idx]); //2.Normalize the current row, and the pivot becomes 1 double div=a[r][c]; for(int j=c; j<=n; j++) a[r][j]/=div; //3.Eliminate all rows below for(int i=0; i<n; i++) { if(i!=r && fabs(a[i][c])>eps) { double val=a[i][c]; for(int j=c; j<=n; j++) { a[i][j]-=val*a[r][j]; } } } r++; } for(int i=r; i<n; i++) { //No solution if(fabs(a[i][n])>eps) return -1; } if(r<n) return 0; //Infinite solutions return 1; //Unique solution } int main() { cin>>n; for(int i=0; i<n; i++) { for(int j=0; j<=n; j++) { cin>>a[i][j]; } } int t=gauss(); if(t==-1 || t==0) cout<<"No Solution\n"; else { for(int i=0; i<n; i++) { printf("%.2lf\n",a[i][n]); } } return 0; } /* in: 3 1 3 4 5 1 4 7 3 9 3 2 2 out: -0.97 5.18 -2.39 */



【参考文献】
https://www.luogu.com.cn/problem/solution/P3389

相关新闻

  • 一篇焦虑文案,ChatGPT 说还行,271 个 AI 用户却想点踩
  • 最新短视频素材分发系统源码 全开源版本
  • 【2026最新】LLM推理提速核心KV缓存原理详解,小白必收藏!

最新新闻

  • Metabase企业级性能优化终极指南:构建高性能数据分析平台的完整架构
  • UI.Vision RPA:3分钟学会免费自动化,彻底告别重复工作
  • 为什么选择MiroThinker:开源研究智能体的性能突破与交互式扩展架构
  • MLFinLab终极指南:快速掌握金融机器学习完整工具箱
  • 5个智能状态管理策略:让开发工作流自动化升级
  • Remotion多语言视频批量生成实战指南:自动化全球内容创作

日新闻

  • AI智能体安全防护框架AgentGuard:从原理到实战部署指南
  • KMX63与PIC18F26K40硬件组合及低功耗设计实践
  • 基于YOLO13改进的门体检测模型:C3k2模块与PoolingFormer技术解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号