高斯消元 笔记

高斯消元

高斯消元:解线性方程组

有 n n n 个未知数: x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn

a 1 1 x 1 1 + a 1 2 x 1 2 + . . . + a 1 n x 1 n = b 1 a_{1_1}x_{1_1}+a_{1_2}x_{1_2}+...+a_{1_n}x_{1_n}=b_1 a11x11+a12x12+...+a1nx1n=b1

a 2 1 x 2 1 + a 2 2 x 2 2 + . . . + a 2 n x 2 n = b 2 a_{2_1}x_{2_1}+a_{2_2}x_{2_2}+...+a_{2_n}x_{2_n}=b_2 a21x21+a22x22+...+a2nx2n=b2

. . . . . . ...... ......

次数为 1 1 1

e . g . e.g. e.g. 斐波那契数列 : f i = f i − 1 + f i − 2 f_i=f_{i-1}+f_{i-2} fi=fi−1+fi−2

系数矩阵

[ a 1 1 a 1 2 a 1 3 . . . a 1 n a 2 1 a 2 2 a 2 3 . . . a 2 n a 3 1 a 3 2 a 3 3 . . . a 3 n . . . . . . . . . . . . . . . a n 1 a n 2 a n 3 . . . a n n ] \left[ \begin{matrix} a_{1_1} & a_{1_2} & a_{1_3} & ... & a_{1_n} \\ a_{2_1} & a_{2_2} & a_{2_3} & ... & a_{2_n} \\ a_{3_1} & a_{3_2} & a_{3_3} & ... & a_{3_n} \\ ... & ... & ... & ... & ... \\ a_{n_1} & a_{n_2} & a_{n_3} & ... & a_{n_n} \end{matrix} \right] a11a21a31...an1a12a22a32...an2a13a23a33...an3...............a1na2na3n...ann

增广矩阵

[ a 1 1 a 1 2 a 1 3 . . . a 1 n b 1 a 2 1 a 2 2 a 2 3 . . . a 2 n b 2 a 3 1 a 3 2 a 3 3 . . . a 3 n b 3 . . . . . . . . . . . . . . . . . . a n 1 a n 2 a n 3 . . . a n n b n ] \left[ \begin{matrix} a_{1_1} & a_{1_2} & a_{1_3} & ... & a_{1_n} & b_1\\ a_{2_1} & a_{2_2} & a_{2_3} & ... & a_{2_n} & b_2\\ a_{3_1} & a_{3_2} & a_{3_3} & ... & a_{3_n} & b_3\\ ... & ... & ... & ... & ... & ... \\ a_{n_1} & a_{n_2} & a_{n_3} & ... & a_{n_n} & b_n \end{matrix} \right] a11a21a31...an1a12a22a32...an2a13a23a33...an3...............a1na2na3n...annb1b2b3...bn

初等行变换:

1.交换两行

2.把某一行 × k ( k ≠ 0 ) \times~k~(k ≠ 0) × k (k=0)

3.把某一行的 k k k 倍加到另一行上 ( k ∈ R ) (k\in \R) (k∈R)

线性方程组的解的情况

如果一个线性方程组有至少两个解,那么它一定有无穷多个解

设两个解:

{ x 1 , x 2 , x 3 , . . . , x n } \{ x_1,x_2,x_3,...,x_n \} {x1,x2,x3,...,xn}

{ x 1 ′ , x 2 ′ , x 3 ′ , . . . , x n ′ } \{ x_1',x_2',x_3',...,x_n' \} {x1′,x2′,x3′,...,xn′}

则: { x 1 − x 1 ′ , x 2 − x 2 ′ , x 3 − x 3 ′ , . . . , x n − x n ′ } \{ x_1-x_1',x_2-x_2',x_3-x_3',...,x_n-x_n' \} {x1−x1′,x2−x2′,x3−x3′,...,xn−xn′} 也成立

所有情况: 0 0 0 个解 , 1 1 1 个解 ,无穷多个解

阶梯型矩阵

每一行第一个不是 0 0 0 的数在上一行第一个不是 0 0 0 的数的严格右侧

e . g . e.g. e.g.

[ 2 5 3 4 0 0 1 1 0 1 0 0 0 2 0 0 0 0 0 3 ] \left[ \begin{matrix} 2 & 5 & 3 & 4 & 0 \\ 0 & 1 & 1 & 0 & 1 \\ 0 & 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 & 3 \end{matrix} \right] 20005100310040200103

对于任意一个矩阵,我们在使用初等行变换的基础上,一列一列地将矩阵转换成阶梯型矩阵

如果 a 1 , 1 a_{1,1} a1,1 不是 0 0 0,让 r 2 + k ⋅ r 1 ( k ∈ R ) r_2~+~k\cdot r_1(k\in \R) r2 + k⋅r1(k∈R),让其他行第一列为 0 0 0

同理,向下每一行如此处理

若 a 1 , 1 a_{1,1} a1,1 是 0 0 0,向下寻找第一个第一列不是 0 0 0 的第一行与矩阵第一行交换使其成为新的第一行进行上述操作

若这一列所有行均为 0 0 0,那么将这一列忽略掉

第一行处理完之后将剩下的部分 ( ( n − 1 ) 2 (n-1)^2 (n−1)2 的矩阵)当成新的矩阵继续如此操作

方程有解

阶梯型矩阵中最后一个含 0 0 0 的直角不在最后一列,方程有解

e . g . e.g. e.g.
[ 2 0 5 2 0 1 4 3 0 0 2 1 ] \left[ \begin{matrix} 2 & 0 & 5 & 2 \\ 0 & 1 & 4 & 3 \\ 0 & 0 & 2 & 1 \end{matrix} \right] 200010542231

