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 - Sistemi.cs

Sistemi.cs

Caricato da: Poggi Marco
Scarica il programma completo

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Sistema
  7. {
  8.     class Sistemi
  9.     {
  10.         private Matrice incognite = null;
  11.         private double[] terminiNoti = null;
  12.  
  13.         public Sistemi(int dimensione)
  14.         {
  15.             incognite = new Matrice(dimensione);
  16.             terminiNoti = new double[incognite.Dimensione];
  17.             for (int i = 0; i < terminiNoti.Length; i++)
  18.                 terminiNoti[i] = 0.0;
  19.         }
  20.  
  21.         public Sistemi() : this(3) { }
  22.  
  23.         public double this[int riga, int colonna]
  24.         {
  25.             set
  26.             {
  27.                 ControlloDimensioni(riga, colonna);
  28.                 if (colonna == incognite.Dimensione)
  29.                     terminiNoti[riga] = value;
  30.                 else
  31.                     incognite[riga, colonna] = value;
  32.             }
  33.             get
  34.             {
  35.                 ControlloDimensioni(riga, colonna);
  36.                 if (colonna == incognite.Dimensione)
  37.                     return terminiNoti[riga];
  38.                 return incognite[riga, colonna];
  39.             }
  40.         }
  41.  
  42.         public override string ToString()
  43.         {
  44.             System.Text.StringBuilder esito = new System.Text.StringBuilder("", 1000);
  45.             int fine = incognite.Dimensione;
  46.             for (int i=0; i<fine; i++)
  47.             {
  48.                 for (int j=0; j<fine; j++)
  49.                 {
  50.                     esito.AppendFormat("{0,10:f4}", incognite[i, j]);
  51.                 }
  52.                 esito.AppendFormat(" = {0,10:f4}\n", terminiNoti[i]);
  53.             }
  54.             return esito.ToString();
  55.         }
  56.  
  57.         public bool Soluzioni(out double[] esito)
  58.         {
  59.             int termine = incognite.Dimensione;
  60.             double determinante = incognite.Determinante();
  61.             if (Math.Abs(determinante) < 1e-100) // sistema indeterminato
  62.             {
  63.                 esito = null;
  64.                 return false;
  65.             }
  66.             esito = new double[termine];
  67.             Matrice[] ausiliari = new Matrice[termine];
  68.             for (int i = 0; i < termine; i++)
  69.                 ausiliari[i] = new Matrice(termine);
  70.  
  71.             // Copio i vloori del sistema in ausiliari
  72.             for (int riga=0; riga<termine; riga++)
  73.             {
  74.                 for (int colonna=0; colonna<termine; colonna++)
  75.                 {
  76.                     for (int equazione=0; equazione<termine; equazione++)
  77.                     {
  78.                         if (equazione == colonna)
  79.                             ausiliari[equazione][riga, colonna] = terminiNoti[riga];
  80.                         else
  81.                             ausiliari[equazione][riga, colonna] = incognite[riga, colonna];
  82.                     }
  83.                 }
  84.             }
  85.              
  86.             // calcolo delle soluzioni
  87.             for(int i = 0; i < termine; i++)
  88.             {
  89.                 esito[i] = ausiliari[i].Determinante() / determinante;
  90.             }
  91.             return true;
  92.         }
  93.  
  94.         public override int GetHashCode()
  95.         {
  96.             return ToString().GetHashCode();
  97.         }
  98.  
  99.         protected void ControlloDimensioni(int riga, int colonna)
  100.         {
  101.             if (!((riga >= 0) && (riga < incognite.Dimensione) && (colonna >= 0) && (colonna <= incognite.Dimensione)))
  102.                 throw new OverflowException($"Impoeeiobile accedere alla cella [{riga}] [{colonna}]");
  103.         }
  104.  
  105.         public int Dimensione()
  106.         {
  107.             return incognite.Dimensione;
  108.         }
  109.     }
  110. }