Здравствуйте, Сушко Василий!
Несколько переделал Ваш код:
1) В первом расчете сначала копирую матрицу в MR, затем рекурсивно ее же и обрабатываю
В результате получаем в верхнем треугольнике с диагональю - матрицу U,
в нижнем, без единичной диагонали, матрицу L
Осталось только сформировать эти две матрицы (рекурсия здесь уже не нужна)
2) Второй расчет сделал на основе вот этой
теорииДобавил только обнуление необходимых элементов и задание для L диагональных единичных элементов
3) Расчет длительности сделал на основе performance
[code h=200]#include <windows.h> ;для performance
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int k = 0;
//переменные для расчета длительности
struct performance
{
_LARGE_INTEGER start;
_LARGE_INTEGER stop;
_LARGE_INTEGER frequency;
};
#define Start(perf) QueryPerformanceCounter(&perf.start)
#define Stop(perf) QueryPerformanceCounter(&perf.stop)
//запрос частоты
bool QueryPerfCounter(performance * perf)
{
return (0 != QueryPerformanceFrequency(&perf->frequency));
}
//длительность в мкс
double Duration(performance * perf)
{
return (((double)(perf->stop.QuadPart - perf->start.QuadPart) * 1.0e6 /
(double) perf->frequency.QuadPart));
}
void functionForTheMatrixMRekurs(double **M, int n) //recursive function of the matrix M
{
if (k != (n - 1)) // проверка на количесвто вызово рекурсии
{
for (int i = k + 1; i < n; i++) {
M[i][k] /= M[k][k]; //вычисляються элементы стоящие на строке равной номеру вызова рекурсии
for (int j = k + 1; j < n; j++)
M[i][j] -= M[i][k] * M[k][j]; //вычисление элементов стоящих на позициях i j используя элементы стоящие на позициях i j k
}
} else // если количество вызово рекурсии превышает количество строк в матрице значит всё вычислили и выходим из функции
return;
k++; //счётчик рекрсии
functionForTheMatrixMRekurs(M, n); //рекурсивный вызов функции
}
void functionForTheMatrixL(double **L, int n, double **M)
{
int i, j;
for(i=0; i<n; i++)
{
for (j=0; j < n; j++)
{
if (i == j)
L[i][j] = 1;
else if (i < j)
L[i][j] = 0;
else
L[i][j] = M[i][j];
}
}
}
void functionForTheMatrixU(double **U, int n, double **M)
{
int i, j;
for(i=0; i<n; i++)
{
for (j=0; j < n; j++)
{
if (i > j)
U[i][j] = 0;
else
U[i][j] = M[i][j];
}
}
}
void functionForTheMatrixL_and_U(double **A, int n, double **L, double **U) //function matrix for the calculation of M and L
{
int i, j, k;
for (j = 0; j < n; j++)
{
U[0][j] = A[0][j]; //первая строка U равна первой строки А
L[j][j] = 1; //единицы на диагональ L
}
for (i = 1; i < n; i++) //первый столбец L делится на первый элемент первой строки
L[i][0] = A[i][0] / U[0][0];
for (i = 1; i < n; i++) //для всех последующих надо учитывать предыдущий результат
{
for (j = 0; j < n; j++) //по столбцам
{
if (j < i)
U[i][j] = 0; //обнуляем нижний треугольник
else
{
U[i][j] = A[i][j]; //U(i,j) = A(i,j) - sum(L(i,k)*U(k,j)), k=0,...,i-1
for (k = 0; k < i; k++)
U[i][j] -= L[i][k] * U[k][j];
}
}
for (j = 0; j < i; j++) //элементы L выше диагонали = 0
L[j][i] = 0;
for (j = i+1; j < n; j++) //по строкам
{
L[j][i] = A[j][i]; //L(j,i) = [A(j,i) - sum(L(j,k)*U(k,i))] / U(i,i), k=0,...,i-1
for (k = 0; k < i; k++)
L[j][i] -= L[j][k] * U[k][i];
L[j][i] /= U[i][i];
}
}
}
void showMatrix(double **matrix, int n, int m)
{
int i, j;
cout.precision(4);
for (i = 0; i < n; i++) {
cout << endl;
for (j = 0; j < m; j++) {
cout << matrix[i][j] << "\t";
}
}
cout << endl;
}
int main()
{
performance perf;
int i, j;
double **A, **MR, **LR, **UR, **U, **L;
A = new double*[3];
MR = new double*[3];
LR = new double*[3];
UR = new double*[3];
L = new double*[3];
U = new double*[3];
for (i = 0; i < 3; i++)
{
A[i] = new double [3];
MR[i] = new double [3];
LR[i] = new double [3];
UR[i] = new double [3];
L[i] = new double [3];
U[i] = new double [3];
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++) // здесь мы вводим наши элементы
{
cin >> A[i][j];
MR[i][j] = A[i][j]; //сдублируем в MR
}
}
QueryPerfCounter(&perf);
Start(perf);
{
functionForTheMatrixMRekurs(MR, 3);
functionForTheMatrixL(LR, 3, MR);
functionForTheMatrixU(UR, 3, MR);
}
Stop(perf);
// Calculate time in mikroseconds
double d0 = Duration(&perf);
Start(perf);
{
functionForTheMatrixL_and_U(A, 3, L, U);
}
Stop(perf);
// Calculate time in mikroseconds
double d1 = Duration(&perf);
//вывод
showMatrix(A, 3, 3);
showMatrix(MR, 3, 3);
showMatrix(LR, 3, 3);
showMatrix(UR, 3, 3);
showMatrix(L, 3, 3);
showMatrix(U, 3, 3);
cout << "Recursive method: " << d0 << " mks" << endl;
cout << "Exception method: " << d1 << " mks" << endl;
for (i = 0; i < 3; i++)
delete [] A[i];
delete [] A;
for (i = 0; i < 3; i++)
delete [] MR[i];
delete [] MR;
for (i = 0; i < 3; i++)
delete [] LR[i];
delete [] LR;
for (i = 0; i < 3; i++)
delete [] UR[i];
delete [] UR;
for (i = 0; i < 3; i++)
delete [] U[i];
delete [] U;
for (i = 0; i < 3; i++)
delete [] L[i];
delete [] L;
return 0;
}[/code]