using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sistema
{
class Sistemi
{
private Matrice incognite = null;
private double[] terminiNoti = null;
public Sistemi(int dimensione)
{
incognite
= new Matrice
(dimensione
);
terminiNoti
= new double[incognite.
Dimensione];
for (int i = 0; i < terminiNoti.Length; i++)
terminiNoti[i] = 0.0;
}
public Sistemi() : this(3) { }
public double this[int riga, int colonna]
{
set
{
ControlloDimensioni(riga, colonna);
if (colonna == incognite.Dimensione)
terminiNoti[riga] = value;
else
incognite[riga, colonna] = value;
}
get
{
ControlloDimensioni(riga, colonna);
if (colonna == incognite.Dimensione)
return terminiNoti[riga];
return incognite[riga, colonna];
}
}
public override string ToString()
{
System.Text.
StringBuilder esito
= new System.Text.
StringBuilder("", 1000
);
int fine = incognite.Dimensione;
for (int i=0; i<fine; i++)
{
for (int j=0; j<fine; j++)
{
esito.AppendFormat("{0,10:f4}", incognite[i, j]);
}
esito.AppendFormat(" = {0,10:f4}\n", terminiNoti[i]);
}
return esito.ToString();
}
public bool Soluzioni(out double[] esito)
{
int termine = incognite.Dimensione;
double determinante = incognite.Determinante();
if (Math.Abs(determinante) < 1e-100) // sistema indeterminato
{
esito = null;
return false;
}
esito
= new double[termine
];
Matrice
[] ausiliari
= new Matrice
[termine
];
for (int i = 0; i < termine; i++)
ausiliari
[i
] = new Matrice
(termine
);
// Copio i vloori del sistema in ausiliari
for (int riga=0; riga<termine; riga++)
{
for (int colonna=0; colonna<termine; colonna++)
{
for (int equazione=0; equazione<termine; equazione++)
{
if (equazione == colonna)
ausiliari[equazione][riga, colonna] = terminiNoti[riga];
else
ausiliari[equazione][riga, colonna] = incognite[riga, colonna];
}
}
}
// calcolo delle soluzioni
for(int i = 0; i < termine; i++)
{
esito[i] = ausiliari[i].Determinante() / determinante;
}
return true;
}
public override int GetHashCode()
{
return ToString().GetHashCode();
}
protected void ControlloDimensioni(int riga, int colonna)
{
if (!((riga >= 0) && (riga < incognite.Dimensione) && (colonna >= 0) && (colonna <= incognite.Dimensione)))
throw new OverflowException
($
"Impoeeiobile accedere alla cella [{riga}] [{colonna}]");
}
public int Dimensione()
{
return incognite.Dimensione;
}
}
}