Гаусс

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

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

    can4ec Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    за скока? :p
     
  3. sdriver

    sdriver Гость

    Будьте благосклонны к студентам, когда то им и сами были:)
    Код (Text):
    /*Решение системы неоднородных линейных уравнений по методу Гаусса*/ #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; }
     
Загрузка...
Похожие Темы - Гаусс
  1. Antoni
    Ответов:
    2
    Просмотров:
    944
  2. kobrin13
    Ответов:
    0
    Просмотров:
    1.273
  3. Krex
    Ответов:
    0
    Просмотров:
    1.476
  4. Krex
    Ответов:
    1
    Просмотров:
    1.576
Статус темы:
Закрыта.

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