首页 > 其他分享 >不知道是什么

不知道是什么

时间:2022-11-12 19:13:11浏览次数:41  
标签:增广 int 什么 矩阵 cdots bmatrix 知道 vdots

1. 高斯消元

1. 线性方程

类似于如下的东西

\(\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\a_{2,1}x_{1}+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\\dots\\a_{n,1}x_1+a_{n,2}x_2+\dots+a_{n,n}x_n=b_n\end{cases}\)

2. 系数矩阵

把系数弄出来变成系数矩阵,如下:

\(\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_{n,1} & a_{n,2} & \cdots & a_{n,n} \end{bmatrix}\)

3. 增广矩阵

系数矩阵右侧加一列方程等式右边的常数,如下:

\(\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_2\\ \vdots & \vdots & \ddots & \vdots&|&\vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}&|&b_n \end{bmatrix}\)

4. 行阶梯矩阵

非零行的第一个非零元素的列下标随着行数增加而严格递增,全零元素的行在末尾,如下。

\(\begin{bmatrix} c_{1,1} & c_{1,2} & c_{1,3} & \cdots & c_{1,n}&|&d_1\\ 0 & c_{2,2} & c_{2,3} & \cdots & c_{2,n}&|&d_2\\ 0&0&c_{3,3}&\cdots &c_{3,n} &|& d_3\\ \vdots & \vdots &\vdots& \ddots & \vdots&|&\vdots\\ 0 & 0 & 0&\cdots & c_{n,n}&|&d_n \end{bmatrix}\)

将增广矩阵变换为行阶梯矩阵,就可以倒着代回去得到原方程的解。

可以通过如下的变换来操作。

5. 矩阵的行变换(列变换)

  1. 将矩阵的第 \(i\) 行和第 \(j\) 行元素互换
  2. 将矩阵的第 \(i\) 行元素分别乘以 \(val\)
  3. 将矩阵的第 \(i\) 行元素分别乘以 \(val\) 再加到第 \(j\) 行的对应位置

6. 方程组解的判定:

矩阵的行秩:行阶梯矩阵非零行的数量

  1. 有唯一解:增广矩阵的行秩 \(=\) 未知数的数量
  2. 有无数多解:增广矩阵的行秩 \(\lt\) 未知数的数量
  3. 无解:系数矩阵的行秩 \(\not =\) 增广矩阵的行秩

7. 代码实现

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int n;
double a[MAXN][MAXN];
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;i++)
		for(register int j=1;j<=n+1;j++)
			scanf("%lf",&a[i][j]);
	for(register int i=1;i<=n;i++)
	{
		int maxn=i;
		for(register int j=i+1;j<=n;j++)//把当前未知数的最大系数放到当前行
			if(abs(a[j][i])>abs(a[maxn][i]))maxn=j;
		for(register int j=1;j<=n+1;j++)
			swap(a[i][j],a[maxn][j]);
		if(fabs(a[i][i])<=0.001)
		{
			puts("No Solution");
			return 0;
		}
		for(register int j=1;j<=n;j++)//将每一行除当前行未知数的系数变成linguistic
		{
			if(i==j)continue;
			double rate=a[j][i]/a[i][i];//需要减去多少
			for(register int k=1;k<=n+1;k++)//再将其他的系数也减掉
				a[j][k]-=a[i][k]*rate;
		}
	}
	for(register int i=1;i<=n;i++)
		printf("%.2lf\n",a[i][n+1]/a[i][i]);
	return 0;
}

标签:增广,int,什么,矩阵,cdots,bmatrix,知道,vdots
From: https://www.cnblogs.com/yzh-error502/p/16884428.html

相关文章