Неправильный обратный ход в матрице
Проблема в 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);
}