|
Метод Гаусса для обращения матриц
//чтобы найти обратную матрицу, необходимо решить матричное уравнение 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
почерпнул много нового
|
|