Exemple #1
0
        // 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);
        }
Exemple #2
0
        //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);
        }
Exemple #3
0
        //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);
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        // 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);
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        //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);
        }
Exemple #8
0
        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;
        }
Exemple #9
0
        // 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);
        }
Exemple #10
0
        // 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);
        }
Exemple #11
0
        // 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);
        }
Exemple #12
0
        //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);
        }
Exemple #13
0
        // 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);
            }
        }
Exemple #14
0
        // 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);
        }
Exemple #15
0
        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();
        }
Exemple #16
0
        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();
        }