【模板】高斯消元法

传送门

关于高斯消元的具体过程

详见百度经验

模板

#include <cmath>
#include <cstdio>
#include <iostream>
#define N 201

using namespace std;

int n;
double a[N][N];

//消成上三角
inline void Guass()
{
	int i, j, k;
	double div;
	//枚举列
	for(j = 1; j <= n; j++)
	{
		//找出最大的主元行并进行交换
		k = j;
		for(i = j + 1; i <= n; i++)
			if(fabs(a[i][j]) > fabs(a[k][j]))
				k = i;
		if(k != j) swap(a[k], a[j]);
		//如果此时系数已经为0了,则无唯一解
		if(a[j][j] == 0)
		{
			puts("No Solution");
			return;
		}
		//消元
		for(i = j + 1; i <= n; i++)
		{
			div = a[i][j] / a[j][j];
			for(k = j; k <= n + 1; k++)
				a[i][k] -= a[j][k] * div;
		}
	}
	//代入消元
	for(i = n; i >= 1; i--)
	{
		for(j = i + 1; j <= n; j++)
			a[i][n + 1] -= a[i][j] * a[j][n + 1];
		a[i][n + 1] /= a[i][i];
	}
	for(i = 1; i <= n; i++)
		printf("%.2lf\n", a[i][n + 1]);
}

int main()
{
	int i, j;
	scanf("%d", &n);
	for(i = 1; i <= n; i++)
		for(j = 1; j <= n + 1; j++)
			scanf("%lf", &a[i][j]);
	Guass();
	return 0;
}

  

时间: 2024-10-09 18:35:09

【模板】高斯消元法的相关文章

高斯消元法(Gauss Elimination)【超详解&amp;模板】

高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. 所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 1.线性方程组 1)构造增广矩阵,即系数矩阵A增加上常数向量b(A|b) 2)通过以交换行.某行乘以非负常数和两行相加这三种初等变化将原系统转化为更简单的三角形式(triangular form) 注:这里的初等变化可以通过

P3389 【模板】高斯消元法

P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdots a_na1?,a2??an? 和 bb,代表一组方程. 输出格式: 共n行,每行一个数,第 ii行为 x_ixi? (保留2位小数) 如果不存在唯一解,在第一行输出"No Solution". 输入输出样例 输入样例#1: 复制 3 1 3 4 5 1

题解 P3389 【【模板】高斯消元法】

题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减消元法,依次制定x0,并通过加减消元法消去其他方程的x0的系数.对于这样的系数矩阵我们只进行初等变幻保证了其正确性 看代码吧,主要是希望帮助大家可以学到一些重载的方法 #include<iostream> #include<cstdio> #include<algorithm&g

(模板)poj1681 高斯消元法求异或方程组(无解、唯一解、多解)

题目链接:https://vjudge.net/problem/POJ-1681 题意:类似于poj1222,有n×n的01矩阵,翻转一个点会翻转其上下左右包括自己的点,求最少翻转多少点能使得矩阵全0. 思路: 同样的可以枚举第一行的状态,这里不说了. 用高斯消元法来解这道题,每个点的状态表示一个变量,那么有n*n个方程,n*n个变量的方程组,用高斯消元法来解,可能存在无解,唯一解,多解的情况.多解的时候要枚举自由变元的状态. AC代码: /* poj1681 开关问题,高斯消元法解异或方程组

LG3389 【模板】高斯消元法 高斯消元

问题描述 LG3389 题解 高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\) 这样就构造出了这个方程组的矩阵 目标就是把这个矩阵左边\(n \times n\)消为单位矩阵 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch&

Luogu3389 【模板】高斯消元法

题目传送门 算法分析 高斯消元,是求解\(n\)个\(n\)元\(1\)次方程组的算法,一般情况下时间复杂度为\(O(n^3)\). 我们把这\(n\)个方程组看成一个\(n\times (n+1)\)的矩阵.以样例为例: \[ \left( \begin{matrix} {{x}_{1}} & 3\times {{x}_{2}} & 4\times {{x}_{3}} \ {{x}_{1}} & 4\times {{x}_{2}} & 7\times {{x}_{3}}

luogu 3389 【模板】高斯消元法

#include <bits/stdc++.h> #define N 104 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n; double g[N][N]; void Gauss() { int i,j,k,now; for(i=1;i<=n;++i) { now=i; for(j=i+1;j<=n;++j) if(fabs(g[j][i])>

高斯消元法~get√

高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组.所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解. 以上是线性代数课的回顾,下面来说说高斯消元法在编程中的应用. 首先,先介绍程序中高斯消元法的步骤:(我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数

高斯消元模板(kuangbin大神版本)

#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int MOD = 7; const int MAXN = 50; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];//标记是否是不确定的