Beispiel #1
0
        public Matr InverseIterMetod(Fraction lambda, Matr x0)
        {
            Matr     rez = new Matr(this.nRow, 1);
            QuadMatr em  = new QuadMatr(this.nRow);

            em.setEMatr();
            rez = x0.CopyMatr();
            for (int i = 0; i < 2; i++)
            {
                SystUrav su = new SystUrav(this - lambda * em, rez);
                rez = su.GetGaussRootsMatr();
            }
            return(rez);
        }
Beispiel #2
0
        public Matr OrtoRoots()
        {
            QuadMatr t   = new QuadMatr(this.nUr);
            QuadMatr r   = new QuadMatr(this.nUr);
            Matr     rR  = new Matr(1, this.nUr);
            Matr     rR2 = new Matr(1, this.nUr);
            Matr     rC  = new Matr(this.nUr, 1);
            Matr     aC  = new Matr(this.nUr, 1);
            Matr     aR  = new Matr(this.nUr, 1);

            t.setEMatr();
            try
            {
                for (int j = 0; j < this.nUr; j++)
                {
                    aC = Matr.CopyColMatr(this.a, j);
                    for (int i = 0; i < this.nUr; i++)
                    {
                        r.A[i, j]  = this.a.A[i, j].CopyFr;
                        rR.A[0, j] = r.A[i, j].CopyFr;
                        rC.A[i, 0] = this.a.A[i, j].CopyFr;
                    }

                    for (int i = j + 1; i < this.nUr; i++)
                    {
                        aC = Matr.CopyColMatr(this.a, i);
                        for (int n = 0; n < this.nUr; n++)
                        {
                            aR.A[0, n] = aC.A[n, 0].CopyFr;
                        }
                        aC = Matr.CopyColMatr(this.a, i);

                        if (j == 0)
                        {
                            t.A[j, i] = (rR * aC).A[0, 0] / (rR * rC).A[0, 0];
                        }
                        else
                        {
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message);
            }
            return(new Matr());
        }
Beispiel #3
0
        public QuadMatr TransformMatr(int type)
        {
            if (this.determinant() == 0)
            {
                throw new Exception("Определитель матрицы равен нулю, обратная матрица не существует!");
            }
            else
            {
                Fraction m = new Fraction();
                int      n = this.NCol;
                QuadMatr e = new QuadMatr(n);
                QuadMatr x = new QuadMatr(n);
                QuadMatr y = new QuadMatr(n);
                QuadMatr b = new QuadMatr(n);
                QuadMatr c = new QuadMatr(n);
                e.setEMatr();
                for (int j = 0; j < n; j++)
                {
                    for (int i = j; i < n; i++)
                    {
                        for (int g = 0; g <= j - 1; g++)
                        {
                            m += b.A[i, g] * c.A[g, j];
                        }
                        b.A[i, j]  = this.A[i, j] - m;
                        m.FractTxt = "0";
                        for (int g = 0; g <= j - 1; g++)
                        {
                            m += b.A[j, g] * c.A[g, i];
                        }
                        c.A[j, i]  = (this.A[j, i] - m) / b.A[j, j];
                        m.FractTxt = "0";
                    }
                }
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        for (int g = 0; g <= j - 1; g++)
                        {
                            m += b.A[j, g] * y.A[g, i];
                        }
                        y.A[j, i]  = (e.A[j, i] - m) / b.A[j, j];
                        m.FractTxt = "0";
                    }
                }
                for (int i = 0; i < n; i++)
                {
                    for (int j = n - 1; j >= 0; j--)
                    {
                        for (int g = 0; g < n - j - 1; g++)
                        {
                            m += c.A[j, n - g - 1] * x.A[n - g - 1, i];
                        }
                        x.A[j, i]  = y.A[j, i] - m;
                        m.FractTxt = "0";
                    }
                }
                switch (type)
                {
                case 1:
                    return(x);

                case 2:
                    return(b);

                default:
                    return(c);
                }
            }
        }
Beispiel #4
0
        public QuadMatr getFrobeniusMatr()
        {
            int      n   = this.NCol;
            QuadMatr mFr = new QuadMatr(n);
            QuadMatr e   = new QuadMatr(n);
            QuadMatr m1  = new QuadMatr(n);

            Array.Copy(this.A, mFr.A, this.A.Length);
            for (int g = 0; g < n - 1; g++)
            {
                Fraction d = new Fraction();
                for (int i = 0; i <= n - g - 2; i++)
                {
                    d += mFr.A[n - g - 1, i];
                }
                if (d == 0)
                {
                    QuadMatr b = new QuadMatr(n - g - 1);
                    for (int i = 0; i < n - g - 1; i++)
                    {
                        for (int j = 0; j < n - g - 1; j++)
                        {
                            b.A[i, j] = mFr.A[i, j];
                        }
                    }
                    b = b.getFrobeniusMatr();
                    for (int i = 0; i < n - g - 1; i++)
                    {
                        for (int j = 0; j < n - g - 1; j++)
                        {
                            mFr.A[i, j]       = b.A[i, j];
                            mFr.A[i, j].Color = Color.FromRgb(127, 251, 189);
                        }
                    }
                    for (int i = n - g - 1; i < n; i++)
                    {
                        for (int j = n - g - 1; j < n; j++)
                        {
                            mFr.A[i, j].Color = Color.FromRgb(127, 251, 189);
                        }
                    }
                    return(mFr);
                }
                else if (mFr.A[n - g - 1, n - g - 2] == 0)
                {
                    mFr.swapCols(n - g - 1, n - g - 2);
                    mFr.swapRows(n - g - 1, n - g - 2);
                }
                e.setEMatr();
                for (int i = 0; i < n; i++)
                {
                    e.A[n - g - 2, i].FractTxt = mFr.A[n - g - 1, i].FractTxt;
                }
                if (e.determinant() != 0)
                {
                    mFr = (e * mFr * e.TransformMatr(1));
                }
                else
                {
                    mFr = (e * mFr * e.TransformMatr(1));
                }
            }
            return(mFr);
        }