首页 > 其他分享 >高斯消元

高斯消元

时间:2024-04-19 17:13:21浏览次数:21  
标签:begin end int ++ && cases 高斯消

不会高斯消元 /kk。

高斯消元,就是通过某种操作消元得到答案。

eg:

\[\begin{cases} 3x+5y+z=20\\x-2y+3z=19\\2x-6y+z=6\end{cases} \]

把它变成增广矩阵形式:

\[\begin{bmatrix}3&5&1&&20\\1&-2&3&&19\\2&-6&1&&6\end{bmatrix} \]

怎么把 \(x\) 消掉呢?\(2\) 式是把 \(3\times \normalsize{②}-\normalsize{①}=0x-11y+8z=37\)。

那么 \(3\) 式怎么消呢?用 \(3\times \normalsize{③} - 2\times \normalsize{①}=0x-28y+z=-22\)。

那么现在增广矩阵变成了:

\[\begin{bmatrix}3&5&1&&20\\0&-11&8&&37\\0&-28&1&&-22\end{bmatrix} \]

接下来我们让 \(-11\) 为主元。

经过消元,变成了:

\[\begin{bmatrix}3&5&1&&20\\0&-11&8&&37\\0&0&213&&1036\end{bmatrix} \]

带回:

\[\begin{cases}3x+5y+z=20\\0x-11y+8z=37\\0x+0y+213z=1036\end{cases} \]

那就是:

\[\begin{cases}3x+5y+z=20\\-11y+8z=37\\213z=1036\end{cases} \]

解得:

\[\begin{cases}x=3\\y=1\\z=6\end{cases} \]

好了,我们手动模拟了高斯消元的过程。我们来总结一下:

  • 每次找到主元 \(x_i\)(通常是系数最大的)。

  • 将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行 \(x_i\) 系数化为 \(0\))。

  • 倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)。

代码很简短:

#include <bits/stdc++.h>

using namespace std;

const int N = 110;
const double eps = 1e-6;

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

bool solve() {
	int r = 0;
	for (int i = 0; i < n; i++) {
		int now = r;
		for (int j = r; j < n; j++) {
			if (fabs(a[j][i]) > fabs(a[now][i])) {
				now = j;
			}
		}
		if (fabs(a[now][i]) < eps) {
			continue;
		}
		for (int j = i; j <= n; j++) {
			swap(a[now][j], a[r][j]);
		}
		for (int j = n; j >= i; j--) {
			a[r][j] /= a[r][i];
		}
		for (int j = r + 1; j < n; j++) {
			if (fabs(a[j][i]) > eps) {
				for (int k = n; k >= i; k--) {
					a[j][k] -= a[r][k] * a[j][i];
				}
			}
		}
		r++;
	}
	if (r < n) {
		return 1;
	}
	for (int i = n - 1; i >= 0; i--) {
		for (int j = i + 1; j < n; j++) {
			a[i][n] -= a[j][n] * a[i][j];
		}
	}
	return 0;
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j <= n; j++) {
			cin >> a[i][j];
		}
	}
	bool t = solve();
	if (!t) {
		for (int i = 0; i < n; i++) {
			cout << fixed << setprecision(2) << a[i][n] << endl;
		}
	} else {
		cout << "No Solution";
	}
	return 0;
}

标签:begin,end,int,++,&&,cases,高斯消
From: https://www.cnblogs.com/ydq1101/p/18132635

相关文章

  • [学习笔记] 高斯消元 - 线性代数
    高斯-约旦消元下面给两道板子【模板】高斯消元法最最基础的板子,没啥哆嗦的。下面给出高斯-约旦消元解法。#include<bits/stdc++.h>usingnamespacestd;intn,dt=1;doubleeps=1e-9,m[102][102];intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i) for(intj......
  • 高斯消元
    epsilon=pow(10,-10)g=[]for_inrange(int(input())):g.append([*map(float,input().split())])n,m=len(g),len(g[0])row=0forcolinrange(n):max_row=row#找出剩下行最大列值所在的行foriinrange(row,n):ifabs(g[i][col]......
  • 高斯消元学习笔记
    注:此篇一直在讲高斯-约旦消元法。https://oi-wiki.org/math/numerical/gauss/相信大家都读过上面那个wiki。大家其实都看得挺懵的对吧。今天我就来教一下大家高斯消元。技术指导:milk,周百万,TB\(\LaTeX\)指导:不是你觉得这文章\(\LaTeX\)很好吗?所以没有指导。首先小学知识......
  • 高斯消元 学习笔记
    \[\Large\text{GaussianElimination}\]数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。——百度百科说实话,我不相信这是高斯发明的。感觉像是个小学生都学过的加减消元法。它的时间复杂度与方程个数、未知数个数有关,一般来讲,是\(O......
  • 高斯消元
    大暴力应用:求解线性方程前置知识:矩阵操作对于方程组\[\begin{cases}a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=m_1\\a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n=m_2\\\cdots\\a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n=m_n\\\end{cases}\]我们将他的......
  • 高斯消元
    高斯消元板题[SDOI2006]线性方程组(别问我为什么不是【模板】高斯消元法,这个太**了)思路首先需要引入一个定义增广矩阵。所以一个\(n\)元线性方程组就可以抽象成一个矩阵,\(a\)为系数,\(b\)为方程的常数项:\(\begin{bmatrix}a_{11}&\cdots&a_{1n}&b_{1}\\\vdots&\ddots&\vd......
  • 高斯消元法
    高斯消元高斯消元是线性代数规划中的一个算法,可用来为线性方程组求解,高斯消元法可以用在电脑中来解决数千条等式及未知数。ps:若要解出\(n\)个未知数的话,则需要\(n\)个有意义的方程。例如有\(n\)个方程组,其中一个是\(0\timesx=0\timesy\)你会发现无论\(x\)和\(......
  • P3389 【模板】高斯消元法
    #include<bits/stdc++.h>usingnamespacestd;doublemax(doublea,doubleb){ if(a>=b)returna; if(a<b)returnb;}intn;doublea[1010][1010];doublea1[1010][1010];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++) { ......
  • 一次线性方程组 高斯消元笔记
    高斯消元原理高斯消元用来解如下形式的方程组:\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2}x_2+\cdots+a_{n,n}x_n=b_n\end{cases......
  • 高斯消元
    高斯消元设有n个未知数m个方程的线性方程组\[\begin{cases}a_{11}x_{1}+a_{12}x_{2}+\dots+a_{1n}x{n}=b_{1}\\a_{21}x_{1}+a_{22}x_{2}+\dots+a_{2n}x{n}=b_2\\\dots\dots\\a_{m1}x_1+a_{m2}x_{2}+\dots+a_{mn}x_{n}=b_m\end{cases}\]其中\(a_{ij}\)是第i个方程的第......