方程无解

反之,无解:

[ 2 0 5 2 0 2 1 0 0 0 5 3 0 0 0 1 ] \left[ \begin{matrix} 2 & 0 & 5 & 2 \\ 0 & 2 & 1 & 0 \\ 0 & 0 & 5 & 3 \\ 0 & 0 & 0 & 1 \end{matrix} \right] 2000020051502031

方程无穷多解

某一行含 0 0 0 直角未连续出现,成为断层:

[ 2 0 5 2 0 2 1 0 0 0 0 3 0 0 0 1 ] \left[ \begin{matrix} 2 & 0 & 5 & 2 \\ 0 & 2 & 1 & 0 \\ 0 & 0 & 0 & 3 \\ 0 & 0 & 0 & 1 \end{matrix} \right] 2000020051002031

简化阶梯型矩阵

满足下列三个条件的矩阵称为简化阶梯型矩阵:

1.它是一个阶梯形矩阵

2.非零行首元素均为 1 1 1

3.首元素所在列其他元素均为 0 0 0

将矩阵转换为简化阶梯型矩阵

e . g . e.g. e.g.

[ 2 1 1 2 1 0 2 1 3 1 1 5 ] \left[ \begin{matrix} 2 & 1 & 1 & 2 \\ 1 & 0 & 2 & 1 \\ 3 & 1 & 1 & 5 \end{matrix} \right] 213101121215

[ 2 1 1 2 0 − 1 2 3 2 0 0 − 1 2 − 1 2 2 ] \left[ \begin{matrix} 2 & 1 & 1 & 2 \\ 0 & -\frac{1}{2} & \frac{3}{2} & 0 \\ 0 & -\frac{1}{2} & -\frac{1}{2} & 2 \end{matrix} \right] 2001−21−21123−21202

[ 2 1 1 2 0 − 1 2 3 2 0 0 0 − 2 2 ] \left[ \begin{matrix} 2 & 1 & 1 & 2 \\ 0 & -\frac{1}{2} & \frac{3}{2} & 0 \\ 0 & 0 & -2 & 2 \end{matrix} \right] 2001−210123−2202

(已成为阶梯型矩阵)

[ 1 1 2 1 2 1 0 1 − 6 0 0 0 1 − 1 ] \left[ \begin{matrix} 1 & \frac{1}{2} & \frac{1}{2} & 1 \\ 0 & 1 & -6 & 0 \\ 0 & 0 & 1 & -1 \end{matrix} \right] 100211021−6110−1

[ 1 0 7 2 1 0 1 − 6 0 0 0 1 − 1 ] \left[ \begin{matrix} 1 & 0 & \frac{7}{2} & 1 \\ 0 & 1 & -6 & 0 \\ 0 & 0 & 1 & -1 \end{matrix} \right] 10001027−6110−1

[ 1 0 0 9 2 0 1 0 − 6 0 0 1 − 1 ] \left[ \begin{matrix} 1 & 0 & 0 & \frac{9}{2} \\ 0 & 1 & 0 & -6 \\ 0 & 0 & 1 & -1 \end{matrix} \right] 10001000129−6−1

基础解系

三元一次方程在立体坐标系中,若三个未知数均有一个解,则在空间内呈点,若两个未知数有一个解,则在空间内呈线,若只有一个未知数有一个解,则在空间内呈平面

代码实现

P2455 [SDOI2006] 线性方程组

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,p=1;
double a[105][105],eps=1e-6; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++){
			cin>>a[i][j];
		}
	}
	for(int z=1;z<=n;z++){
		int flag=0;
		for(int i=p;i<=n;i++){
			if(fabs(a[i][z])>eps){
				flag=i;
				break;
			}
		}
		if(flag==0){
			continue;
		}
		for(int i=1;i<=n+1;i++){
			swap(a[flag][i],a[p][i]);
		}
		for(int i=n+1;i>=z;i--){
			a[p][i]/=a[p][z];
		}
		for(int i=1;i<=n;i++){
			if(i!=p){
					double x=a[i][z];
					for(int j=1;j<=n+1;j++){
						a[i][j]-=a[p][j]*x;
					}
			} 
		} 
		p++;
	}
	if(p<=n){
		for(int i=p;i<=n;i++){
			if(fabs(a[i][n+1])>eps){
				cout<<-1<<endl;
				return 0;
			}
		}
		cout<<0<<endl;
	}
	else{
		for(int i=1;i<=n;i++){
			printf("x%d=%.2lf\n",i,a[i][n+1]);
		}
	}
	return 0;
}
相关推荐
刷帅耍帅2 小时前
设计模式-单例模式
笔记
零星_AagT2 小时前
红日靶机(二)笔记
windows·笔记·域渗透·vulnstack
@qike2 小时前
【C++】——类和对象(上)
java·开发语言·jvm·数据结构·c++·笔记·算法
楠了个难3 小时前
SPI通信——FPGA学习笔记14
笔记·学习·fpga开发
zhangrelay3 小时前
谈及医疗和教育真实需求是什么
笔记·学习·持续学习
结衣结衣.3 小时前
程序地址空间
linux·c语言·笔记·学习·操作系统
逻辑与&&4 小时前
[Docker学习笔记]Docker的原理&&Docker常见命令
linux·运维·笔记·学习·docker
夜流冰4 小时前
工程师 - 如何配置DNS服务器
笔记
微刻时光4 小时前
Redis中BigKey与MoreKey优化笔记
数据库·经验分享·redis·笔记