next up previous   
Next: Calcolo degli Autovalori di una matrice Up:Introduzione  Previous: Indice
Intro Gen: Introduzione Generale  Home: Home page

Algebra.m

 

% RISOLUZIONE DI SISTEMI LINEARI E FATTORIZZAZIONI DI MATRICI

 

help algebra;

dom=0;

while dom==0

   clear;

   dom=0;

   disp('Scegli il problema da risolvere : ');

   err=0;

   while err==0

         disp('1. Calcolo di fattorizzazioni di matrici');

         disp('2. Risoluzione di sistemi lineari');

         s=input('Introduci il numero corrispondente : ');

         if s~=1 & s~=2

            disp('Il valore introdotto é errato.Ricomincia');

         else

            err=1;

         end

   end

   if s==1

      A=input('Introduci la matrice da fattorizzare : ');

   else

      A=input('Introduci la matrice dei coefficienti : ');

   end

   err=0;

   while err==0

         [m,n]=size(A);

         if m<n

            disp('Il numero di righe deve essere maggiore o uguale a quello delle colonne');

            A=input('Introducila nuovamente : ');

         else

            err=1;

         end

   end                                                   % verifica del tipo di matrice :

   if n~=m                                         

      quadrata=0;

   else                                                  % se é quadrata;

      quadrata=1;

   end

   rango=rank(A);

   if rango<n

      singolare=1;

   else                                                  % se é singolare;

      singolare=0;

   end

   if singolare==0 & quadrata==1

      i=1;

      tridiagonale=1;

      while i<=n

          j=1;

          while j<=n

           if j~=i & j~=i-1 & j~=i+1                     % se é triangolare;          

              if A(i,j)~=0

                 tridiagonale=0;

                 j=n;

                 i=n;

              end

           end

           j=j+1;

          end

          i=i+1;

      end

      i=1;

      jac=1;

      while i<=n

            if A(i,i)==0                                  % se ha gli elementi della diagonale non nulli;

               jac=0;

               i=n;

            end

            i=i+1;

      end

      i=1;

      simmetrica=1;

      while i<=n

          j=1;

          while j~=i & j<=n

                if A(i,j)~=A(j,i)

                   simmetrica=0;                          % se é simmetrica;

                   j=n;

                   i=n;

                end

                j=j+1;

          end

          i=i+1;

      end

      i=1;

      if simmetrica==1

         defpos=1;

         while i<n

               if det(A(1:i,1:i))<=0                      % se é simmetrica definita positiva;

                  defpos=0;

                  i=n;

               end

               i=i+1;

         end

      else

         defpos=0;

      end

   else

      simmetrica=0;

      defpos=0;

      jac=0;

      tridiagonale=0;

   end

   if s==1        

      disp('Scegli il tipo di fattorizzazione : ');

      if singolare==1 | quadrata==0

         disp('1. Fattorizzazione LU (non applicabile per questo tipo di matrice)');

      else   

         disp('1. Fattorizzazione LU');

      end

      disp('2. Fattorizzazione QR');

      if defpos==0 | quadrata==0

         disp('3. Fattorizzazione di Cholesky (non applicabile per questo tipo di matrice)');

      else

         disp('3. Fattorizzazione di Cholesky ');

      end

      fatt=input('Introduci il numero corrispondente : ');

      err=0;

      while err==0

            if (fatt~=1 & fatt~=2 & fatt~=3)|(fatt==1 & (singolare==1 | quadrata==0))...

               |(fatt==3 & (defpos==0 | quadrata==0))

               fatt=input('Il valore introdotto é errato.Introducilo di nuovo : ');

            else

               err=1;

            end

      end                                                 % Fattorizzazioni di matrici

      if fatt==1

         disp('Scegli il metodo di calcolo della fattorizzazione LU : ');

         disp('1. Utilizzando il metodo di eliminazione di Gauss');

         disp('2. Utilizzando la dimostrazione del teorema di esistenza ed unicità della fattorizzazione ');

         disp('3. Tecnica compatta');

         disp('4. Metodo di Doolittle');

         if simmetrica==0

            disp('5. Metodo per matrici simmetriche (non applicabile in questo caso)');

         else

            disp('5. Metodo per matrici simmetriche');

         end

         if tridiagonale==0

            disp('6. Metodo per matrici tridiagonali (non applicabile in questo caso)');

         else

            disp('6. Metodo per matrici tridiagonali');

         end

         metlu=input('Introduci il numero corrispondente : ');

         err=0;

         while err==0

               if (metlu~=1 & metlu~=2 & metlu~=3 & metlu~=4 & metlu~=5 & metlu~=6)|...

                  (metlu==5 & simmetrica==0)|(metlu==6 & tridiagonale==0)

                  metlu=input('Il valore introdotto é errato.Introducilo di nuovo : ');

               else

                  err=1;

               end

         end

         if metlu==1

            [L,U,risp]=lugauss(A,n);                         % Metodo di eliminazione di Gauss

         end

         if metlu==2

            [L,U,risp]=ludimost(A,n);                        % Utilizzando la dimostrazione

         end

         if metlu==3

            [L,U,risp]=lucompat(A,n);                        % Tecnica compatta

         end

         if metlu==4

            [L,U,risp]=ludoolit(A,n);                        % Metodo di Doolittle

         end

         if metlu==5

            fc=0;

            [L,U,C,risp,r]=lusimm(A,n,fc);                   % Metodo per matrici simmetriche

            if r==1

               disp('La matrice di Cholesky di A é :');

               C

            end     

         end

         if metlu==6

            [L,U,risp]=lutrid(A,n);                          % Metodo per matrici tridiagonali

         end    

         if risp==0

            disp('la fattorizzazione LU della matrice : ');

            disp(A);

            disp('é la seguente : ');

            L

            U

            dom=1;

         else 

            disp('La fattorizzazione LU per questa matrice non si può ottenere ');

            err=0;

            while err==0

                  disp('Scegli tra : ');

                  disp('1. Calcolare la fattorizzazione QR');

                  disp('2. Uscire dal programma');

                  s2=input('Introduci il numero corrispondente : ');

                  if s2~=1 & s2~=2

                     disp('Il valore introdotto é errato.Ricomincia');

                  else

                     err=1;

                  end

            end

            if s2==1

               fatt=2;

            else

               dom=1;

            end

         end  

      end

      if fatt==2

         [Q,R,risp]=fattqr(A,m,n);

         if risp==0

            disp('la fattorizzazione QR della matrice : ');

            disp(A);                                           % Fattorizzazione QR

            disp('é la seguente : ');

            Q

            R

         else

            disp('La fattorizzazione QR non si può ottenere');

            disp('Ricomincia e utilizza un altro metodo.');

         end

         dom=1;

      end

      if fatt==3

         disp('Scegli il metodo di calcolo della fattorizzazione di Cholesky : ');

         err=0;

         while err==0

               disp('1. Tecnica compatta');                    % Fattorizzazione di Cholesky                  

               disp('2. Metodo di Doolittle');

               s2=input('Introduci il numero corrispondente : ');

               if s2~=1 & s2~=2

                  disp('Il valore introdotto é errato.Ricomincia');

               else

                  err=1;

               end

         end 

         if s2==1

            L=chocomp(A,n);                                 

         else

            L=chodool(A,n);

         end

         disp('La matrice di Cholesky della matrice : ');

         disp(A);

         disp('é la seguente : ');

         L

         dom=1;

      end

   end

   if s==2 & singolare==0                                      % Risoluzione di sistemi lineari

      dom=1;

      b=input('Introduci il vettore colonna  : ');

      err=0;

      while err==0

            [o,h]=size(b);

            if o~=m | h~=1

               disp('Il vettore introdotto ha dimensioni errate.Ricomincia');

               b=input('Introduci nuovamente il vettore colonna  : ');

            else

               err=1;

            end

      end

      if quadrata==1

      if b==zeros(m,1)

        disp('L''unica soluzione é il vettore nullo');

      else

         disp('Scegli il metodo di risoluzione : ');

         err2=0;

         risp2=0;

         while err2==0

           disp('Utilizzare :');

           if risp2==0

              disp('1. - Il metodo di eliminazione Gauss');

           else

              disp('1. - Il metodo di eliminazione Gauss (Non applicabile in questo caso)');

           end

           disp('2. - La strategia di pivoting parziale nel metodo di eliminazione di Gauss');

           disp('3. - La strategia di pivoting totale nel metodo di eliminazione di Gauss');

           disp('4. - La fattorizzazione delle matrici');

           if jac==0

