Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2010, 20:08   #1
korsaru
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию метод Гаусса для С++

народ подскажите как перевести метод Гаусса(для решения СЛУ) из математического вида на программированный.
проблеммы с вычислениями в программе

Последний раз редактировалось korsaru; 09.10.2010 в 20:13.
korsaru вне форума Ответить с цитированием
Старый 09.10.2010, 20:13   #2
korsaru
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию

запутался из за того что в математике отсчет от единицы а в программировании от 0
сейсас выложу код но в нем не дописан обратный ход метода
korsaru вне форума Ответить с цитированием
Старый 09.10.2010, 20:15   #3
korsaru
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию

Код:
#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#define eps 0.0000000001

class CMatrix
 {private: int m;
	   int n;
	   double*p;
 public: CMatrix (){};
	 CMatrix(int,int);
 friend  CMatrix operator+(CMatrix&,CMatrix&);
 friend	 CMatrix operator*(CMatrix&,CMatrix&);
 friend  CMatrix gauss(CMatrix&,CMatrix&);
 void input();
 void output(int,int);
 void output1(int,int);
 void input1();
 double det();
 };

void gauss();
void adddouble ();
void multdouble ();
void det();

void main ()
 {int k;
 clrscr();
 cout<<" add 1\n multiply 2\n schutat' opredelitel 3\n metod gaussa 4\n"<<endl;
 cin>>k;
 if(k==1) adddouble();
 else if (k==2) multdouble();
 else if (k==3) det();
 else if (k==4) gauss();
 }


CMatrix::CMatrix(int a,int b)
{m=a;
n=b;
p=new double [(m+1)*(n+1)];
}


void CMatrix:: output(int x, int y)
{int i;
 int j;

   for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			gotoxy(5*j+x,2*i+y);
			cout<<p[i*n+j];
		}
	}
}



void CMatrix:: output1(int x, int y)
{int i;
 int j;

   for(i=1;i<m+1;i++)
	{
		for(j=1;j<n+1;j++)
		{
			gotoxy(5*j+x,2*i+y);
			cout<<p[i*(n+1)+j];
		}
	}
}




void det()
{int n;
 double d;
 cout<<"vvedite razmer matrici n" <<endl;
 cin>>n;
 CMatrix A(n,n);
 clrscr();
 A.input();
 A.output(31,9);
 d=A.det();
 gotoxy(28,15);
 cout<<"opredel raven "<<d;
 getch();
}



 void adddouble ()
{int m,n;
 clrscr();
 cout<<"vvedite razmeri matriz m i n"<<endl;
 cin>>m>>n;
 CMatrix A(m,n);
 CMatrix B(m,n);
 CMatrix C(m,n);
 A.input();
 B.input();
 clrscr();
 C=A+B;
 getch();
 }








void multdouble ()
{int m,n,l;
cout<<"vvedite m, n, l"<<endl;
cin>>m>>n>>l;
CMatrix A(m,n);
CMatrix B(n,l);
CMatrix C(m,l);
A.input();
B.input();
clrscr();
C=A*B;
A.output(1,1);
B.output(41,1);
C.output(21,9);
getch();
}



void CMatrix::input()
{int i, j;
cout<<"vvedite info"<<endl;
for(i=0;i<m;i++)
 for(j=0;j<n;j++)
 cin>>p[i*n+j];

}

void CMatrix::input1()
{int i, j;
cout<<"vvedite info"<<endl;
for(i=1;i<m+1;i++)
 for(j=1;j<n+1;j++)
 cin>>p[i*(n+1)+j];

}


CMatrix operator+(CMatrix&obj1,CMatrix&obj2)
{int i,j;
CMatrix temp(obj1.m,obj1.n);
for(i=0;i<obj1.m;i++)
{

  for(j=0;j<obj1.n;j++)
  {
	temp.p[i*obj1.n+j]=obj1.p[i*obj1.n+j]+obj2.p[i*obj1.n+j];
	gotoxy(5*j+1,2*i+1);
	cout<<obj1.p[i*obj1.n+j];
	gotoxy(5*j+41,2*i+1);
	cout<<obj2.p[i*obj1.n+j];
	gotoxy(5*j+21,2*i+8);
	cout<<temp.p[i*obj1.n+j];
  }
}
return temp;

}

CMatrix operator*(CMatrix&obj1,CMatrix&obj2)
{
	int i,j,k;
	double s;
	CMatrix temp(obj1.m,obj2.n);
	for(i=0;i<obj1.m;i++)
	{
		for(j=0;j<obj2.n;j++)
		{
			s=0;
			for(k=0;k<obj1.n;k++)
			s+=(obj1.p[i*obj1.n+k]*obj2.p[k*obj2.n
			+j]);
			temp.p[i*temp.n+j]=s;

}
}
return temp;
}


