Предлагам на този, който се интересува следния java код за намиране на обратната матрица на дадена матрица. Това е само работеща версия. Функциите могат да се напишат и по-четливо. (например детерминанта на матрица от 3ти ред да се смята във функцията determinanta(double[][] mtx)).
Използван е методът на адюнгираните количества (от учебника по ЛААГ издаден от Пловдивско Университетско Издателство) вместо този на Гаус-Жордан, защото елементите на матриците, които използвам са в интервала (0, 1] и има риск при закръгляне по метода на Гаус-Жордан да се получи голяма бъркотия.
Методът смята само обратната матрица на матрици nxn, n>3.
class Aminus1
{
public static double adiungiranoKolichestvo(int i1, int j1, double[][] mtx1)
{
int koef1;
if(((i1+j1)%2)==0) koef1 = 1;
else koef1 = -1;
return koef1*adiungiranMinor(i1,j1,mtx1);
}
public static double adiungiranMinor(int i, int j, double[][] mtx)
{
double toBeReturned = 0;
int koef;
boolean greshka = false;
//матрица на която ще търся адюнгиран минор
/* System.out.println("Това е матрицата на която ще търся адюнгиран минор:");
for(int c=0; c<mtx.length; c++)
{
for(int d=0; d<mtx.length; d++)
{
System.out.print(mtx[c][d]);
System.out.print(" ");
}
System.out.println("");
}*/
//проверявам дали индексите са коректни
if(i<0) greshka = true;
if(j<0) greshka = true;
if(i>=mtx.length) greshka = true;
if(j>=mtx.length) greshka = true;
if(greshka) System.out.println("някой от индексите не е коректен!");
double[][] minor = new double[mtx.length-1][mtx.length-1];
//следващото инициализира матрицата от n-1 ред
for(int k=0; k<minor.length; k++)
for(int l=0; l<minor.length; l++)
{
if((k<i)&&(l<j)) minor[k][l] = mtx[k][l];
if((k<i)&&(l>=j)) minor[k][l] = mtx[k][l+1];
if((k>=i)&&(l<j)) minor[k][l] = mtx[k+1][l];
if((k>=i)&&(l>=j)) minor[k][l] = mtx[k+1][l+1];
}
//матрица от н-1 ред, която е без i,jтия елемент
/* System.out.println("Това е подматрицата без i,j-тия елемент:");
for(int e=0; e<minor.length; e++)
{
for(int f=0; f<minor.length; f++)
{
System.out.print(minor[e][f]);
System.out.print(" ");
}
System.out.println("");
}*/
//тук се пресмятат детерминанти
if(minor.length == 3)
{
/* System.out.println("на тази матрица 3х3 търся детерминанта:");
for(int a=0; a<3; a++)
{
for(int b=0; b<3; b++)
{
System.out.print(minor[a]);
System.out.print(" ");
}
System.out.println("");
}
System.out.println("");
System.out.println("междинна детерминанта:");
System.out.println(minor[0][0]*minor[1][1]*minor[2][2] +minor[1][0]*minor[2][1]*minor[0][2]+minor[0][1]*minor[1][2] *minor[2][0]-minor[2][0]*minor[1][1]*minor[0][2]-minor[1][0] *minor[0][1]*minor[2][2]-minor[2][1]*minor[1][2]*minor[0][0]);*/
return minor[0][0]*minor[1][1]*minor[2][2] +minor[1][0]*minor[2][1]*minor[0][2]+minor[0][1] *minor[1][2]*minor[2][0]-minor[2][0]*minor[1][1] *minor[0][2]-minor[1][0]*minor[0][1]*minor[2][2] -minor[2][1]*minor[1][2]*minor[0][0];
}
else
{
for(int k=0; k<minor.length; k++)
{
toBeReturned += minor[0][k]*adiungiranoKolichestvo(0,k,minor);
}
return toBeReturned;
}
}
public static double determinanta(double[][] mtx)
{
double toBeReturned = 0;
int koef;
if(mtx.length != mtx[0].length)
{
System.out.println("детерминанта на матрица mxn, m!=n");
//това не е много коректно, тъй като детерминантата не е 0
return 0;
}
else
{
for(int i=0; i<mtx.length; i++)
{
toBeReturned += mtx[0]*adiungiranoKolichestvo(0,i,mtx);
}
}
return toBeReturned;
}
public static void main(String[] args)
{
int dimension = 5;
double det = 0;
double[][] mymtx = new double[dimension][dimension];
double[][] mymtxMinus1 = new double[dimension][dimension];
//инициализация - инициализират се елементите на матрицата
/* for(int i=0; i<dimension; i++)
for(int j=0; j<dimension; j++)
{
if(i==j) mymtx[j] = 10;
else mymtx[j] = 0;
}*/
mymtx[0][0] = 1;
mymtx[0][1] = 2;
mymtx[0][2] = 1;
mymtx[0][3] = 1;
mymtx[0][4] = 2;
mymtx[1][0] = 3;
mymtx[1][1] = 1;
mymtx[1][2] = 1;
mymtx[1][3] = 1;
mymtx[1][4] = 1;
mymtx[2][0] = 1;
mymtx[2][1] = 1;
mymtx[2][2] = 1;
mymtx[2][3] = 1;
mymtx[2][4] = 0;
mymtx[3][0] = 0;
mymtx[3][1] = 1;
mymtx[3][2] = 2;
mymtx[3][3] = 0;
mymtx[3][4] = 1;
mymtx[4][0] = 1;
mymtx[4][1] = 0;
mymtx[4][2] = 0;
mymtx[4][3] = 0;
mymtx[4][4] = 1;
//коя е матрицата на която ще търся обратната матрица
for(int i=0; i<dimension; i++)
{
for(int j=0; j<dimension; j++)
{
System.out.print(mymtx[j]);
System.out.print(" ");
}
System.out.println("");
}
//тук пресмятам детерминанта
System.out.println("детерминантата на A е:");
det = determinanta(mymtx);
System.out.println(det);
System.out.println("");
System.out.println("обратната матрица на A е:");
for(int i=0; i<dimension; i++)
for(int j=0; j<dimension; j++)
{
mymtxMinus1[j] = adiungiranoKolichestvo(j, i, mymtx)/det;
}
//извеждане на резултата
for(int i=0; i<dimension; i++)
{
for(int j=0; j<dimension; j++)
{
System.out.print(mymtxMinus1[j]);
System.out.print(" ");
}
System.out.println("");
}
System.out.println("");
}
}