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

高斯消元法

时间:2024-01-28 13:45:00浏览次数:22  
标签:int 矩阵 times cdots 高斯消 元法 vdots

高斯消元

高斯消元是线性代数规划中的一个算法,可用来为线性方程组求解,高斯消元法可以用在电脑中来解决数千条等式及未知数。

ps:若要解出 \(n\) 个未知数的话,则需要 \(n\) 个有意义的方程。

例如有 \(n\) 个方程组,其中一个是 \(0 \times x = 0 \times y\) 你会发现无论 \(x\) 和 \(y\) 取何值方程都相等,这种方程则无解。

矩阵

高斯消元算法需要用到一个叫矩阵的东西。

有一个 \(A\) 矩阵是系数矩阵,则是记录每一个未知数的系数。

例如:

\[A = \begin{bmatrix} a_{1 1} & a_{1 2} & \cdots & a_{1 n} \\ a_{2 1} & a_{2 2} & \cdots & a_{2 n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m 1} & a_{m 2} & \cdots & a_{m n} \end{bmatrix} \text{.} \]

同时还有一个答案矩阵和一个未知数矩阵。

矩阵乘法

两个大小分别为 \(m \times n\) 和 \(n \times p\) 的矩阵 \(A, B\) 相乘的结果为一个大小为 \(m \times p\) 的矩阵。将结果矩阵记作 \(C\),则

\[c_{i j} = \sum_{k = 1}^{n} a_{i k} b_{k j} \]

特殊地,定义 \(A^0\) 为单位矩阵 \(I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}\)。

ps:单位矩阵乘任何矩阵都等于它本身。

算法

好了说了这么多也终于要开始讲高斯消元了。

在高斯消元的矩阵中,因为有 \(n\) 个未知数所以这个矩阵的系数部分是 \(n \times n\) 的。

特殊的在这里我们把答案矩阵与系数矩阵合并在一起,把答案矩阵放在第 \(n + 1\) 列。

了解完初始矩阵后我们开始消元,简单来说消元的过程就是把原矩阵转化为单位矩阵的过程。

-----------------------------------------------------我是分割线--------------------------------------------------------------

step1

我们先从当前第 \(i\) 行往第 \(n\) 行找 \(a_i\) 最大的一行并把它替换到当前这行。

for(int j=i;j<=n;j++)
{
	if(abs(a[j][i])>maxx)
	{
		maxx=abs(a[j][i]);
		l=j;
	}
} 
for(int k=1;k<=n+1;k++)
{
	swap(a[i][k],a[l][k]);
}
if(a[i][i]==0)//在这里我们需要判断误解的情况,即最大为0
{
	cout<<"No Solution"<<endl;
	return 0;
}

step2

首先我们需要把第 \(i\) 行的第 \(i\) 个的系数变为一,所以我们需要把这一行所有都除以一个 \(a_i\) 。

for(int j=i+1;j<=n+1;++j)
{
	a[i][j]/=a[i][i];
} 

step3

下一步我们需要把第 \(i + 1\) 行到第 \(n\)行的第 \(a_i\) 个系数都变为0。

所以我们需要把第 \(j\) 行减一个第 \(i\) 行乘第 \(i\) 列。

for(int j=i+1;j<=n;++j)
{
  for(int k=i;k<=n+1;++k)
  {
    a[j][k]-=a[i][k]*a1[j][i];
  } 
}

step4

到这里已经快完成了,我们只需要将最后一个答案一次带入求解就行了。

for(int i=n-1;i>=1;i--)
{
	for(int j=i+1;j<=n;j++)
	{
		a[i][n+1]-=a[i][j]*a[j][n+1];
	}
}

code