disp('5. - Metodo di Jacobi (Non applicabile in questo caso.Fare un opportuno scambio di righe)');

           else

disp('5. - Metodo di Jacobi ');

           end

           if defpos==1

              disp('6. - Metodo di più ripida discesa');

           else

              disp('6. - Metodo di più ripida discesa (non applicabile per questo tipo di matrici)');

           end

           sist=input('Introduci il numero corrispondente : ');

           err=0;

           while err==0

              if (sist~=1 & sist~=2 & sist~=3 & sist~=4 & sist~=5 & sist~=6)|(sist==1 & risp2==1)|...

                 (sist==5 & jac==0)|(sist==6 & defpos==0)

                 sist=input('Il valore introdotto é errato.Introducilo di nuovo : ');

              else

                 err=1;

              end

           end

           if sist==1                                          % Metodo di eliminazione Gauss

              [x,risp]=gauss(A,b,n);

              if risp==0

                 disp('Il vettore soluzione del sistema lineare é : ');

                 x

                 err2=1;

              else

                 disp('Metodo non applicabile ');

                 disp('Utilizzare le strategie di pivoting oppure la fattorizzazione QR ');

                 risp2=1;

              end

           end

           if sist==2                                          % Strategia di pivoting parziale

              x=lupivpar(A,b,n);

              disp('Il vettore soluzione del sistema lineare é : ');

              x

              err2=1;

           end

           if sist==3                                          % Strategia di pivoting totale

              x=lupivtot(A,b,n);

              disp('Il vettore soluzione del sistema lineare é : ');

              x

              err2=1;

           end

           if sist==4                                          % La fattorizzazione delle matrici

              disp('Scegli il tipo di fattorizzazione : ');

              if risp2==1

                 disp('1.Fattorizzazione LU (non applicabile in questo caso)');

              else   

                 disp('1. Fattorizzazione LU');

              end  

              disp('2. Fattorizzazione QR');

              if defpos==0

                 disp('3. Fattorizzazione di Cholesky (non applicabile in questo caso)');

              else

                 disp('3. Fattorizzazione di Cholesky ');

              end

              sistf=input('Introduci il numero corrispondente : ');

              err=0;

              while err==0

                 if (sistf~=1 & sistf~=2 & sistf~=3 & sistf~=4) | (sistf==1 & risp2==1) |...

                    (sistf==3 & defpos==0)

                    sistf=input('Il valore introdotto é errato.Introducilo di nuovo : ');

                 else

                    err=1;

                 end

              end

              if sistf==1                                      % Utilizzando la fattorizzazione LU

                 if tridiagonale==1                            % più conveniente

                    [L,U,risp]=lutrid(A,n);

                 else

                    if simmetrica==1

                       fc=1;

                       [L,U,C,risp,r]=lusimm(A,n,fc);

                    else

                       [L,U,risp]=ludoolit(A,n);

                    end

                 end

                 if risp==0 & tridiagonale==1

                    z(1)=b(1);

                    for i=2:n

                        z(i)=b(i)-L(i,i-1)*z(i-1);

                    end

                    x(n)=z(n)/U(n,n);

                    for i=n-1:-1:1

                        x(i)=(z(i)-U(i,i+1)*x(i+1))/U(i,i);

                    end

                 end

                 if risp==0 & tridiagonale==0

                    x=lurisol(L,U,b,n);

                 end

                 if risp==0

                    disp('Il vettore soluzione del sistema lineare é : ');

                    x

                    err2=1;                   

                 else

                    disp('Metodo non applicabile ');

                    disp('Utilizzare le strategie di pivoting oppure la fattorizzazione QR ');

                    risp2=1;

                 end

              end

              if sistf==2                                       % Utilizzando la fattorizzazione QR   

                 [x,a,risp]=minquad(A,b,m,n);

                 disp('Il vettore soluzione del sistema lineare é : ');

                 x

                 err2=1;        

              end

              if sistf==3                                       % Utilizzando la fattorizzazione di Cholesky

                 L=chodool(A,n);

                 disp('Il vettore soluzione del sistema lineare é : ');

                 x=lurischo(L,b,n)

                 err2=1;   

              end               

           end

           if sist==5                                          

              [x,risp]=jacobi(A,b,n);                           % Metodo di Jacobi

              if risp==0

                 disp('Il vettore soluzione del sistema lineare é : ');

                 x=x';

                 x

                 err2=1;

              else 

                 disp('Metodo non applicabile perché non convergente');

                 disp('Utilizzare altri metodi');

              end

           end

           if sist==6                                           % Metodo di più ripida discesa 

              e=input('Introduci l''errore massimo che si può commettere (al massimo 0.1) : ');

              err=0;

              while err==0

                    if e>0.1 | e<=0

                       disp(' Il valore dell''errore massimo introdotto non é corretto');

                       e=input('Introducilo nuovamente : ');

                    else

                       err=1;

                    end 

              end

              disp('Il vettore soluzione del sistema lineare é : ');

              x=meripdis(A,b,n,e)

              err2=1;

           end

         end

      end

      else

         B=A;

         B(1:m,n+1)=b;

         if rank(B)==n+1

            disp('Il sistema non ammette soluzioni');

            disp('Verrà calcolata quindi la soluzione di minima norma ');

            disp('utilizzando il problema dei minimi quadrati ');

            [x,a,risp]=minquad(A,b,m,n);

            disp('la soluzione ai minimi quadrati é :');

            x

            disp('dove il vettore residuo ha norma 2 pari a : ');

            a

         else

            [x,a,risp]=minquad(A,b,m,n);

            disp('la soluzione é :');

            x                      

         end

      end

   end

   if s==2 & singolare==1                                        % caso di matrice singolare

 disp('Il sistema non si può risolvere perché la matrice dei coefficienti non ha rango massimo');

      disp('Infatti ha rango :');

      rango

      dom=1;

   end

   if dom==1

      fine=input('Se vuoi ricominciare nuovamente premi il tasto ''1'' :');

      if fine==1

         dom=0;

      end

   end

end

 


next up previous   
Next: Calcolo degli Autovalori di una matrice Up:Introduzione  Previous: Indice
Intro Gen: Introduzione Generale  Home: Home page
Vito Marinelli
8-5-2000

HyperCounter
BPath Contatore