Неправильный обратный ход в матрице

Проблема в Gaussdet , в обратном ходе(173 строка примерно , в комментариях написано) , я нашел ошибку , но пока не знаю как ее можно исправить , у меня идет работа с двумя матрицами - обычная и единичная , 1-ую я преобразовываю в единичную , а со второй делаю те же самые преобразования что и с 1 матрицей , в итоге из единичной должна получится обратная Проблема в том , что если ввести например матрицу размерностью 2 и выше она выходит за пределы матрицы T , в итоге этот цикл правильно работает только на первой матрице , а во второй меняет первый элемент и все. Подскажите как переделать обратный ход чтобы все корректно считалось

#include <iostream>
#include <math.h>
#include <ctime>
#include <iomanip>
using namespace std;
//#define clean system("cls");
#define next cout<<endl;
int ShowMtx(double** A, int size)//вывод с выравниванием
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size + 1; j++)
        {
            cout << fixed << setprecision(2) << setw(6) << A[i][j] << " ";
        }
        next
    }
    return 0;
}
int ShowMtx1(double** A, int size, int size1)//вывод с выравниванием
{
    if (size1 != size)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size1; j++)
            {
                cout << fixed << setprecision(4) << setw(8) << A[i][j] << " ";
            }
            next
        }
        next
    }
    else
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << fixed << setprecision(4) << setw(8) << A[i][j] << " ";
            }
            next
        }
        next

    }
    return 0;
}

int MultiMass(double** T, double** B, double** X, int size, int size2)//умножение
{
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size2; j++)
        {
            X[i][j] = 0;
            for (int k = 0; k < size; k++)
            {
                X[i][j] += T[i][k] * B[k][j];
            }
        }
    }

    return 0;
}
int Summmtx(double** A, double** B, double** C, int size)//вычисление суммы матриц
{

    cout << "B="; next ShowMtx1(B, size, 1); next
        cout << "B="; ShowMtx1(B, size, 1);
    for (int i = 0; i < size; i++) {// результат суммирования матриц в новую матрицу
        for (int j = 0; j < size; j++)
        {
            C[i][j] = A[i][j] - B[i][j];
        }
        next
    }
    cout << "X2=" << endl;
    return 0;
}
void deleteMtx(double** A, int size)
{
    for (int i = 0; i < size + 1; i++)
    {
        delete[] A[i];
    }
    delete[] A;
}
void deleteMtx1(double** B, int size)
{
    for (int i = 0; i < size; i++)
    {
        delete[] B[i];
    }
    delete[] B;
}
int Gaussdet(double** A, double** T, double** C, int size)
{
    double** F = new double* [size];
    //ShowMtx(A, size);
    for (int i = 0; i < size; i++)//копия матрицы A
    {
        F[i] = new double[size];
    }
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++)
            F[i][j] = A[i][j];
    cout << "A=" << endl;
    ShowMtx(A, size);//вывод матрицы A
    double** B = new double* [size];
    for (int i = 0; i < size; i++)
        B[i] = new double[1];
    cout << "B=" << endl;//вывод матрицы B
    for (int j = 0; j < size; j++) {
        B[j][0] = A[j][size]; cout << B[j][0] << "\n";
    }
    cout << "T=" << endl;//вывод матрицы T
    ShowMtx1(T, size, size); next

        double eps;
    cout << "Enter the epsilon" << endl;
    cin >> eps;// минимальный модуль элемента матрицы //
    while ((eps >= 1) || (eps <= 0)) { cout << "Error , enter the epsilon(<1,>0)" << endl; cin >> eps; }
    //clean
    bool isNull = false;
    for (int i = 0; i < size - 1; i++)
    {
        if (A[i][i] == 0)
        {
            isNull = true;
            break;
        }
    }
    if (isNull)
    {
        cout << "Problem on diagonal" << endl;//если находим нуль на главной диагонали, то выводим сообщение  об ошибке
        return 0;
    }
    //проверка на нулевую строку
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            int schet = 0, schet1 = 0;
            if (A[i][j] < eps) schet += 1;

            if ((schet == size - 1) || (schet1 == size - 1))
            {
                cout << "Nulevaya stroka,det=0" << endl;
            }
        }
    }

    for (int d = 0; d < size - 1; d++)//прямой ход
    {
        for (int i = d + 1; i < size; i++)
        {
            double tmp = double(A[i][d] / A[d][d]);
            for (int j = 0; j < size + 1; j++)
            {
                A[i][j] = A[i][j] - A[d][j] * tmp;
                T[i][j] = T[i][j] - T[d][j] * tmp;

            }
        }
    }
    cout << "Right hod A" << endl; 
    ShowMtx(A, size);
    cout << "Right hod T" << endl;
    ShowMtx1(T, size, size); next
    next
        int columns = size + 1;//обратный ход
    for (int k = 1; k < size; k++)
    {
        int indexDop = size - k;
        for (int i = size - k - 1; i >= 0; i--)
        {
            double tmp = A[i][indexDop] / A[indexDop][indexDop];
            for (int j = indexDop; j < columns; j++)
            {
                T[i][j] = T[i][j] - T[indexDop][j] * tmp;
                A[i][j] = A[i][j] - A[indexDop][j] * tmp;
                
            }
        }
    }
    cout << "Reverse hod A" << endl;
    ShowMtx(A, size);next
    cout << "Reverse hod T" << endl;
    ShowMtx1(T, size, size);next
    int det = 1;//вычисление определителя
    for (int i = 0; i < size; i++) det *= A[i][i];
    if (det == 0) { cout << "det(A)=0,ending the programm"; return 0; }
    for (int i = 0; i < size; i++)
    {
        double tmp = A[i][i];
        for (int j = 0; j < size+1; j++)
        {
            A[i][j] /= tmp; T[i][j] /= tmp;
        }

    }
    cout << "A,right and reverse code" << endl; ShowMtx(A, size);
    cout << "T,right and reverse code;T=A^(-1)" << endl; ShowMtx1(T, size, size);
    next
        double** X = new double* [size];// X-матрица решений
    for (int i = 0; i < size; i++)
        X[i] = new double[1];
    double** X2 = new double* [size];// X2-копия B
    for (int i = 0; i < size; i++) { X2[i] = new double[1]; X2[i] = B[i]; }
    //ShowMtx1(F, size, size);
    cout << "X=A^(-1)*B" << endl;
    cout << "A^(-1)="; ShowMtx1(T, size, size);
    cout << "B="; ShowMtx1(B, size, 1); next
        MultiMass(T, B, X, size, 1); next
    cout << "X="; ShowMtx1(X, size, 1); next
    cout << "A*X" << endl;
    cout << "A="; ShowMtx1(F, size, size); next
    cout << "X="; ShowMtx1(X, size, 1); next
    cout << "B="; ShowMtx1(X2, size, 1); next//
        MultiMass(T, X, B, size, 1);
    cout << "A*X-B" << endl;

    Summmtx(B, B, X2, size); ShowMtx1(X2, size, 1); next
        cout << "A*A^(-1)" << endl;
    double** Z = new double* [size];
    double** Z1 = new double* [size];
    for (int i = 0; i < size; i++)
    {
        Z[i] = new double[size]; Z1[i] = new double[size];
    }
    int size2 = 1;
    ShowMtx1(F, size, size);
    ShowMtx1(T, size, size);
    MultiMass(F, T, Z, size, size); ShowMtx1(Z, size, size); next
    cout << "A^(-1)*A" << endl;
    MultiMass(T, F, Z1, size, size); ShowMtx1(T, size, size); next
    ShowMtx1(F, size, size); next
    ShowMtx1(Z, size, size); next

        //_______________________________________________________________
        //for (int i = 0; i < size; i++) {delete[] X[i];} delete[] X;
        //for (int i = 0; i < size; i++) { delete[] X2[i]; } delete[] X2;
    //for (int i = 0; i < size; i++) { delete[] B[i]; } delete[] B;
