Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Вычисление обратной матрицы и определителя, не могу найти ошибки, помогите плз 
:(
    Опции темы
Elha
Дата 12.12.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



Нужно найти определитель и обратную матрицу. Приведением к диагональному/треугольному виду. Алгоритм ясен мне как белый день, но с реализацией не всё хорошо (всё не хорошо, если быть точнее). Помогите пожалуйста на предмет обнаружения ошибок в коде, а то считает фигню какую-то  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;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.