некорректно работает вычитание матриц
У меня почему то неправильно выполняется разность матриц , начиная с "проверки" , в AX-B должен получится ноль , а в AA^(-1) и A^(-1)*A единичная матрица , если ошибка в функции то помогите найти ее , без понятия что неправильно P.S в цикле расчета обратной матрицы ошибок нет , проверял , выводил , получалась единичная и обратная ПОМОГИТЕ ПОЖАЛУЙСТА , уже час не пойму в чем проблема((((
#include <iostream>
#include <math.h>
#include <ctime>
#include <iomanip>
using namespace std;
#define clean system("cls");
#define next cout<<endl;
void Razmtx(double** A, double** B, double** C, int size)//вычисление суммы матриц
{
for (int i = 0; i < size; i++) {// результат суммирования матриц в новую матрицу
for (int j = 0; j < size; j++)
{
C[i][j] = A[i][j] - B[i][j];
}
next
}
}
void Multimass(double **T,double **B,double **X,int size,int size1)
{
for (int i = 0; i < size; i++) {
for (int j = 0; j <size1; j++)
{
X[i][j] = 0;
for (int k = 0; k < size; k++)
{
X[i][j] += T[i][k] * B[k][j];
}
}
}
}
void Showmtx(double **A,int size,int size1)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size1; j++)
{
cout << fixed << setprecision(4) << setw(8) << A[i][j] << " ";
}
next
}
}
int Gaussmethod(double** A,double **B, double** T, int size)
{
double eps = 1e-10; int det = 1;
double** A1 = new double* [size];//копия матрицы А
for (int i = 0; i < size; i++)
{
A1[i] = new double[size];
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
A1[i][j] = A[i][j];
}
}
double** B1 = new double* [size];//копия матрицы В
for (int i = 0; i < size; i++)
{
B1[i] = new double[1];
}
double** X = new double* [size];//матрица X(матрица решений)
for (int i = 0; i < size; i++)
{
X[i] = new double[1];
}
cout << "A=" << endl; Showmtx(A, size, size);
cout << "T=" << endl; Showmtx(T, size, size);
for (int i = 0; i < size; i++)
{
int imax = i;
for (int j = 0; j < size; j++) { if (fabs(A[j][i]) > fabs(A[imax][i])) imax = j; }
if (fabs(A[imax][i] < eps)) { cout << "det(A)=0;Ending the programm"; return 0; }
if (i != imax)
{
for (int j = 0; j < size; j++) { swap(A[i][j], A[imax][j]); swap(T[i][j], T[imax][j]); }
}
double t = A[i][i];
det *= t;
for (int j = 0; j < size; j++)
{
A[i][j] /= t; T[i][j] /= t;
}
for (int j = 0; j < size; j++)
{
if (j == i) continue;
for (int k = 0; k < size; k++)
{
A[j][k] -= A[i][k] * A[j][i]; T[j][k] -= T[i][k] * T[j][i];
}
}
}
cout << "obratnya mtx posle" << endl;
Showmtx(T, size, size); next
cout << "osnovnaya posle" << endl;
Showmtx(A, size, size); next
cout << "X=A^(-1)*B" << endl;
Multimass(T, B, X, size, 1); next
cout << "T=" << endl; Showmtx(T, size, size); next
cout << "B=" << endl; Showmtx(B, size, 1); next
Multimass(T, B, X, size, 1); next
cout << "X=" << endl; Showmtx(X, size, 1); next
cout << "A*X=" << endl;
cout << "A=" << endl;
Showmtx(A1, size, size); next
cout << "X" << endl;
Showmtx(X, size, 1); next
Multimass(A1, X, B1, size, 1);
cout << "B1=" << endl;
Showmtx(B1, size, 1); next
cout << "A*X-B" << endl;
cout << "B1=" << endl;
Showmtx(B1, size, 1); next
cout << "B=" << endl;
Showmtx(B, size, 1); next
Razmtx(B1, B, B1, size);
Showmtx(B1, size, 1); next
cout << "A*A^(-1)" << endl;
cout << "A1=" << endl;
Showmtx(A1, size, size); next
cout << "T=" << endl;
Showmtx(T, size, size); next
Multimass(A1, T, A, size, size);
cout << "A^(-1)*A" << endl;
cout << "T=" << endl;
Showmtx(T, size, size); next
cout << "A=" << endl;
Showmtx(A, size, size); next
Multimass(T, A1, A, size, size);
return 0;
}
int main()
{
setlocale(LC_ALL, "rus");
int size; int choice;
cout << "\t\t\t\tВведите размерность матрицы" << endl;
cin >> size;
srand(time(NULL));
double** A = new double* [size];//матрица A(матрица size * size)
for (int i = 0; i < size; i++)
{
A[i] = new double[size];
}
double** B = new double* [size];//матрица B(матрица size * 1)
for (int i = 0; i < size; i++)
{
B[i] = new double[1];
}
double** T = new double* [size];//матрица T(единичная)
for (int i = 0; i < size; i++)
{
T[i] = new double[size];
}
cout << "Ввод значений матрицы А и В \n1)Автоматически\n2)Вручную" << endl;
cin >> choice;
switch (choice)
{
case 1:
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
{
A[i][j] = rand() % 20;
}
next;
}
for (int i = 0; i < size; i++)
{
B[i][0] = rand() % 20;
}
break;
}
case 2:
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << "A[ " << i << "," << j << " ]= ";
cin >> A[i][j];
}
}
for (int i = 0; i < size; i++)
{
cout << "B[" << i << "][" << 0 << "]= "; cin >> B[i][0];
}
next
break;
}
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (i == j) { T[i][j] = 1.0; }
else { T[i][j] = 0.0; }
}
}
Gaussmethod(A,B,T,size);
return 0;
}