package inverse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Inverse {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int n,i,j;
double[][] A;
double[][] Ai;
double[][] B;
double[][] X;
double s,t;
String str=new String();
String esc=new String();
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
do
{
System.out.println("Odwracanie macierzy");
System.out.println();
System.out.print("Podaj rozmiar macierzy n=");
str=stdin.readLine();
n=Integer.parseInt(str);
A=new double[n+1][2*n+1];
Ai=new double[n+1][n+1];
B=new double[n+1][2];
X=new double[n+1][2];
for(i=1;i<=n;i++)
{
System.out.println("Wprowadź "+i+"-ty wiersz macierzy ");
for(j=1;j<=n;j++){
str=stdin.readLine();
A[i][j]=Double.parseDouble(str);
}
str=stdin.readLine();
B[i][1]=Double.parseDouble(str);
}
macierzOdwrotna(A,n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
Ai[i][j]=A[i][n+j];
iloczynMacierzy(Ai,B,X,n,n,1);
for(i=1;i<=n;i++)
{
for(j=n+1;j<=2*n;j++)
System.out.print(A[i][j]+" ");
System.out.println();
}
System.out.println();
for(i=1;i<=n;i++)
System.out.println("X["+i+"]="+X[i][1]);
System.out.println();
System.out.println("Czy chcesz kontynuować");
esc=stdin.readLine();
}
while(!esc.equals("Nie"));
}
public static void iloczynMacierzy(double[][] A,double[][] B, double[][] C,int w1,int k1w2,int k2)
{
int i,j,k;
double Sum;
for(i=1;i<=w1;i++)
for(j=1;j<=k2;j++)
{
Sum=0;
for(k=1;k<=k1w2;k++)
Sum+=A[i][k]*B[k][j];
C[i][j]=Sum;
}
}
public static void macierzOdwrotna(double[][] A,int n){
int i,j,k,m;
double s,t;
for(i=1;i<=n;i++)
for(j=n+1;j<=2*n;j++)
if(i==j-n) A[i][j]=1;
else A[i][j]=0;
for(i=1;i<=n;i++)
{
s=A[i][i];
for(j=1;j<=2*n;j++)
A[i][j]=A[i][j]/s;
for(j=i+1;j<=n;j++)
{
t=A[j][i];
for(k=i;k<=2*n;k++)
A[j][k]-=A[i][k]*t;
}
}
for(k=n+1;k<=2*n;k++)
{
for(i=n;i>=1;i--)
{
s=A[i][k];
for(j=i+1;j<=n;j++)
s-=A[i][j]*A[j][k];
A[i][k]=s;
}
}
}
}
Jak dopisać wybór elementu głównego w funkcji odwracającej macierz ?
Bez tego wyboru gdy na diagonali wystąpi zero to będziemy mieli dzielenie przez zero
nawet dla macierzy odwracalnej