#include<bits/stdc++.h>
using namespace std;
double max(double a,double b)
{
	if(a>=b) return a;
	if(a<b) return b;
}
int n;
double a[1010][1010];
double a1[1010][1010];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			scanf("%lf",&a[i][j]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		int maxx=-INT_MAX,l;
		for(int j=i;j<=n;j++)
		{
			if(abs(a[j][i])>maxx)
			{
				maxx=abs(a[j][i]);
				l=j;
			}
		} 
		for(int k=1;k<=n+1;k++)
		{
			swap(a[i][k],a[l][k]);
		}
		if(a[i][i]==0)
		{
			cout<<"No Solution"<<endl;
			return 0;
		}
		for(int j=i+1;j<=n+1;++j)
		{
			a[i][j]/=a[i][i];
		} 
		a[i][i]=1;
		for(int j=i+1;j<=n;j++)
		{
			a1[j][i]=a[j][i];
		} 
		for(int j=i+1;j<=n;++j)
		{
            for(int k=i;k<=n+1;++k)
			{
            	a[j][k]-=a[i][k]*a1[j][i];
			} 
        }
	}
	for(int i=n-1;i>=1;i--)
	{
		for(int j=i+1;j<=n;j++)
		{
			a[i][n+1]-=a[i][j]*a[j][n+1];
		}
	}
    for(int i=1;i<=n;++i)
	{
		printf("%.2f\n",a[i][n+1]);
	} 
	return 0;
}

标签:int,矩阵,times,cdots,高斯消,元法,vdots
From: https://www.cnblogs.com/wenzhihao2023/p/17992813

相关文章

  • 【板子】高斯约旦消元法(可判解)
    //lg2455#include<bits/stdc++.h>usingnamespacestd;constdoubleeps=0.000001;constintN=105;doublea[N][N];intn;intnowline=1;//存储当前行voidGaussJordan(){ for(inti=1;i<=n;i++)//枚举列若方程有唯一解则与枚举行列等效 { intmxline=no......
  • 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个方程的第......
  • 高斯消元
    作用解线性方程组,将其系数和常数放在矩阵中,利用加减消元,得到一个倒三角,反着代入计算即可。double型可以选最大的一行交换,减少误差。异或型可以bitset优化,加减变^,乘除变&。稀疏矩阵可以手动代入消元,减少计算量。Link......
  • 2023.11.8 高斯消元记录
    2021ICPC沈阳I题https://link.zhihu.com/?target=https%3A//ac.nowcoder.com/acm/contest/24346/I2020ICPC济南A题https://ac.nowcoder.com/acm/contest/10662/A高斯消元只要构造出增广矩阵,求解就很简单了.对本题来说,矩阵乘开后,新矩阵的列向量,就是B*C的列向量.......
  • 高斯消元
    问题求解线性方程组算法思想高斯消元法的实现主要分为两种,一种是普通的高斯消元,将系数矩阵消为上三角矩阵,再一步步回代求出所有未知数;第二种是高斯-约旦消元法,将系数矩阵消为对角矩阵,不需要回代即可直接解出未知数,这里展示第二种做法。代码实现例题:P3389【模板】高斯消元法......
  • 浅谈高斯消元法
    2023.6.16:发布2023.8.29:修缮,加上自己觉得通俗易懂的理解,更新矩阵求逆。高斯消元高斯消元可以用于线性方程组求解或者行列式计算,求矩阵的逆等等,也算是比较基础的一个思想。消元法定义消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其带入到另一方程中,......
  • 【学习笔记】简单数论-高斯消元与线性空间
    友情提示本博客内部分内容因缺乏样例,可能晦涩难懂,建议参考蓝书或者数论小白都能看懂的线性方程组及其解法。线性方程组线性方程组是由\(M\)个\(N\)元一次方程共同构成的。线性方程组的所有系数可以写成一个\(M\)行\(N\)列的系数矩阵,再加上每个方程等号右侧的常数,可......
  • 高斯消去法python代码
    高斯消去法实现多元线性方程组求解1.流程概述高斯消去法(GaussianElimination)是一种用于求解多元线性方程组的常用方法。它通过将方程组表示为增广矩阵的形式,然后进行一系列的行变换,将增广矩阵转化为上三角矩阵,最后利用回代法求解方程组。以下是高斯消去法的流程:步骤操作......