Метод Крамера. Не большая проблема.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
katerinka6666
Сообщения: 1
Зарегистрирован: 18 май 2013, 20:18

я написала программу по курсовой работе, "Программная реализация задачи нахождения решения системы линейных уравнений по формулам Крамера», я написала функцию для нахождения определителя. Возникла 1 проблема, когда я вызываю эту функцию для нахождения побочных определителей. Как потом можно обратиться к результату? мне нужно каждый из побочных определителей поделить на определитель основной матрицы. Программа работает и находит все определители. Подскажите, пожалуйста, я пробовала сделать массив из значений побочных определителей, но программа не правильно работает.

Код: Выделить всё

double determinant(double **matrica_a, int n)
{int i,j,k,r; double c,M,max,s, det=1, **a;
  a=new double*[n];
  for(i=0;i<n;i++) a[i]=new double [n];
  for(i=0;i<n;i++)
        for(j=0;j<n;j++) a[i][j]=matrica_a[i][j];
  for(k=0;k<n;k++)
  {
   max=fabs(a[k][k]); r=k;
   for (i=k+1;i<n;i++)
        if (fabs(a[i][k])>max)
        { max=fabs(a[i][k]); r=i;  }
          if(r!=k) det=-det;
          for(j=0;j<n;j++)
          {c=a[k][j]; a[k][j]=a[r][j]; a[r][j]=c;}
          for(i=k+1;i<n;i++)
                for(M=a[i][k]/a[k][k],j=k; j<n;j++)
                   a[i][j]-=M*a[k][j];
   }
   for(i=0;i<n;i++) det*=a[i][i];
   return det;
}
int main(int argc, char* argv[])
{int result, i, j, g, N;
double **a,b; double *x, *y;
cout<<"N="; cin>>N;
a=new double*[N];
x=new double[N];
y=new double[N];

for(i=0;i<N;i++) a[i]=new double[N];
cout<<"input matrix A"<<endl;
for(i=0;i<N;i++)
        for(j=0;j<N;j++) cin>>a[i][j];
cout<<"\n A="<<endl;
for (i=0; i<N; i++)
        {
        for (j=0; j<N; j++) cout<<setw(4)<<a[i][j]<<" ";
        cout<<endl;
        }
cout<<"input matrix B"<<endl;
for(i=0;i<N;i++) cin>>x[i];
cout<<"\n B="<<endl;
for (i=0; i<N; i++) cout<<x[i]<<endl;
cout<<"\ndeterminant="<<determinant(a,N)<<endl;

for(j=0;j<N;j++)
        {
        for(i=0; i<N; i++)
        {g=a[i][j]; a[i][j]=x[i]; x[i]=g;}
         cout<<"\ndeterminant pobochnii="<<determinant(a,N)<<endl;

        for(i=0; i<N; i++)
        {g=a[i][j]; a[i][j]=x[i]; x[i]=g;}
        }




cin>>N;
for(i=0; i<N; i++)
 delete  [] a[i];
delete [] a;
delete [] x;
delete [] y;}

//------------------------------------
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А зачем сделан лишний цикл после вычисления побочного определителя?

Код: Выделить всё

        cout<<"\ndeterminant pobochnii="<<determinant(a,N)<<endl;

        for(i=0; i<N; i++)
        {g=a[i][j]; a[i][j]=x[i]; x[i]=g;}
Он ведь делает абсолютно то же самое, что и цикл до вычисления побочного определителя.

Как сохранить значения побочных определителей для дальнейших вычислений? Можно в отдельный динамичский массив. Например так:

Код: Выделить всё

    for(j=0;j<N;j++)
    {
        for(i=0; i<N; i++)
        {
            g=a[i][j]; a[i][j]=x[i]; x[i]=g;
        }
        opr[j] = determinant(a,N);
        cout << "\ndeterminant pobochnii = " << opr[j] << endl;

    }
Массив opr нужно не забыть динамически выделить и потом очистить подобно массивам x и y.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить