首先谈到矩阵,那么就会想到线性代数,但我太蒟蒻了,所以并不想谈那么深,所以就只说说其中一部分;
首先说初等行变换:
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]);
}
}
}