Вы здесь

Метод Гаусса.Нахождение (вычисление) обратной матрицы

Исходный код на C++: 

Теория

Для нахождения обратной матрицы методом Гаусса воспользуемся уравнением A*X=E, где: X обратная матрица матрицы A, а E — единичная матрица. Приведём матрицу A к треугольной при помощи алгоритма Гаусса «прямой ход» (более подробно смотрите «Метод Гаусса. Решение систем линейных уравнений»). Параллельно подобные операции совершаем с единичной матрицей E. Представим полученное уравнение в развёрнутом виде (рис. 1).


рис. 1.Нахождение обратной матрицы Гаусса.

Исходя из уравнения (рис.1), выразим значения обратной матрицы X. Умножая последнюю строку матрицы A на первый столбец матрицы X, получим следующее равенство 0*X11+0*X21+0*X31+0*X41+...+Ann*Xn1=En1, отсюда выразим Xn1=En1/Ann. Аналогично получим из следующего уравнения 0*X11+0*X21+0*X31+...+A(n-1)(n-1)*X(n-1)(1)+A(n-1)(n)*X(n)(1)=E(n-1)(1), выразим значение X(n-1)(1)=E(n-1)(1)/A(n-1)(n-1)-Xn1*A(n-1)(n)/A(n-1)(n-1) и т.д. Данную операцию назовём «обратный ход нахождения элементов обратной матрицы X». Пользуясь формулой (рис. 2), нетрудно подсчитать все элементы матрицы X.


Рис. 2.Вычисление обратной матрицы. Обратный ход нахождения элементов обратной матрицы X.

Программная реализация

int gaus_obr(int cnt_str,double **mass,double **&M_obr)
{
int i,j,k;
//создание единичной матрицы
M_obr=new double* [cnt_str];
for(i=0;i<cnt_str;i++)
{
M_obr[i]=new double [cnt_str];
for(j=0;j<cnt_str;j++)M_obr[i][j]=0;
M_obr[i][i]=1;
}
//прямой ход методом Гаусса
double a,b;
for(i=0;i<cnt_str;i++)
{
a=mass[i][i];
for(j=i+1;j<cnt_str;j++)
{
b=mass[j][i];
for(k=0;k<cnt_str;k++)
{
mass[j][k]=mass[i][k]*b-mass[j][k]*a;
M_obr[j][k]=M_obr[i][k]*b-M_obr[j][k]*a;
}
}
}
//обратный ход вычисления элементов обратной матрицы
double sum;
for(i=0;i<cnt_str;i++)
{
for(j=cnt_str-1;j>=0;j--)
{
sum=0;
for(k=cnt_str-1;k>j;k--)
sum+=mass[j][k]*M_obr[k][i];
if(mass[j][j]==0)
{
for(i=0;i<cnt_str;i++)
delete []M_obr[i];
delete []M_obr;
return 0;
}
M_obr[j][i]=(M_obr[j][i]-sum)/mass[j][j];
}
}
return 1;
}