Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Вычисление обратной матрицы и определителя


Автор: Elha 12.12.2009, 19:14
Нужно найти определитель и обратную матрицу. Приведением к диагональному/треугольному виду. Алгоритм ясен мне как белый день, но с реализацией не всё хорошо (всё не хорошо, если быть точнее). Помогите пожалуйста на предмет обнаружения ошибок в коде, а то считает фигню какую-то  smile  
Код

double det(double ** A, int N);
double ** obr(double ** A, int N);

void main()
{
    int N;
    cout<<"Vvedite N\n";
    cin>>N;
    cout<<"Vvedite matricu A\n";
    double ** a=new double*[N];
    for (int i=0; i<N; i++)
    {
        a[i]=new double;
        for (int j=0; j<N; j++)
            cin>>a[i][j];
    }
    cout<<endl;
    cout<<det(a, N)<<endl;
    obr(a, N);
}

double det(double ** A, int N)
{
    double ** A2=new double * [N];
    for (int i3=0; i3<N; i3++)
    {
        A2[i3]=new double;
        for (int j3=0; j3<N; j3++)
            A2[i3][j3]=A[i3][j3];
    }
    double razr;
    double r=1;
for (int k=0; k<N-1
     ; k++)
{
    for (int i=0; i<N; i++)
    {
        for (int j=0; j<N; j++)
        {
            
            if (A[k][k]==0) 
            {
                r=-r;
                for (int j1=0; j1<N; j1++)
                {
                    A[k][j1]=A2[k+1][j1];
                    A[k+1][j1]=A2[k][j1];
                }
            }
            razr=A[k][k];
            if (i==k) 
            {
                A2[i][j]=A[i][j]/razr;
            }
            else
            {
                A2[i][j]=A[i][j]-A[i][k]*A[k][i]/razr;
            }
            
        }    
    }
    r=r*razr;
    for (int i2=0; i2<N; i2++)
    {for (int j2=0; j2<N; j2++)
    {A[i2][j2]=A2[i2][j2]; cout<<A[i2][j2]<<" ";} cout<<endl;}cout<<endl;
}
delete A2;
double det;
det=r*A[N-1][N-1];
return det;
}

double ** obr(double ** A, int N)
{
    double ** MB1=new double*[N];
    double ** MB2=new double*[N];
    for (int i0=0;i0<N;i0++)
    {
        MB1[i0]=new double;
        MB2[i0]=new double;
        for (int j0=0;j0<2*N;j0++)
        {
            if (j0<N)
            {
                MB1[i0][j0]=A[i0][j0];
                MB2[i0][j0]=A[i0][j0];
            }
            else
            {
                if (i0==j0-N)
                {
                    MB1[i0][j0]=1;
                    MB2[i0][j0]=1;
                }
                else
                {
                    MB1[i0][j0]=0;
                    MB2[i0][j0]=0;
                }
            }
        }
    }
    double razr;
    for (int k=0; k<N; k++) 
    {
        razr=MB1[k][k];
        for (int a=k; a<N; a++)
        {
            if (razr==0)
            {
                for (int b1=k; b1<N-2; b1++)
                    for (int j2=0; j2<2*N; j2++)
                        MB1[b1][j2]=MB1[b1][j2]-MB1[b1+1][j2];
            }
            razr=MB1[k][k];
        }

        for (int i=0;i<N; i++)
        {
            for (int j=0;j<2*N; j++)
            {
                if (i==k)
                    MB2[i][j]=MB1[i][j]/razr;
                else
                    MB2[i][j]=MB1[i][j]-MB1[i][k]*MB1[k][j]/razr;
            }
        }
    
        for (int i1=0; i1<N; i1++)
        {
            for (int j1=0; j1<2*N; j1++)
            {
                MB1[i1][j1]=MB2[i1][j1]; 
                cout<<MB1[i1][j1]<<" ";
            } 
            cout<<endl;
        }
        cout<<endl;
    
    }

    for (int i3=0;i3<N;i3++)
        for (int j3=0;j3<N;j3++)
            A[i3][j3]=MB1[i3][j3+N];
    return A;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)