Численные методы
Численные методы
СЛАУ
Метод Гаусса
Метод Гаусса для обращения матриц
Метод Гаусса для вычисления определителя
Интегрирование
Метод прямоугольников
Метод трапеций
Метод Симпсона
Методы оптимизации
Поиск отрезка локализации
Алгоритм Свена
Одномерный поиск минимума
Метод дихотомии
Метод золотого сечения
Метод Фибоначчи
Двухмерный поиск минимума
Метод градиентов
Метод наискорейшего спуска
Метод Флетчера-Ривса
 
 
Главная
Определения
Ссылки
Поиск


Метод Гаусса для обращения матриц

//чтобы найти обратную матрицу, необходимо решить матричное уравнение AX = E, его можно представить //как n линейных систем Ax1=e1,...,Axn=en

//

#include "stdafx.h"

#include <iostream>

#include <math.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

const int n=2;

double

matr[n][n+1]={

1,2,1,//матрица, которую нужно обратить, последний столбец пока любой

3,4,0,

}, obrmatr[n][n],

y[n];

double par,sum;

double r[n];

int i,j,ii,J,k,jj,t=1;




for (J=0;J<n;J++)

{

for (i=0;i<n;i++)

{

if(i==J)matr[i][n]=1.0;//заполняем последний столбец соответствующим единичным вектором

else matr[i][n]=0.0;

}

//методом Гаусса находим решение системы

for (j=0;j<n-1;j++)

{

if (matr[j][j]==0)

{

ii=j+1;

do

{

if((matr[ii][j]!=0)||(ii==n-1))

{

break;

}

ii++;

}while(true);

if((matr[ii][j]==0)&&(ii==n-1))

{

t=0;

}

for(k=0;k<n;k++)

{

r[k]=matr[j][k];

matr[j][k]=matr[ii][k];

matr[ii][k]=r[k];

}

}

for (i=j+1;i<n;i++)

{

if(matr[i][j]!=0)

{

par=matr[i][j]/matr[j][j];

for (jj=j;jj<n+1;jj++)

{

matr[j][jj]=matr[j][jj]*par;

matr[i][jj]=matr[i][jj]- matr[j][jj];

matr[j][jj]=matr[j][jj]/par;

}

}

}

}


for (i=0;i<n;i++)

{

if (matr[i][i]==0)

{

t=0;

};

}

if (t!=0)

{

y[n-1]=matr[n-1][n]/matr[n-1][n-1];

for (i=n-2;i>=0;i--)

{

j=n-1;

sum=matr[i][j]*y[j];

for (j=n-2;j>0;j--)

{

if (j!=i)

{

sum=sum+matr[i][j]*y[j];

}

}

y[i]=(matr[i][n]-sum)/matr[i][i];

}

//записываем решение соответствующим столбцом

for(i=0;i<n;i++)

{

obrmatr[i][J]=y[i];

}

}

else

{

cout<<"opredelitel=0"<<endl;

break;

break;

}

}

//************************************************************************************

if (t!=0)

{

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

cout<<obrmatr[i][j]<<" ";

}

cout<<endl;

}

}

system("pause");

return 0;

}



Комментарии к тексту:

Имя:

Текст комментария:



PetroantaCh, 04-10-2011, 14:20:02
почерпнул много нового