当前位置:网站首页>数学知识——高斯消元(初等行变换解方程组)代码实现
数学知识——高斯消元(初等行变换解方程组)代码实现
2022-07-06 11:18:00 【吴雨4】
高斯消元的作用:
求解n个未知数、n个方程的方程组
例如如下n个方程、n个未知数:
写成n*(n+1)的矩阵:
枚举每一列
第一步:找到绝对值最大的一行
第二步:将该行换到最上面
第三步:将该行的第一个数变成1
第四步:将下面行的此列变为0
注意的是,换好了的行不需要动!
举一个例子:
求解有三个方程、三个未知数的方程组:
写成矩阵形式:
枚举第一列,找到最大行:
将该行换到最上面,并将该行第一个数变为1:
将下面行的第1列都变成0:
枚举第二列,找到绝对值最大的一行,将该行的第一个数变成1:
将下面行的第1列都变成0:
遍历第三列(由于第一行和第二行都已经改变好了,不需要动了),这里直接把第三行的第一个数变为1就行了:
最后化简为:
由此可以依次算出:
x3=3;
x2=-2;
x1=3;
例题链接: 883. 高斯消元解线性方程组 - AcWing题库
代码(详细注释):
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
const int N=110;
const double eps=1e-8;
int n;
double a[N][N];
int gauss()// 高斯消元,答案存于a[i][n]中,0 <= i < n
{
int c,r;//c代表列,r代表行
for(c=0,r=0;c<n;c++)//枚举每一列
{
int t=r;//存绝对值最大的行
for(int i=r;i<n;i++)//找到绝对值最大的行
if(fabs(a[i][c])>fabs(a[t][c])) t=i;
if(fabs(a[t][c])<eps)//最大值为0
continue;
for(int i=c;i<=n;i++) swap(a[t][i],a[r][i]);// 将绝对值最大的行换到最顶端
for(int i=n;i>=c;i--) a[r][i]/=a[r][c];//将当前行的首位变成1
for(int i=r+1;i<n;i++)// 用当前行将下面所有的列消成0
if(fabs(a[i][c])>eps)
for(int j=n;j>=c;j--)
a[i][j]=a[i][j]-a[r][j]*a[i][c];
r++;
}
if(r<n)
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps) return 2;//无解
return 1;//多解
}
for(int i=n-1;i>=0;i--)
for(int j=i+1;j<n;j++)
a[i][n]=a[i][n]-a[i][j]*a[j][n];
return 0;
}
int main()
{
IOS;
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==2) cout<<"No solution"<<endl;//无解
else if(t==1) cout<<"Infinite group solutions"<<endl;//多解
else//唯一解
{
for(int i=0;i<n;i++)
{
if(fabs(a[i][n])<eps) a[i][n]=0;//去掉输出-0.00的情况
printf("%.2lf\n", a[i][n]);
}
}
return 0;
}
边栏推荐
- The dplyr package of R language performs data grouping aggregation statistical transformations and calculates the grouping mean of dataframe data
- Penetration test information collection - site architecture and construction
- Interview assault 63: how to remove duplication in MySQL?
- About static type, dynamic type, ID, instancetype
- How to improve website weight
- ORACLE进阶(四)表连接讲解
- R language ggplot2 visualization: use the ggdotplot function of ggpubr package to visualize dot plot, set the palette parameter, and set the colors of data points and box graphs of dot plots at differ
- 使用map函数、split函数一行键入多个元素
- MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
- 三年Android开发,2022疫情期间八家大厂的Android面试经历和真题整理
猜你喜欢
用于远程医疗的无创、无袖带血压测量【翻译】
倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告
About NPM install error 1
MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
Method of accessing mobile phone storage location permission under non root condition
应用使用Druid连接池经常性断链问题分析
Php+redis realizes the function of canceling orders over time
Summary of performance knowledge points
Nuc11 cheetah Canyon setting U disk startup
随机推荐
Camel case with Hungarian notation
手写一个的在线聊天系统(原理篇1)
Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up
使用map函数、split函数一行键入多个元素
Penetration test information collection - WAF identification
About NPM install error 1
根据PPG估算血压利用频谱谱-时间深度神经网络【翻】
Oracle advanced (IV) table connection explanation
Pytorch common loss function
安装及管理程序
AcWing 3537.树查找 完全二叉树
Noninvasive and cuff free blood pressure measurement for telemedicine [translation]
SQL injection Foundation
Analysis of frequent chain breaks in applications using Druid connection pools
Example of implementing web server with stm32+enc28j60+uip protocol stack
The second day of rhcsa study
Characteristic colleges and universities, jointly build Netease Industrial College
提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期
基于蝴蝶种类识别
ROS custom message publishing subscription example