前言
思路
我们将原有方程换成增广矩阵
然后使用行变换 对方程进行修改 (这里代码枚举每行然后对每行的每列进行操作)
最后如果
如果左边的系数为0的话,那么说明存在无穷解
否则因为行数少于方程数那么就不存在解
啊,总之原理都懂,毕竟学过线性代数,但是操起来就不懂了
Mycode
typedef priority_queue<int,vector<int>,greater<int>> Pri_m;
typedef pair<int,int> pii;
typedef vector<int> VI;
map<int,int> mp;
const int N = 110;
const double eps = 1e-6;
double a[N][N];
int n;
int gauss(){
int c,r;
//c代表列,r代表行
for(c = 0 , r= 0 ; c<n; c++){
int t = r;
//先到当前这一列,绝对值最大的一个数
//所在的行号
for(int i = r ;i<n;i++){
if(fabs(a[i][c]) > fabs(a[t][c]))
t = i ;
}
if(fabs(a[t][c]) < eps) continue;
//如果当前列的最大数是0 那么没必要再算了 因为他的约束方程可能是上面几个
for(int i = c;i<n+1;i++){
swap(a[t][i],a[r][i]);
//把当前这一行,换到最上面
//换到第r行去
}
for(int i=n;i>=c;i -- )
a[r][i]/=a[r][c];
//把这一行 第一个数的系数变为1
for(int i = r+1;i<n;i++) //把当前列下所有数都变为1
if(fabs(a[i][c]) > eps)
for(int j = n;j>=c;j--)
a[i][j] -= a[r][j] * a[i][c];
r++;
//当前这一行的工作做完,换到下一行
}
if(r<n)//剩下的方程个数是小于n的 说明不是唯一解
{
for(int i=r;i<n;i++)
if(fabs(a[i][n]) > eps)
return 2;//说明 无解
return 1;//否则,0 = 0 那么也就是无穷解因为有多个C
}
//唯一解
//从下往上回代,得到方程的解
for(int i = n-1;i>=0;i -- )
for(int j = i+1;j<n;j++){
a[i][n] -=a[j][n] * a[i][j];
}
return 0;
}
void solve()
{
cin>>n;
for(int i = 0;i<n;i++){
for(int j = 0;j<n+1;j++){
cin>>a[i][j];
}
}
int t = gauss();
if(t == 0){
for(int i = 0 ;i<n;i++){
if(fabs(a[i][n]) < eps)
{cout<<"0.00"<<endl;
continue;}
printf("%.2lf\n",a[i][n]);
}
}else if(t == 1){
cout<<"Infinite group solutions"<<endl;
}else cout<<"No solution"<<endl;
}