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