//deleteMtx1(Z, size); deleteMtx1(Z1, size); deleteMtx(F, size);
return 0;
}
int main()
{
    int size, choice;
    cout << "\t\t\t\t\t\tInput matrix A" << endl;//ввод матрицы A
    cout << "Enter the size of matrix A (>0,<=15)" << endl;
    cin >> size;
    while ((size < 0) || (size > 15)) { cout << "Enter the size of matrix A again" << endl; cin >> size; }
    //выход за пределы диапазона//
    double** A = new double* [size];//матрица A
    for (int i = 0; i < size; i++)
    {
        A[i] = new double[size + 1];
    }
label:
    cout << "1-Randomly(matrix A)\n2-Manually(matrix A) " << endl;//автоматически или вручную//
    cin >> choice;
    switch (choice)
    {
    case 1:
    {
        srand(time(0));
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size + 1; j++)
            {
                A[i][j] = rand() % 20;
            }
        }
        break;
    }
    case 2:
    {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size + 1; j++)
            {
                cout << "A[" << i << "," << j << "]= ";
                cin >> A[i][j];
            }
            next
        }
        break;
    }
    default:
    {
        goto label;
    }
    }
    //clean

    double** C = new double* [size];// C - копия матрицы А
    for (int i = 0; i < size; i++)
    {
        C[i] = new double[size + 1]; C[i] = A[i];
    }
    double** T = new double* [size];// T-для обратной матрицы
    for (int i = 0; i < size; i++)
    {
        T[i] = new double[size];
    }
    for (int i = 0; i < size; i++)//заполнение смежной матрицы T
    {
        for (int j = 0; j < size; j++)
        {
            if (i == j) { T[i][j] = 1; }
            else { T[i][j] = 0; }
        }
    }
   
    Gaussdet(A, T, C, size);

    deleteMtx(A, size); deleteMtx(T, size);
    deleteMtx(C, size);
}

Ответы (0 шт):