Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi - Matrice.cs

Matrice.cs

Caricato da: Poggi Marco
Scarica il programma completo

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Sistema
  8. {
  9.     class Matrice:MRettangolare
  10.     {
  11.        
  12.  
  13.         public Matrice(int dimensione): base(dimensione, dimensione)
  14.         {
  15.            
  16.         }
  17.  
  18.         public Matrice(Matrice originale):base(originale.Righe, originale.Colonne)
  19.         {
  20.             int fine = vettore.Length;
  21.             for (int i = 0; i < fine; i++)
  22.                 vettore[i] = originale.vettore[i];  
  23.         }
  24.  
  25.         public Matrice() : this(3)
  26.         { }
  27.  
  28.         public int Dimensione
  29.         {
  30.             get
  31.             {
  32.                 return Righe;
  33.             }
  34.         }
  35.  
  36.      
  37.         public double Determinante()
  38.         {
  39.             // Calcolo del determinante mediantl l'algoritmo di Gauss Jordn.
  40.             if (Righe == 1)
  41.                 return vettore[0];
  42.             Matrice servizio = new Matrice(this);
  43.             double moltiplicatore,esito;
  44.             for (int i=0; i<Dimensione; i++)
  45.             {
  46.                 if (!servizio.CercaRigaNonNulla(i, out int nonNulla))
  47.                 {
  48.                     return 0.0;
  49.                 }
  50.  
  51.                 if (i != nonNulla)
  52.                 {
  53.                     servizio.ScambiaRighe(i, nonNulla);
  54.                 }
  55.  
  56.                 for (int j = i + 1; j < Righe; j++)
  57.                 {
  58.                     if (Math.Abs(servizio[j, i]) > 1e-100)
  59.                     {
  60.                         moltiplicatore = servizio[j, i] / servizio[i, i];
  61.                         for (int l=i; l<Righe; l++)
  62.                         {
  63.                             servizio[j, l] = servizio[j, l] - moltiplicatore * servizio[i, l];
  64.                         }
  65.                     }
  66.                 }
  67.             }
  68.             esito = 1.0;
  69.             for (int i = 0; i < Righe; i++)
  70.                 esito *= servizio[i, i];
  71.             return esito;
  72.         }
  73.  
  74.         public Matrice Trasporteta()
  75.         {
  76.             Matrice esito = new Matrice(Righe);
  77.             for (int i = 0; i < Righe; i++)
  78.                 for (int j = 0; j < Righe; j++)
  79.                     esito[i, j] = this[j, i];
  80.             return esito;
  81.         }
  82.  
  83.         public static Matrice Identita(int dimensione)
  84.         {
  85.             Matrice Esito = new Matrice(dimensione);
  86.             for (int i = 0; i < Esito.Dimensione; i++)
  87.                 Esito[i, i] = 1.0;
  88.             return Esito;
  89.         }
  90.  
  91.         public double ComplementoAlgebrico(int riga, int colonna)
  92.         {
  93.             ControlloDimensioni(riga, colonna);
  94.             int fine = Righe - 1;
  95.             Matrice servizio = new Matrice(fine);
  96.             int pRiga, pColonna;
  97.             for (int i = 0; i < fine; i++)
  98.             {
  99.                 pRiga = i >= riga ? i + 1 : i;
  100.                 for (int j = 0; j < fine; j++)
  101.                 {
  102.                     pColonna = j >= colonna ? j + 1 : j;
  103.                     servizio[i, j] = this[pRiga, pColonna];
  104.                 }
  105.             }
  106.             return servizio.Determinante();
  107.         }
  108.  
  109.         public static bool Divisione(Matrice sinistra, Matrice destra, out Matrice risultato)
  110.         {
  111.             if (destra.Dimensione != sinistra.Dimensione)
  112.             {
  113.                 risultato = null;
  114.                 return false;
  115.             }
  116.  
  117.             if (destra.Inversa(out Matrice terza))
  118.             {
  119.                 MRettangolare esito = sinistra * terza;
  120.                 risultato = new Matrice(esito.Colonne);
  121.                 for (int i = 0; i < risultato.Righe; i++)
  122.                     for (int j = 0; j < risultato.Colonne; j++)
  123.                         risultato[i, j] = esito[i, j];
  124.                 return true;
  125.             }
  126.             else
  127.             {
  128.                 risultato = null;
  129.                 return false;
  130.             }
  131.         }
  132.  
  133.         public bool Inversa(out Matrice risultato)
  134.         {
  135.             double determinante;
  136.             determinante = Determinante();
  137.             if (Math.Abs(determinante) < 1e-100)
  138.             {
  139.                 risultato = null;
  140.                 return false;
  141.             }
  142.  
  143.             risultato = new Matrice(Righe);
  144.  
  145.             Matrice servizio = Trasporteta();
  146.             for (int i=0; i<Righe; i++)
  147.             {
  148.                 for (int j=0; j<Righe; j++)
  149.                 {
  150.                     double segno = ((i + j) & 1) == 0 ? 1.0 : -1.0;
  151.                     risultato[i, j] = (segno / determinante) * servizio.ComplementoAlgebrico(i, j);
  152.                 }
  153.             }
  154.  
  155.             return true;
  156.         }
  157.  
  158.         private bool CercaRigaNonNulla(int posizione, out int risultato)
  159.         {
  160.             risultato = posizione;
  161.             do
  162.             {
  163.                 if (Math.Abs(this[risultato, posizione]) > 1e-100)
  164.                 {
  165.                     return true;
  166.                 }
  167.  
  168.                 risultato++;
  169.             } while (risultato < Righe);
  170.             return false;
  171.         }
  172.  
  173.         private void ScambiaRighe(int prima, int seconda)
  174.         {
  175.             double temp;
  176.             for (int i =0; i<Righe; i++)
  177.             {
  178.                 temp = this[prima, i];
  179.                 this[prima, i] = this[seconda, i] * -1.0;
  180.                 this[seconda, i] = temp;
  181.             }
  182.         }
  183.     }
  184. }