1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Гаусс

Тема в разделе "С и С++", создана пользователем can4ec, 26 сен 2006.

Статус темы:
Закрыта.
  1. can4ec

    can4ec Гость

    Репутация:
    0
    Помогите реализовать метод Гаусса на С++. (напешите код плиз)
     
  2. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    за скока? :P
     
  3. sdriver

    sdriver Гость

    Репутация:
    0
    Будьте благосклонны к студентам, когда то им и сами были:)
    Код:
    /*Решение системы неоднородных линейных уравнений по методу Гаусса*/ #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; }
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей