Loading...

高斯消元学习笔记

高斯消元似乎没有同余类那么难呢

1.高斯消元有什么用?

高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解。

2.是什么?

对于如下一个 \(n\)\(1\) 次方程组:

\(\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\\\vdots\\a_{n,1}x_1+a_{n,2}x_2+\cdots+a_{n,n}x_n=b_n\\\end{cases}\)

我们将它的系数及结果存在一个 \(n\)\(n+1\) 列的矩阵中,叫做增广矩阵,如图:

\(\begin{bmatrix}a_{1,1}&a_{1,2}&\cdots&a_{1,n}&b_1\\a_{2,1}&a_{2,2}&\cdots&a_{2,n}&b_1\\\cdots&\cdots&\cdots&\cdots&\cdots\\a_{n,1}&a_{n,2}&\cdots&a_{n,n}&b_n\end{bmatrix}\)

康不懂 \(QWQ\) ,让我们来举个栗子:

\(\begin{cases}2x-y+3z=1\qquad (1) \\4x+2y+5z=4\qquad(2)\\x+2y=7 \qquad(3)\end{cases}\)

它所对应的增广矩阵为:

\(\begin{bmatrix}2&-1&3&1\\4&2&5&4\\1&2&0&7\end{bmatrix}\)

接下来,我们进行高斯消元:

  1. \((2)-(1)\times2 , (3)-(1)\times \frac{1}{2}\) ,得:

\(\begin{cases}2x-y+3z=1\qquad (1) \\4y-1z=2\qquad(2)\\2.5y-1.5z=6.5 \qquad(3)\end{cases}\)

对应的,增广矩阵变为:

\(\begin{bmatrix}2&-1&3&1\\0&4&-1&2\\0&2.5&-1.5&6.5\end{bmatrix}\)

  1. \((3)-(2)\times0.625\) ,得:

\(\begin{cases}2x-y+3z=1\qquad (1) \\4y-1z=2\qquad(2)\\-0.875z=5.25 \qquad(3)\end{cases}\)

一样,增广矩阵变为:

\(\begin{bmatrix}2&-1&3&1\\0&4&-1&2\\0&0&-0.875&5.25\end{bmatrix}\)

现在,就可以回代方程:

\(z=2.25\div(-0.875)=-6\)

\(y=(3-(-1)\times z)\div 4=-1\)

\(x=(1-3\times z-(-1)\times(-1))\div2=9\)

大概思路就是用上面的方程将下面方程的未知数消掉,到最后一个求值回代。

P3389 【模板】高斯消元法

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-5;
int n;
float zg[102][102];
int gaos(){
 for(int i=1;i<=n;i++){
 	int p=i;
 	for(int j=i+1;j<=n;j++){
 		p=(abs(zg[j][i])>abs(zg[p][i])?j:p);
 	}
 	if(abs(zg[p][i])<eps){
 		return 0;
 	}
 	if(p!=i){
 		for(int j=i;j<=n+1;j++){
 			swap(zg[i][j],zg[p][j]);
 		}
 	}
 	for(int j=i+1;j<=n;j++){
 		float x=zg[j][i]/zg[i][i];
 		for(int k=i;k<=n+1;k++){
 			zg[j][k]=zg[j][k]-zg[i][k]*x;
 		}
 	}
 }
 for(int i=n;i;i--){
 	for(int j=i+1;j<=n;j++){
 		zg[i][n+1]=zg[i][n+1]-zg[j][n+1]*zg[i][j];
 	}
 	zg[i][n+1]=zg[i][n+1]/zg[i][i];
 }
 return 1;
}
int main(){
 cin>>n;
 for(int i=1;i<=n;i++){
 	for(int j=1;j<=n+1;j++){
 		cin>>zg[i][j];
 	}
 }
 if(!gaos()){
 	cout<<"No Solution\n";
 	return 0;
 }
 for(int i=1;i<=n;i++){
 	printf("%.2lf\n",zg[i][n+1]);
 }
 return 0;
}
posted @ 2020-11-01 00:09  CNF_Acceptance  阅读(99)  评论(0)    收藏  举报