Матричный инвертор, возвращающий неправильный обратный

Этот код предназначен для поиска обратной матрицы, он почти делает это. Последняя строка чисел неверна, и я не уверен, почему. Это не лучший способ найти инверсию, однако именно так мне нужно сделать это для моего домашнего задания. Я несколько раз переделывал функцию мощности, так что теперь она должна быть правильной. Используемый метод: B=I-A, A^-1 = I+B+B^2+B^3... (вплоть до B^20).

#include <iostream>
#include <iomanip>

using namespace std;

void multiplinator(double invA[][3], double A[][3], double y[][3]) //multiplies the matrix
{
    for(int i = 0; i < 3; i++)
    {
            for(int j = 0; j < 3; j++)
            {
                y[i][j] = 0;
                    for(int k = 0; k < 3; k++)
                    {
                            y[i][j] += invA[i][k] * A[k][j];
                    }
            }
    }
}

void printinator(double a[3][3]) //prints a matrix
{
for(int i=0; i<=2; i++)
    {
    for(int j=0; j<=2; j++)
        cout << fixed << setprecision(2) << setw(12) << a[i][j] << "  ";
    cout << endl;
    }
        cout << endl;
}

void substitinator(double I[][3], double A[][3], double B[][3]) //Matrix subtraction
{
   for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            B[i][j] = I[i][j] - A[i][j];
}

void additinator(double I[3][3], double B[][3], double invA[][3]) //Matrix addition
{
   for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            invA[i][j] = I[i][j] + B[i][j];
}

void powernator(double B[][3],double pB[][3], int p) //function which is supposed to raise a matrix to a certain power
{
    double temp[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };
    int i,j,w,k;

    for(i = 0 ; i < 2 ; ++ i )
          for(j = 0 ; j < 2 ; ++ j )
           pB[i][j] = ( i == j ) ;
    for(w = 0; w < p; w++)
    {
        for(i=0;i<2;i++)
        {
            for(j=0;j<2;j++)
            {
                temp[i][j]=0;
                for(k=0;k<2;k++)
                {
                    temp[i][j] += pB[i][k] * B[k][j];
                }
            }
        }

        for(i = 0; i < 2; i++){
            for(j = 0; j < 2; j++)
            {
                pB[i][j] = temp[i][j];
            }
        }
    }
}

void gettem(double pB[][3], double invA[][3]) //Matrix addition of power of B
{
   for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            invA[i][j] += pB[i][j];
}

int main()
{

double A[3][3] = { {1./2, 1, 0} , {0, 2./3, 0} , {-1./2, -1, 2./3} };
double invA[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };
double I[3][3] = { {1, 0, 0} , {0, 1, 0} , {0, 0, 1} };

double B[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };
double pB[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };
double y[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };

    substitinator(I,A,B);
    additinator(I,B,invA);

        for(int p = 2; p <= 20; p++)
        {
            powernator(B,pB,p);
            gettem(pB, invA);
        }

    cout << "\n\t\t   Inverse:" << endl;
        printinator(invA);

    cout << "\n\t\t   invA * A:" << endl;
        multiplinator(invA, A, y);
        printinator(y);
}

person Dumbquestionsman    schedule 30.11.2019    source источник
comment
Кажется, сейчас самое время научиться использовать отладчик для пошагового выполнения кода, оператор за оператором, при этом отслеживая переменные и их значения.   -  person Some programmer dude    schedule 30.11.2019
comment
Вы используете смесь <3 и <=2 в своих циклах. Это непоследовательно и может привести к проблеме с типографикой в ​​powernator.   -  person 1201ProgramAlarm    schedule 30.11.2019
comment
@Dumbquestionsman, просто из любопытства, какую из серий ваш учитель хочет, чтобы вы доказали или подтвердили?   -  person Bill Chen    schedule 30.11.2019
comment
Он хочет, чтобы мы поняли, как работает матрица. Сначала я заставил ее найти обратную, используя определитель, но он назвал это обманом, поэтому мне пришлось переделывать.   -  person Dumbquestionsman    schedule 01.12.2019


Ответы (1)


Я согласен с @1201ProgramAlarm, ваша функция powernator() неверна, вы должны убедиться, что все условия цикла for равны < 3, а не < 2

void powernator(double B[3][3],double pB[3][3], int p) //function which is supposed to raise a matrix to a certain power
{
    double temp[3][3] = { {0, 0, 0} , {0, 0, 0} , {0, 0, 0} };
    int i,j,w,k;

    for(i = 0 ; i < 3 ; ++ i )
          for(j = 0 ; j < 3 ; ++ j )
           pB[i][j] = ( i == j ) ;
    for(w = 0; w < p; w++)
    {
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                temp[i][j]=0;
                for(k=0;k<3;k++)
                {
                    temp[i][j] += pB[i][k] * B[k][j];
                }
            }
        }

        for(i = 0; i < 3; i++){
            for(j = 0; j < 3; j++)
            {
                pB[i][j] = temp[i][j];
            }
        }
    }
}

Результаты:

   Inverse:
2.00         -3.00          0.00  
0.00          1.50          0.00  
1.50          0.00          1.50  


   invA * A:
1.00          0.00          0.00  
0.00          1.00          0.00  
   -0.00          0.00          1.00  

Надеюсь это поможет.

person Bill Chen    schedule 30.11.2019
comment
Да, это именно то, что исправлено, спасибо, ребята! - person Dumbquestionsman; 01.12.2019