edutecnica

Esercizio 6        

Scrivere un programma per risolvere un sistema lineare non omogeneo di n equazioni in n incognite con n≤m=9.


Consideriamo per brevità un sistema lineare di 4 equazioni in 4 incognite.


In cui ogni equazione è scritta con le 4 incognite x,y,z,w e col termine noto a destra.
Formiamo ora:


il determinante dei coefficienti delle incognite

ottenuti sostituendo le colonne dei coefficienti delle incognite interessate con la colonna dei termini noti.

1] Se D≠0 il sistema ha un'unica soluzione:



2] Se D=0 e almeno uno dei Nx,Ny,Nz, e Nw ≠0 il sistema non ha soluzione: il sistema è impossibile perche ad esempio, se D=0 e Nx≠0, la D·x=Nx porta ad una contraddizione.


3] Se D=0 e almeno uno dei Nx,=Ny=Nz=Nw=0 il sistema può avere e può non avere soluzione. Un sistema che ha un numero infinito di soluzioni è chiamato indeterminato
..

Ovviamente per risolvere questo problema possiamo avvalerci dell'algoritmo precedentemente creato; quello per il calcolo del determinante, faremo, inoltre uso di una ulteriore funzione che chiamiamo sistema che si occuperà di gestire i tre casi precedenti.

iimport java.io.*;
class soluzioneSistema {
static final int m=9;// ordine della matrice
public static void main (String args []) throws IOException {
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
//M matrice dei coefficienti K vettore colonna dei termini noti
//S vettore delle soluzioni

double M[][]= new double[m][m];
double K[]= new double[m];
double S[]= new double[m+1];
int no,r,c;//r=righe c=colonne
do{
    System.out.print("ordine:");
    no=Integer.parseInt(h.readLine().trim());
}while(no > 9 || no < 1);

for(r=0;r < no;r++){//caricamento
     for(c=0;c < no;c++){
          System.out.print("riga:"+(r+1)+" col:"+(c+1)+"=");
          M[r][c]=Double.parseDouble(h.readLine().trim());
     }//fine for c
System.out.print("termine noto riga:"+(r+1)+"=");
K[r]=Double.parseDouble(h.readLine().trim());
}//fine for r
//iniz.S (vettore delle soluzioni)
for(c=0;c < m+1;c++)S[c]=0;
sistema(no,M,K,S);
if(S[m]==3)System.out.println("indeterminato");
else if(S[m]==2)System.out.println("impossibile");
else {
     System.out.println("soluzioni:");
     for(c=0;c < no;c++)System.out.print(S[c]+" ");
}//fine if-else-if
}//fine main _____________________

static void sistema(int num,double T[][], double V[],double S[]){
int c,i,j,sol=0;
double N[][]= new double[m][m];//Nx,Ny,....
double detN[]= new double[num];//cont. i determinanti Nx,Ny,....
double D=det(num,T);

for(c=0;c < num;c++){
     for(i=0;i < num;i++)
          for(j=0;j < num;j++)N[i][j]=T[i][j];
     for(i=0;i < num;i++)N[i][c]=V[i];
     detN[c]=det(num,N);
     if(D!=0){
          S[c]=(double)detN[c]/D;
          if(S[c]!=0)sol=1;
     }
}//fine for c
if(D==0 && sol==0)S[m]=3;// indeterminato
else if(D==0 && sol!=0)S[m]=2;//impossibile
else S[m]=1;//possibile
}//fine sistema__

static double det(int n, double T[][]){
int i,j,ic,jc,c=0;
double determinante=0;
double t[][]= new double[m][m];

if(n==1) return T[0][0];
if(n==2) return (T[0][0]*T[1][1] - T[0][1]*T[1][0]);
for(c=0; c < n; c++){//matrice dei minori
     ic=0;
     for(i=1; i < n; i++){
          jc=0;
          for(j=0; j < n; j++){
               if(j == c) continue;
               t[ic][jc] = T[i][j];
               jc++;
          }//fine for j
          ic++;
     }//fine for i
     determinante+= Math.pow(-1, c) * T[0][c] * det(n-1,t);
}//fine for c
return determinante;
}//fine det
}// fine classe

L'input di questo programma è gestito dalla classe BufferedReader invece che con la classe Scanner, ma cambia poco.