double CMatrix::det()
 { double d;
   d=0;
   int znak=-1;
   int i;
   int j;
   int k;
 if (n==2)
 d=p[0]*p[3]-p[1]*p[2];
 else if (n>2)

	{
	 CMatrix OBR(n-1,n-1);
	 for(i=0;i<n;i++)
		{ for(j=1;j<n;j++)
			{for (k=0;k<n;k++)
			 if(k<i)
			 OBR.p[(j-1)*(n-1)+k]=p[j*n+k];
			 else if (k>i)
			 OBR.p[(j-1)*(n-1)+(k-1)]=p[j*n+k];
			}
			znak*=-1;
			d+=(p[i]*OBR.det()*znak);

		}


	}
	return d;
 }



 void gauss()
 {
	int n;
	cout<<"vvedite n "<<endl;
	cin>>n;
	CMatrix a (n+1,n+1);
	CMatrix b (n+1,1);
	CMatrix x (1,n+1);
	a.input1();
	b.input1();
	x=gauss(a,b);
	gotoxy (28,15);
	cout<<"otvet = ";
	x.output1(38,15);
	getch;

 }

 CMatrix gauss(CMatrix&a,CMatrix&b)
 {
	CMatrix x(1,a.n+1);
	int i;
	int j;
	int k;
	int n=a.n+1;
	for (k=1;k<n;k++)//nomer obnul stolbcha
	{
		/*if(fabs(a.p+k*(a.n+1)+k)<eps )
		{

		}*/
		for(i=k+1;i<n;i++)//i nomer obr str
		{ clrscr();
		  a.output1 (1,1);
		  b.output1 (37,1);

		  for(j=k;j<n;j++)// nomer stolbcha v obr stroke
		  {
			 a.p[(i+1)*n+j]=a.p[(i+1)*n+j]-a.p[(i+1)*n+k]/a.p [(k+1)*n+k] * a.p[(k+1)*n+j];


		  }

		 b.p[i]=b.p[i]-a.p[(i+1)*n+k]/a.p[(k+1)*n+k]*b.p[k];
		 a.output1(40,1);
		 b.output1(70,1);
		 getch;
		}


	}
 return x;
 }
korsaru вне форума Ответить с цитированием
Старый 16.10.2010, 20:45   #4
korsaru
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию

короче я это дописал) если кому надо береите ) если нужны объяснения пишите 567393894
Код:
#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#define eps 0.0000000001
#define esc 27

class CMatrix
 {private: int m;  //kol-vo strok
       int n;                    //kol-vo stolbchov
       double*p;                 //nachalo matr
 public: CMatrix (){};
     CMatrix(int,int);
 friend  CMatrix operator+(CMatrix&,CMatrix&);
 friend     CMatrix operator*(CMatrix&,CMatrix&);
 friend  CMatrix gauss(CMatrix&,CMatrix&);
 int vozvrat(int);//vozvrash'aet nomer stroki s max po modulu elem  v k-om solbche nachinaya s k+1-oy stroki
 void obmen(int,int);//menaet mestami 2 stroki
 void input();
 void output(int,int);
 double det();
 double* operator[](int str)
  {
    return p+str*n;
  }
 };

void gauss();
void adddouble ();
void multdouble ();
void det();

void main ()

 {

 int k;
 do
 {
 clrscr();
 cout<<" add 1\n multiply 2\n schutat' opredelitel 3\n metod gaussa 4\n vixod 0\n"<<endl;
 cin>>k;
 if(k==1) adddouble();
 else if (k==2) multdouble();
 else if (k==3) det();
 else if (k==4) gauss();

 }
 while(k!=0);
 }



CMatrix::CMatrix(int a,int b)
{m=a;
n=b;
p=new double [m*n];
}


void CMatrix::output(int x, int y)
{int i;
 int j;

   for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            gotoxy(10*j+x,2*i+y);
            cout<<p[i*n+j];
        }
    }
}




void det()
{int n;
 double d;
 cout<<"vvedite razmer matrici n" <<endl;
 cin>>n;
 CMatrix A(n,n);
 clrscr();
 A.input();
 A.output(31,9);
 d=A.det();
 gotoxy(28,15);
 cout<<"opredel raven "<<d;
 getch();
}



 void adddouble ()
{int m,n;
 clrscr();
 cout<<"vvedite razmeri matriz m i n"<<endl;
 cin>>m>>n;
 CMatrix A(m,n);
 CMatrix B(m,n);
 CMatrix C(m,n);
 A.input();
 B.input();
 clrscr();
 C=A+B;
 getch();
 }








void multdouble ()
{int m,n,l;
cout<<"vvedite m, n, l"<<endl;
cin>>m>>n>>l;
CMatrix A(m,n);
CMatrix B(n,l);
CMatrix C(m,l);
A.input();
B.input();
clrscr();
C=A*B;
A.output(1,1);
B.output(41,1);
C.output(21,9);
getch();
}



void CMatrix::input()
{int i, j;
cout<<"vvedite info"<<endl;
for(i=0;i<m;i++)
 for(j=0;j<n;j++)
 cin>>p[i*n+j];

}
это первая часть
korsaru вне форума Ответить с цитированием
Старый 16.10.2010, 20:46   #5
korsaru
 
