有关矩阵的一些问题

混江龙づ霸主 提交于 2019-12-01 01:15:26

首先谈到矩阵,那么就会想到线性代数,但我太蒟蒻了,所以并不想谈那么深,所以就只说说其中一部分;

首先说初等行变换

  1.用一个非0的数乘某一行

  2.把其中一行的若干倍加到另一行上;

  3.交换两行的位置;

当然,初等列变换的定义与初等行变换的定义类似,这里便不多说了;

 

接着说高斯消元:

  一个矩阵通过初等变换后所能得到的矩阵叫做增广矩阵。

  我们把阶梯型增广矩阵变换为简化形阶梯矩阵的过程就是高斯消元;

  基本思想:对于一个未知量xi,找到一个xi的系数非0,但x1~xi-1的系数都是零的方程,然后用初等行变换把其他方程的xi的系数全部消成0;

  在高斯消元完成后,若存在系数都是0,但常数不是0的情况,方程无解;

  🐖元(主元):系数不全为0的行的个数就是主元的个数;

  自由元:系数全为0,常数也是0的个数就是自由元的个数;

  通常情况下:一道题并不会直接给出n个n元一次方程组。如果给了n+1个二元方程组,那么我们可以通过相邻两个方程做差,把它变成n个n元一次方程组,然后进行高斯消元求解;

  

#include <bits/stdc++.h>
#define eps 1e-8
using namespace std;
double a[101][102];
int n;
bool GUASS()
{
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			if(fabs(a[j][i])>eps){
				for(int k=1;k<=n;k++){
					swap(a[i][k],a[j][k]);
				}
				swap(a[i][n+1],a[j][n+1]);
				break;
			}			
		}
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			double tmp=a[j][i]/a[i][i];
			for(int k=i;k<=n;k++){
				a[j][k]-=a[i][k]*tmp;
			}
			a[j][n+1]-=a[i][n+1]*tmp;
		}
	}
	for(int i=1;i<=n;i++){
		bool lala=0;
		for(int j=1;j<=n;j++){
			if(a[i][j]!=0){
				lala=1;
			}
		}
		if(lala==0){
			cout<<"No Solution";
			return 0;
		}
	}
	return 1;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n+1;j++){
			scanf("%lf",&a[i][j]);
		}
	}
	if(GUASS()){
		for(int i=1;i<=n;i++){
			printf("%.2lf\n",a[i][n+1]/a[i][i]);
		}
	}
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!