/*Решение системы неоднородных линейных уравнений по методу Гаусса*/ #include <iostream.h> #include<stdio.h> #include<conio.h> #define MAX_ROWC 100 #define MAX_COLC 100 /*За i-ю неизвестную отвечает столбец Vars[i]; Если за i-ю неизвестную отвечает нулевой столбец,то Vars[i]=0*/ int Vars[MAX_COLC]; int VarC; int DelRow(double matr[MAX_ROWC][MAX_COLC],double vect[MAX_COLC],int i,int& m,int n) { if ((i<0)||(i>m)) return 1; if (i==m-1) m--; else{ int j,l; for (j=i;j<m-1;j++){ for(l=0;l<n;l++) matr[j][l]=matr[j+1][l]; vect[j]=vect[j+1]; } m--; } return 0; } int DelCol(double matr[MAX_ROWC][MAX_COLC],int i,int m,int& n) { if ((i<0)||(i>n)) return 1; if (i==n-1) n--; else{ int j,l; for(j=0;j<VarC;j++) if(Vars[j]>=i) Vars[j]--; for (j=0;j<m;j++) for(l=i;l<n-1;l++) matr[j][l]=matr[j][l+1]; n--; } return 0; } int ChCols(double matr[MAX_ROWC][MAX_COLC],int i,int j,int m,int n) { if ((i<0)||(j<0)) return 1; if ((i>=n)||(j>=n)) return 1; if (i==j) return 0; double temp[MAX_COLC]; for (int k=0;k<m;k++) { temp[k]=matr[k][i]; matr[k][i]=matr[k][j]; matr[k][j]=temp[k]; } Vars[Vars[i]]=j; Vars[Vars[j]]=i; return 0; } int ChRows(double matr[MAX_ROWC][MAX_COLC],double vect[MAX_COLC],int i,int j,int m,int n) { if ((i<0)||(j<0)) return 1; if ((i>=m)||(j>=m)) return 1; if (i==j) return 0; double temp[MAX_COLC]; double tmp; tmp=vect[i]; vect[i]=vect[j]; vect[j]=tmp; for (int k=0;k<n;k++) { temp[k]=matr[i][k]; matr[i][k]=matr[j][k]; matr[j][k]=temp[k]; } return 0; } void Test(double matr[MAX_ROWC][MAX_COLC],double vect[MAX_COLC],int& m,int& n,int& exs) { int i,j,ind,l=0; /*удаляем нулевые столбцы*/ for(i=0;i<n;i++){ ind=0; for (j=0;j<m;j++) if (matr[j][i]) ind=1; if(ind==0){ DelCol(matr,i,m,n); Vars[l]=-1; i--; } l++; } /*удаляем нулевые строки*/ for (i=0;i<m;i++){ ind=0; for (j=0;j<n;j++) if (matr[i][j]) ind=1; if(ind==0) if (vect[i]==0){ DelRow(matr,vect,i,m,n); i--; } else exs=0; } } void main() { double matr[MAX_ROWC][MAX_COLC],cnst; double vect[MAX_ROWC]; double answers[MAX_COLC]; int m=0,n=0; int i,j,k,l,ind,exs=1; cout<<"And now you'll get a chance to get solution of your favourite"<<endl<<"set of linear equations."<<endl<<endl; cout<<"Input the row count (not above "<<MAX_ROWC<<")."<<endl; cin>>m; cout<<"Input the column count (not above "<<MAX_COLC<<")."<<endl; cin>>n; if ((m<=0)||(n<=0)){ cout<<"I suppose you don't know what 'the set of linear equations' really means!"<<endl; cout<<"Press any key to exit."<<endl; _getche(); return; } if ((m>MAX_ROWC)||(n>MAX_COLC)){ cout<<"I suppose you don't know what 'not above' really means!"<<endl; cout<<"Press any key to exit."<<endl; _getche(); return; } VarC=n; cout<<"Input matrix of coefficients."<<endl; for (i=0;i<m;i++) for (j=0;j<n;j++) cin>>matr[i][j]; cout<<"Input the vector of free variables."<<endl; for(i=0;i<m;i++) cin>>vect[i]; for (i=0;i<n;i++) Vars[i]=i; Test(matr,vect,m,n,exs); /*main loop*/ for (k=0;(k<m)&&(exs)&&(k<n);k++){ ind=1; i=k; while((ind)&&(exs)&&(i<m)){ l=k; while((l<m)&&(matr[l][i]==0)) l++; if(l==m){ for(j=k;(j<n)&&(ind);j++) if (matr[i][j]) ind=0; if(!ind) ChCols(matr,j-1,k,m,n); else if(vect[i]==0) DelRow(matr,vect,i,m,n); else exs=0; } else {ind=0;i=l;} } if ((!ind)&&(exs)){ if(i!=k) ChRows(matr,vect,k,i,m,n);/*1*/ cnst=matr[k][k]; for (j=k;j<n;j++) matr[k][j]=matr[k][j]/cnst; /*2*/ vect[k]=vect[k]/cnst; for (j=k+1;j<m;j++) if (matr[j][k]){ cnst=matr[j][k]; for(l=k;l<n;l++) matr[j][l]-=cnst*matr[k][l]; vect[j]-=vect[k]*cnst; } /*3*/ } } Test(matr,vect,m,n,exs); if(exs){ cnst=matr[m-1][m-1]; for (j=m-1;j<n;j++) matr[m-1][j]=matr[m-1][j]/cnst; vect[m-1]=vect[m-1]/cnst; /*Вывод приведенной к треугольному виду матрицы for (i=0;i<m;i++){ for (j=0;j<n;j++) printf("%.3f ",matr[i][j]); cout<<vect[i]<<endl; } */ if ((m==0)&&(n==0)){ cout<<"Infinitely many solutions (vary depending on arbitrary constants):"<<endl; j=1; for (i=0;i<VarC;i++) if (Vars[i]==-1) cout<<"x"<<i+1<<" = c "<<j++<<endl; } else if (n==m){ /*одно решение*/ answers[m-1]=vect[m-1]; for(i=m-2;i>=0;i--){ cnst=0; for(j=i+1;j<m;j++) cnst=cnst+matr[i][j]*answers[j]; answers[i]=vect[i]-cnst; } j=1; if (n==VarC) cout<<"Solution:"<<endl; else cout<<"Infinitely many solutions (vary depending on arbitrary constants):"<<endl; for (i=0;i<VarC;i++) if (Vars[i]==-1) cout<<"x"<<i+1<<" = c "<<j++<<endl; else cout<<"x"<<i+1<<" = "<<answers[Vars[i]]<<endl; } /*бесконечно много решений-приводим базисный минор к единичному*/ else{ for (i=m-1;i>=0;i--) for (j=i-1;j>=0;j--){ cnst=matr[j][i]; for (k=i;k<n;k++) matr[j][k]-=matr[i][k]*cnst; if (i!=0) vect[j]-=vect[i]*cnst; } /* Вывод полученной матрицы (с единичным базисным минором) for (i=0;i<m;i++){ for (j=0;j<n;j++) printf("%.3f ",matr[i][j]); cout<<vect[i]<<endl; } */ for (i=0;i<VarC;i++) answers[i]=1; for (i=0;i<m;i++){ answers[i]=vect[i]; for(j=m;j<n;j++) answers[i]-=matr[i][j]; } cout<<"Infinitely many solutions (vary depending on arbitrary constants)."<<endl<<"Here is one of them:"<<endl; for (i=0;i<VarC;i++) if (Vars[i]==-1) cout<<"x"<<i+1<<" = 0"<<endl; else cout<<"x"<<i+1<<" = "<<answers[Vars[i]]<<endl; } } else cout<<"This system is unsolved."<<endl; cout<<"Press any key to exit."<<endl; _getche(); return; }