Регистрация: 09.10.2010
Сообщений: 5
По умолчанию

это вторая
Код:
CMatrix operator+(CMatrix&obj1,CMatrix&obj2)
{int i,j;
CMatrix temp(obj1.m,obj1.n);
for(i=0;i<obj1.m;i++)
{

  for(j=0;j<obj1.n;j++)
  {
    temp.p[i*obj1.n+j]=obj1.p[i*obj1.n+j]+obj2.p[i*obj1.n+j];
    gotoxy(5*j+1,2*i+1);
    cout<<obj1.p[i*obj1.n+j];
    gotoxy(5*j+41,2*i+1);
    cout<<obj2.p[i*obj1.n+j];
    gotoxy(5*j+21,2*i+8);
    cout<<temp.p[i*obj1.n+j];
  }
}
return temp;

}

CMatrix operator*(CMatrix&obj1,CMatrix&obj2)
{
    int i,j,k;
    double s;
    CMatrix temp(obj1.m,obj2.n);
    for(i=0;i<obj1.m;i++)
    {
        for(j=0;j<obj2.n;j++)
        {
            s=0;
            for(k=0;k<obj1.n;k++)
            s+=(obj1.p[i*obj1.n+k]*obj2.p[k*obj2.n
            +j]);
            temp.p[i*temp.n+j]=s;

}
}
return temp;
}


double CMatrix::det()
 { double d;
   d=0;
   int znak=-1;
   int i;
   int j;
   int k;
 if (n==2)
 d=p[0]*p[3]-p[1]*p[2];
 else if (n>2)

    {
     CMatrix OBR(n-1,n-1);
     for(i=0;i<n;i++)
        { for(j=1;j<n;j++)
            {for (k=0;k<n;k++)
             if(k<i)
             OBR.p[(j-1)*(n-1)+k]=p[j*n+k];
             else if (k>i)
             OBR.p[(j-1)*(n-1)+(k-1)]=p[j*n+k];
            }
            znak*=-1;
            d+=(p[i]*OBR.det()*znak);

        }


    }
    return d;
 }



 void gauss()
 {
    int n;
    cout<<"vvedite n "<<endl;
    cin>>n;
    CMatrix a (n,n);
    CMatrix b (n,1);
    CMatrix x (1,n);
    a.input();
    b.input();
    clrscr();
    a.output (1,1);
    b.output (50,1);
    x=gauss(a,b);
    gotoxy (28,24);
    cout<<"otvet = ";
    x.output(38,24);
    getch();

 }

 CMatrix gauss(CMatrix&a,CMatrix&b)
 {
    CMatrix x(1,a.n);
    int i;
    int j;
    int k;
    int d;
    double mnoj;
    double E;
    int n=a.n;
    for (k=0;k<n-1;k++)//nomer obnul stolbcha
    {    d=a.vozvrat(k);
         a.obmen(k,d);
         b.obmen(k,d);
        if(fabs(a[k][k])<eps )
        {
         cout<<"\n opredelitel=0, systema ne imeet edinstvennogo reshenia";
         getch();
          for(i=0;i<n;i++)
          {x[0][i]=0;
          }
         return x;
        }
        for(i=k+1;i<n;i++)//i nomer obr str
        {/* clrscr();
          a.output (1,1);
          b.output (30,1);*/
          mnoj=a[i][k]/a[k][k];

          for(j=k;j<n;j++)// nomer stolbcha v obr stroke
          {
             a[i][j]=a[i][j]-mnoj*a[k][j];


          }

         b[i][0]=b[i][0]-mnoj*b[k][0];
        /* a.output(40,1);
         b.output(69,1);
         getch();
         clrscr();*/
        }
    }
     x[0][n-1]=b[n-1][0]/a[n-1][n-1];
     for(i=(n-2);i>=0;i--)
        {    E=0;
            for(j=i+1;j<n;j++)
            {
                E+=(a[i][j]*x[0][j]);
            }

            x[0][i]=(b[i][0]-E)/a[i][i];
        }

 return x;


 }


 int CMatrix::vozvrat(int d)

 {
  double max=fabs(p[d*n+d]);
  int index=d;
  int i;
  for (i=d+1;i<n;i++)
    {
        if (fabs(p[i*n+d])>max)
        {
            index=i;
            max=fabs(p[i*n+d]);
        }

    }
 return index;
 }

 void CMatrix::obmen(int str1,int str2)
 {  double h;
    int i;
    if(str1!=str2)
    {
      for(i=0;i<n;i++)
      {
        h=p[str2*n+i];
        p[str2*n+i]=p[str1*n+i];
        p[str1*n+i]=h;
      }
    }
 }
программа реализованна в Borland C++
korsaru вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Гаусса mbeats Общие вопросы C/C++ 5 01.01.2010 20:07
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод Гаусса с выбором главного элемента для решения СЛАУ lira_slava Помощь студентам 3 21.05.2009 20:56
Метод Гаусса mEka Общие вопросы Delphi 4 09.01.2008 16:16