// Transponiranje public Matrica VratiTransponiranuMatricu() { Matrica transponiranaMatrica = new Matrica(this.brojStupaca, this.brojRedaka); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { transponiranaMatrica[j, i] = this[i, j]; } } return(transponiranaMatrica); }
//Vraća kopiju matrice public Matrica VratiKopiju() { Matrica matricaKopija = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { matricaKopija[i, j] = this[i, j]; } } return(matricaKopija); }
//m3=m2*c (skalarno) public static Matrica operator *(Matrica m2, double skalar) { Matrica m3 = new Matrica(m2.brojRedaka, m2.brojStupaca); for (int i = 0; i < m2.brojRedaka; i++) { for (int j = 0; j < m2.brojStupaca; j++) { m3[i, j] = m2[i, j] * skalar; } } return(m3); }
public static void KreirajMatlabDatoteku(Matrica _A, Matrica _X, double _IntZav, string _rezultat) { Matrica A = _A; Matrica X = _X; System.IO.TextWriter datotekaMatSustava = new System.IO.StreamWriter("datMatSustava.m"); datotekaMatSustava.Write("function yTocka = datMatSustava (t,y)\nyTocka = ["); for (int i = 0; i < A.brojRedaka; i++) { for (int j = 0; j < A.brojStupaca; j++) { datotekaMatSustava.Write(A[i, j].ToString().Replace(',', '.') + " "); } if (i != A.brojRedaka - 1) { datotekaMatSustava.Write(";"); } } datotekaMatSustava.Write("]*y;\nend"); datotekaMatSustava.Close(); System.IO.TextWriter datotekaMatlabRjesenja = new System.IO.StreamWriter(_rezultat); datotekaMatlabRjesenja.Write("function " + _rezultat.Substring(0, _rezultat.Length - 2) + " \nt0=0;\ntkraj=" + _IntZav.ToString().Replace(',', '.') + ";\ny0=["); for (int i = 0; i < X.brojRedaka; i++) { datotekaMatlabRjesenja.Write(X[i, 0].ToString().Replace(',', '.') + " "); if (i != X.brojRedaka - 1) { datotekaMatlabRjesenja.Write(";"); } } datotekaMatlabRjesenja.Write("];\n[t2, y2] = ode23(@datMatSustava, [t0, tkraj], y0);\nsubplot(3,1,3), " + "plot (t2,y2); \nxlabel('Vrijeme'); \nylabel('Vrijednost varijabli stanja'); \ntitle ('ode23', 'FontWeight','bold', 'Color','blue');" + "\naxis([0 " + _IntZav.ToString().Replace(',', '.')); datotekaMatlabRjesenja.WriteLine(" min(min(y2)) max(max(y2))])"); datotekaMatlabRjesenja.Close(); }
// Učitavanje iz datoteke static public Matrica UcitajIzDatoteke(string adresaDatoteke) { List <double> listaUcitanihBrojeva = new List <double>(); string ucitaniRedak; int brojRedaka = 0, brojStupaca = 0, provjeraBrojaStupaca = 0; StreamReader citac = null; citac = new StreamReader(adresaDatoteke); while ((ucitaniRedak = citac.ReadLine()) != null) { brojRedaka++; foreach (string element in ucitaniRedak.Split(' ', '\t')) { try { listaUcitanihBrojeva.Add(double.Parse(element)); } catch { throw new Exception("Element matrice koju pokušavate iščitati iz datoteke nije broj!"); } provjeraBrojaStupaca++; } if (brojRedaka == 1) { brojStupaca = listaUcitanihBrojeva.Count; } else { if (provjeraBrojaStupaca != brojStupaca) { throw new Exception("Matrica nije učitana. Neispravno zadan oblik matrice u datoteci " + adresaDatoteke + "!"); } } provjeraBrojaStupaca = 0; } citac.Close(); Matrica matrica = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { matrica[i, j] = listaUcitanihBrojeva[i * brojStupaca + j]; } } return(matrica); }
private void button1_Click(object sender, EventArgs e) { Matrica A = new Matrica(2, 2); A.NapuniMatricu(new double[] { 1, 1, 1, 1 }); Matrica inverz = null; try { inverz = A.VratiInverz(); tbEkran.Text = inverz.ToFormatString(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//m3=m1-m2 public static Matrica operator -(Matrica m1, Matrica m2) { // provjere dimenzija if ((m1.brojRedaka != m2.brojRedaka) || (m1.brojStupaca != m2.brojStupaca)) { throw new Exception("Matrice nisu kompatibilne za oduzimanje!"); } Matrica m3 = new Matrica(m1.brojRedaka, m1.brojStupaca); for (int i = 0; i < m1.brojRedaka; i++) { for (int j = 0; j < m1.brojStupaca; j++) { m3[i, j] = m1[i, j] - m2[i, j]; } } return(m3); }
public TrapezniPostupak(Matrica _A, Matrica _B, Matrica _X, double _T, double _I, int _korakIspisa, TextBox _tbIspis) { A = _A; B = _B; X0 = _X; T = _T; I = _I; korakIspisa = _korakIspisa; tb = _tbIspis; // Ispis matrica tb.Text = "Matrica A: " + nl; tb.Text += A.ToFormatString() + nl; tb.Text += "Matrica B: " + nl; tb.Text += B.ToFormatString() + nl; tb.Text += "Početno stanje: " + nl; tb.Text += X0.ToFormatString() + nl; tb.Text += nl + "* * * * * * * * * Izvođenje algoritma * * * * * * * * *" + nl + nl; }
// Iz LU matrice očitava i vraća matricu U public Matrica VratiMatricuU() { Matrica matricaU = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { if (i <= j) { matricaU[i, j] = this[i, j]; } else { matricaU[i, j] = 0; } } } return(matricaU); }
// LUP Dekompozicija () public Matrica DekompozicijaLUP(out Matrica permutacijskiVektor) { permutacijskiVektor = new Matrica(1, brojRedaka); Matrica radnaMatrica = this.VratiKopiju(); for (int i = 0; i < brojRedaka; i++) { permutacijskiVektor[0, i] = i; } for (int i = 0; i < brojRedaka - 1; i++) { int pivot = i; for (int j = i + 1; j < brojRedaka; j++) { if (Math.Abs(radnaMatrica[j, i]) > Math.Abs(radnaMatrica[pivot, i])) { pivot = j; } } if (Math.Abs(radnaMatrica[pivot, i]) < Matrica.konstantaUsporedbe) { throw new Exception("LUP dekompozicija je zaustavljena jer je detektiran stožerni element manji od zadane granice!"); } radnaMatrica = radnaMatrica.ZamijeniRetke(i, pivot); permutacijskiVektor = permutacijskiVektor.ZamijeniStupce(i, pivot); for (int j = i + 1; j < brojRedaka; j++) { radnaMatrica[j, i] /= radnaMatrica[i, i]; for (int k = i + 1; k < brojRedaka; k++) { radnaMatrica[j, k] -= radnaMatrica[j, i] * radnaMatrica[i, k]; } } } //if (Math.Abs(radnaMatrica[brojRedaka - 1, brojStupaca - 1]) < konstantaUsporedbe) // throw new Exception("LUP dekompozicija je zaustavljena jer je detektiran stožerni element manji od zadane granice!"); return(radnaMatrica); }
// Supstitucija unaprijed public Matrica SupstitucijaUnaprijed(Matrica b) { if (b.brojStupaca > 1) { throw new Exception("Ulazni parametar supstitucije unaprijed mora biti ''okomiti'' vektor (dimenzija nx1)!"); } if (b.brojRedaka != this.brojRedaka) { throw new Exception("Ulazni vektor supstitucije unaprijed nije valjane dimenzije!"); } Matrica vektorY = b.VratiKopiju(); for (int i = 0; i < brojRedaka - 1; i++) { for (int j = i + 1; j < brojRedaka; j++) { vektorY[j, 0] -= this[j, i] * vektorY[i, 0]; } } return(vektorY); }
//m3=m1*m2 (matrično) public static Matrica operator *(Matrica m1, Matrica m2) { // provjere dimenzija if (m1.brojStupaca != m2.brojRedaka) { throw new Exception("Matrice nisu kompatibilne za množenje!"); } Matrica m3 = new Matrica(m1.brojRedaka, m2.brojStupaca); for (int i = 0; i < m1.brojRedaka; i++) { for (int j = 0; j < m2.brojStupaca; j++) { m3[i, j] = 0; for (int k = 0; k < m1.brojStupaca; k++) { m3[i, j] += m1[i, k] * m2[k, j]; } } } return(m3); }
// Vraća inverz matrice ako postoji public Matrica VratiInverz() { if (brojRedaka != brojStupaca) { throw new Exception("Nije moguće napraviti inverz nekvadratne matrice!"); } try { Matrica inverznaMatrica = new Matrica(this.brojRedaka, this.brojStupaca); Matrica permVektor; Matrica matricaLUP = this.DekompozicijaLUP(out permVektor); Matrica matricaL = matricaLUP.VratiMatricuL(); Matrica matricaU = matricaLUP.VratiMatricuU(); for (int i = 0; i < brojRedaka; i++) { Matrica vektorE = new Matrica(brojRedaka, 1); vektorE[i, 0] = 1; Matrica matricaSupstitucijaUnaprijed = matricaL.SupstitucijaUnaprijed(vektorE.VratiPermutiraniVektor(permVektor)); Matrica matricaSupstitucijaUnatrag = matricaU.SupstitucijaUnatrag(matricaSupstitucijaUnaprijed); for (int j = 0; j < brojRedaka; j++) { inverznaMatrica[j, i] = matricaSupstitucijaUnatrag[j, 0]; } } return(inverznaMatrica); } catch (Exception ex) { throw new Exception("Neuspjeli inverz matrice! \n" + ex.Message); } }
// Iz LU matrice očitava i vraća matricu L public Matrica VratiMatricuL() { Matrica matricaL = new Matrica(brojRedaka, brojStupaca); for (int i = 0; i < brojRedaka; i++) { for (int j = 0; j < brojStupaca; j++) { if (i == j) { matricaL[i, j] = 1; } else if (i > j) { matricaL[i, j] = this[i, j]; } else { matricaL[i, j] = 0; } } } return(matricaL); }
public void PokreniAlgoritam() { Matrica J = Matrica.KreirajJedinicnuMatricu(A.brojRedaka); Matrica R = J - (T / 2) * A; R = R.VratiInverz(); Matrica S = R; R = R * (J + (T / 2) * A); S = S * ((T / 2) * B); List <Matrica> listaMatricaX = new List <Matrica>(); listaMatricaX.Add(X0); int indeksZadnjeMatrice = 0; double preostaliInterval = I; while (Math.Abs(preostaliInterval) >= Math.Pow(10, -6)) { Matrica Xi = R * listaMatricaX[indeksZadnjeMatrice] + S; listaMatricaX.Add(Xi); indeksZadnjeMatrice++; if (indeksZadnjeMatrice % korakIspisa == 0) { tb.Text += "T= " + T * indeksZadnjeMatrice + nl + Xi.ToFormatString() + nl + nl; } preostaliInterval -= T; } // Kreiranje Matlab datoteke System.IO.TextWriter pisac = new System.IO.StreamWriter("Trapezna.m"); pisac.Write("y=["); for (int i = 0; i < listaMatricaX[0].brojRedaka; i++) { foreach (Matrica m in listaMatricaX) { pisac.Write(m[i, 0].ToString().Replace(',', '.') + " "); } if (i != listaMatricaX[0].brojRedaka - 1) { pisac.Write(";"); } } pisac.Write("];\nt=["); int brojacZaIspis = 0; double krajIntervala = I; while (Math.Abs(krajIntervala) > Math.Pow(10, -7)) { pisac.Write((brojacZaIspis * T).ToString().Replace(',', '.') + " "); brojacZaIspis++; krajIntervala -= T; } pisac.Write((brojacZaIspis * T).ToString() + " "); pisac.Write("];\n"); pisac.WriteLine("\nsubplot(3,1,2), plot (t,y); \n xlabel('Vrijeme'); \n ylabel('Vrijednost varijabli stanja');" + " title ('Trapezni postupak', 'FontWeight','bold', 'Color','red'); axis([" + "0 " + I.ToString().Replace(',', '.') + " min(min(y)) max(max(y))])"); pisac.Close(); }
public void PokreniAlgoritam() { List <Matrica> listaMatricaX = new List <Matrica>(); listaMatricaX.Add(X0); int indeksZadnjeMatrice = 0; double preostaliInterval = I; while (Math.Abs(preostaliInterval) >= Math.Pow(10, -6)) { m1 = A * (listaMatricaX[indeksZadnjeMatrice] + B); m2 = A * (listaMatricaX[indeksZadnjeMatrice] + (T / 2) * m1) + B; m3 = A * (listaMatricaX[indeksZadnjeMatrice] + (T / 2) * m2) + B; m4 = A * (listaMatricaX[indeksZadnjeMatrice] + T * m3) + B; Matrica Xi = listaMatricaX[indeksZadnjeMatrice] + (T / 6) * (m1 + 2 * m2 + 2 * m3 + m4); listaMatricaX.Add(Xi); indeksZadnjeMatrice++; if (indeksZadnjeMatrice % korakIspisa == 0) { tb.Text += "T= " + T * indeksZadnjeMatrice + nl + Xi.ToFormatString() + nl + nl; } preostaliInterval -= T; } // Kreiranje Matlab datoteke System.IO.TextWriter pisac = new System.IO.StreamWriter("RungeKutta.m"); pisac.Write("y=["); for (int i = 0; i < listaMatricaX[0].brojRedaka; i++) { foreach (Matrica m in listaMatricaX) { pisac.Write(m[i, 0].ToString().Replace(',', '.') + " "); } if (i != listaMatricaX[0].brojRedaka - 1) { pisac.Write(";"); } } pisac.Write("];\nt=["); int brojacZaIspis = 0; double krajIntervala = I; while (Math.Abs(krajIntervala) > Math.Pow(10, -7)) { pisac.Write((brojacZaIspis * T).ToString().Replace(',', '.') + " "); brojacZaIspis++; krajIntervala -= T; } pisac.Write((brojacZaIspis * T).ToString() + " "); pisac.Write("];\n"); pisac.WriteLine("\nsubplot(3,1,1), plot (t,y); \n xlabel('Vrijeme'); \n ylabel('Vrijednost varijabli stanja');" + " title ('Runge-Kutta', 'FontWeight','bold', 'Color','blue'); axis([" + "0 " + I.ToString().Replace(',', '.') + " min(min(y)) max(max(y))])"); pisac.Close(); }