protected IVector MultT(IVector x, bool UseDiagonal)
        {
            int     j;
            IVector result = new SimpleVector(Size);

            if (UseDiagonal)
            {
                for (int i = 0; i < this.Size; i++)
                {
                    result[i] = di[i] * x[i];
                }
            }
            for (int i = 0; i < this.Size; i++)
            {
                {
                    for (int k = ig[i]; k < ig[i + 1]; k++)
                    {
                        j          = jg[k];
                        result[j] += al[k] * x[i];
                        result[i] += au[k] * x[j];
                    }
                }
            }
            return(result);
        }
        protected IVector SolveUT(IVector x, bool UseDiagonal)
        {
            //проверка корректности
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveUT");
            }
            else
            {
                IVector result = new SimpleVector(this.Size);
                double  sum;

                for (int i = 0; i < this.Size; i++)
                {
                    sum = 0;
                    for (int j = ig[i]; j < ig[i + 1]; j++)
                    {
                        sum += au[j] * result[jg[j]];
                    }
                    result[i] = (x[i] - sum);
                    if (UseDiagonal == true)
                    {
                        if (extraDiagVal == 0)
                        {
                            result[i] /= di[i];
                        }
                        else
                        {
                            result[i] /= extraDiagVal;
                        }
                    }
                }
                return(result);
            }
        }
        public IVector MultU(IVector x, bool UseDiagonal)
        {
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultU");
            }
            else
            {
                IVector result = new SimpleVector(Size);
                for (int i = 0; i < Size; i++)
                {
                    if (UseDiagonal == true)
                    {
                        if (extraDiagVal == 0)
                        {
                            result[i] = di[i] * x[i];
                        }
                        else
                        {
                            result[i] = extraDiagVal * x[i];
                        }
                    }
                    for (int j = ig[i]; j < ig[i + 1]; j++)
                    {
                        result[jg[j]] += au[j] * x[i];
                    }
                }

                return(result);
            }
        }
Ejemplo n.º 4
0
        public void normVector()
        {
            double[] x = new double[] { 1, 2, 3 };
            IVector  v = new SimpleVector(x);

            Assert.AreEqual(v.Norm, Math.Sqrt(14));
        }
        public IVector Mult(IVector x, bool UseDiagonal)
        {
            //проверка на корректное умножение (размеры вектора и матрицы)
            //допустим все корректно
            int     j;
            IVector result = new SimpleVector(Size);

            if (UseDiagonal)
            {
                for (int i = 0; i < this.Size; i++)
                {
                    result[i] = di[i] * x[i];
                }
            }
            for (int i = 0; i < this.Size; i++)
            {
                {
                    for (int k = ig[i]; k < ig[i + 1]; k++)
                    {
                        j          = jg[k];
                        result[i] += al[k] * x[j];
                        result[j] += au[k] * x[i];
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 6
0
        public void createVector()
        {
            double[] x = new double[] { 1, 2, 3 };
            IVector  v = new SimpleVector(x);

            Assert.IsNotNull(v);
        }
Ejemplo n.º 7
0
        public IVector Mult(IVector x, bool UseDiagonal = true)
        {
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора.");
            }

            IVector result = new SimpleVector(Size);

            if (UseDiagonal)
            {
                for (int i = 0; i < Size; i++)
                {
                    for (int j = 0; j < Size; j++)
                    {
                        result[i] += d_matrix[i, j] * x[j];
                    }
                }
            }
            else
            {
                for (int i = 0; i < Size; i++)
                {
                    for (int j = 0; j < Size; j++)
                    {
                        if (i != j)
                        {
                            result[i] += d_matrix[i, j] * x[j];
                        }
                    }
                }
            }
            return(result);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="x"></param>
        /// <param name="UseDiagonal">различие в делении на диагональ</param>
        /// <returns></returns>
        public IVector SolveL(IVector x, bool UseDiagonal)
        {
            //проверка корректности
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveL");
            }
            else
            {
                IVector result = new SimpleVector(this.Size);
                double  sum;

                for (int i = 0; i < this.Size; i++)
                {
                    sum = 0;
                    for (int j = ig[i]; j < ig[i + 1]; j++)
                    {
                        sum += al[j] * result[jg[j]];
                    }
                    result[i] = (x[i] - sum);
                    if (UseDiagonal == true)
                    {
                        result[i] /= di[i];
                    }
                }
                return(result);
            }

            // можно было сделать главное условие if(UseDiagonal==true) и разбиение на два цикла, но так компактнее
        }
Ejemplo n.º 9
0
        public IVector MultL(IVector x, bool UseDiagonal = true)
        {
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора.");
            }

            IVector result = new SimpleVector(Size);

            if (UseDiagonal)
            {
                if (extraDiagVal == 0)
                {
                    for (int i = 0; i < Size; i++)
                    {
                        for (int j = 0; j < Size; j++)
                        {
                            //нижний треугольник с диагональю
                            if (i >= j)
                            {
                                result[i] += d_matrix[i, j] * x[j];
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < Size; i++)
                    {
                        for (int j = 0; j < Size; j++)
                        {
                            if (i > j)
                            {
                                result[i] += d_matrix[i, j] * x[j];
                                continue;
                            }
                            //диагональ
                            if (i == j)
                            {
                                result[i] += extraDiagVal * x[j];
                            }
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < Size; i++)
                {
                    for (int j = 0; j < Size; j++)
                    {
                        if (i > j)
                        {
                            result[i] += d_matrix[i, j] * x[j];
                        }
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 10
0
        public IVector SolveU(IVector x, bool UseDiagonal = true)
        {
            IVector result = new SimpleVector(Size);

            if (!UseDiagonal)
            {
                if (Math.Abs(x[Size - 1]) < EQU_TO_ZERO)
                {
                    result[Size - 1] = 0;
                }
                else
                {
                    throw new SlaeNotCompatipableException("Система неразрешима.");
                }
            }
            for (int i = Size - 1; i >= 0; i--)
            {
                int line_length = Size - i;
                result[i] = x[i];
                for (int j = i + 1; j < Size; j++)
                {
                    result[i] -= result[j] * this[i, j];
                }
                try
                {
                    result[i] /= this[i, i];
                }
                catch (DivideByZeroException)
                {
                    throw new SlaeNotCompatipableException("Произошло деление на ноль.");
                }
            }
            return(result);
        }
Ejemplo n.º 11
0
        protected IVector MultT(IVector x, bool UseDiagonal)
        {
            int j;

            if (this.Size != x.Size)
            {
                throw new Exception("Ошибка. Различие в размерности вектора и матрицы в функции Mult");
            }
            IVector result = new SimpleVector(Size);

            if (this.isSymmetric)
            {
                result = Mult(x, UseDiagonal);
            }
            else
            {
                for (int i = 0; i < this.Size; i++)
                {
                    for (int k = ig[i]; k < ig[i + 1]; k++)
                    {
                        j = jg[k];
                        if (j != i)
                        {
                            result[j] += al[k] * x[i];
                        }
                        else
                        if (UseDiagonal)
                        {
                            result[i] += al[k] * x[j];
                        }
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 12
0
 protected IVector MultUT(IVector x, bool UseDiagonal)
 {
     if (this.Size != x.Size)
     {
         throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultUT");
     }
     else
     {
         int     jCol;
         IVector result = new SimpleVector(this.Size);
         for (int i = 0; i < Size; i++)
         {
             for (int j = ig[i]; j < ig[i + 1]; j++)
             {
                 jCol = jg[j];
                 if (i == jCol && UseDiagonal)
                 {
                     if (extraDiagVal == 0)
                     {
                         result[i] += al[i] * x[i];
                     }
                     else
                     {
                         result[i] = extraDiagVal * x[i];
                     }
                     break;
                 }
                 result[i] += al[j] * x[jCol];
             }
         }
         return(result);
     }
 }
Ejemplo n.º 13
0
        protected IVector MultT(IVector x, bool UseDiagonal)
        {
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Не удалось выполнить LU-разложение");
            }

            IVector result = new SimpleVector(Size);

            if (UseDiagonal)
            {
                for (int i = 0; i < Size; i++)
                {
                    for (int j = 0; j < Size; j++)
                    {
                        result[i] += d_matrix[j, i] * x[j];
                    }
                }
            }
            else
            {
                for (int i = 0; i < Size; i++)
                {
                    for (int j = 0; j < Size; j++)
                    {
                        if (i != j)
                        {
                            result[i] += d_matrix[j, i] * x[j];
                        }
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 14
0
 public IVector MultL(IVector x, bool UseDiagonal)
 {
     if (this.Size != x.Size)
     {
         throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultL");
     }
     else
     {
         int     jCol;
         var     di     = this.Diagonal;
         IVector result = new SimpleVector(this.Size);
         for (int i = 0; i < Size; i++)
         {
             if (UseDiagonal == true)
             {
                 result[i] = di[i] * x[i];
             }
             for (int j = ig[i]; j < ig[i + 1]; j++)
             {
                 jCol = jg[j];
                 if (jCol < i)
                 {
                     result[i] += al[j] * x[jCol];
                 }
                 else
                 {
                     break;
                 }
             }
         }
         return(result);
     }
 }
Ejemplo n.º 15
0
        protected IVector SolveUT(IVector x, bool UseDiagonal = true)
        {
            IVector result = new SimpleVector(Size);

            if (!UseDiagonal)
            {
                if (Math.Abs(x[0]) < EQU_TO_ZERO)
                {
                    result[0] = 0;
                }
                else
                {
                    throw new SlaeNotCompatipableException("Система неразрешима.");
                }
            }
            for (int i = 0; i < Size; i++)
            {
                result[i] = x[i];
                for (int j = 0; j < i; j++)
                {
                    result[i] -= result[j] * this[j, i];
                }
                try
                {
                    result[i] /= this[i, i];
                }
                catch (DivideByZeroException)
                {
                    throw new SlaeNotCompatipableException("Произошло деление на ноль.");
                }
            }
            return(result);
        }
Ejemplo n.º 16
0
 public void wrongSize()
 {
     Assert.ThrowsException <WrongSizeException>(() =>
     {
         IVector v = new SimpleVector(-10);
     }
                                                 );
 }
Ejemplo n.º 17
0
        public void multVector()
        {
            double[] x           = new double[] { 1, 2, 3 };
            IVector  v           = new SimpleVector(x);
            double   resultRight = 14;
            double   result      = v.ScalarMult(v);

            Assert.IsTrue(result == resultRight);
        }
Ejemplo n.º 18
0
        public void addVector()
        {
            double[] x           = new double[] { 1, 2, 3 };
            double[] xx          = new double[] { 2, 4, 6 };
            IVector  v           = new SimpleVector(x);
            IVector  resultRight = v.Add(v, 1, 1);
            IVector  result      = new SimpleVector(xx);

            Assert.IsTrue(result.CompareWith(resultRight, 1e-9));
        }
Ejemplo n.º 19
0
        public IVector MultD(IVector a)
        {
            IVector result = new SimpleVector(Size);

            for (int i = 0; i < this.Size; i++)
            {
                result[i] = a[i] * this[i, i];
            }
            return(result);
        }
Ejemplo n.º 20
0
        public IVector MultD(IVector a)
        {
            IVector di     = this.Diagonal;
            IVector result = new SimpleVector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] = a[i] * di[i];
            }
            return(result);
        }
Ejemplo n.º 21
0
        public IVector SolveD(IVector x)
        {
            if (this.Size != x.Size)
            {
                throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveD");
            }
            IVector result = new SimpleVector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] = x[i] / di[i];
            }
            return(result);
        }
Ejemplo n.º 22
0
        /// <summary>
        /// Усножение вектора на диагональ матрицы (диагональную матрицу)
        /// </summary>
        /// <param name="a">Умножаемый вектор</param>
        public IVector SolveD(IVector a)
        {
            if (this.Size != a.Size)
            {
                throw new DifferentSizeException("Размерность матрицы не совпадает с размерностью вектора.");
            }
            IVector result = new SimpleVector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] = a[i] / this[i, i];
            }

            return(result);
        }
Ejemplo n.º 23
0
 public IVector MultU(IVector x, bool UseDiagonal)
 {
     if (this.Size != x.Size)
     {
         throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции MultU");
     }
     else
     {
         int     jCol;
         IVector result = new SimpleVector(Size);
         if (this.isSymmetric)
         {
             result = this.MultLT(x, UseDiagonal);
         }
         else
         {
             for (int i = 0; i < Size; i++)
             {
                 if (UseDiagonal == true)
                 {
                     var di = this.Diagonal;
                     if (extraDiagVal == 0)
                     {
                         result[i] = di[i] * x[i];
                     }
                     else
                     {
                         result[i] = x[i];
                     }
                 }
                 for (int j = ig[i + 1] - 1; j >= ig[i]; j--)
                 {
                     jCol = jg[j];
                     if (jCol > i)
                     {
                         result[i] += al[j] * x[jCol];
                     }
                     else
                     {
                         break;
                     }
                 }
             }
         }
         return(result);
     }
 }
Ejemplo n.º 24
0
        public void testSparseRowColumnMatrix()
        {
            //(int, int)[] coord = new(int, int)[64];
            double[] di = new double[8] {
                3, 5, 6, 5, 7, 9, 11, 11
            };
            int[] ig = new int[9] {
                1, 1, 2, 3, 3, 5, 7, 8, 9
            };                                                   //Индексы начала строк
            int[] jg = new int[8] {
                1, 1, 2, 4, 3, 5, 6, 5
            };                                                //Номера столбцов для элементов
            double[] al = new double[8] {
                -1, 1, 3, 3, -2, 2, 1, 4
            };                                                        //Элементы нижней диагонали
            double[] au = new double[8] {
                2, 8, 10, 12, -7, 3, 4, 1
            };                                                         //Элементы верхней диагонал

            //
            //double[] val = new double[64] { 3, 2, 8, 0, 0, 0, 0, 0,
            //                               -1, 5, 0, 0, 10, 0, 0, 0,
            //                                1, 0, 6, 0, 0, -7, 0, 0,
            //                                0, 0, 0, 5, 12, 0, 0, 0,
            //                                0, 3, 0, 3, 7, 3, 0, 1,
            //                                0, 0, -2, 0, 2, 9, 4, 0,
            //                                0, 0, 0, 0, 0, 1, 11, 0,
            //                                0, 0, 0, 0, 4, 0, 0, 11 };


            //for (int i = 0; i < 64; i++)
            //{
            //    coord[i] = (i / 8, i % 8);
            //}

            IMatrix matr = new SparseRowColumnMatrix(ig, jg, di, al, au);
            IVector x    = new SimpleVector(new double[8] {
                1, 2, 3, 4, 5, 6, 7, 8
            });

            IVector result = matr.Mult(x);
            IVector right  = new SimpleVector(new double[8] {
                31, 59, -23, 80, 79, 86, 83, 108
            });

            Assert.IsTrue(result.CompareWith(right, 1e-5));
        }
Ejemplo n.º 25
0
        protected IVector SolveLT(IVector x, bool UseDiagonal = true)
        {
            IVector result = new SimpleVector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] = x[i];
            }

            if (!UseDiagonal)
            {
                if (Math.Abs(x[Size - 1]) < EQU_TO_ZERO)
                {
                    result[Size - 1] = 0;
                }
                else
                {
                    throw new SlaeNotCompatipableException("Система неразрешима.");
                }
                return(null);
            }
            for (int i = Size - 1; i >= 0; i--)
            {
                int line_length = i;
                try
                {
                    if (extraDiagVal == 0)
                    {
                        result[i] /= this[i, i];
                    }
                    else
                    {
                        result[i] /= extraDiagVal;
                    }
                }
                catch (DivideByZeroException)
                {
                    throw new SlaeNotCompatipableException("Произошло деление на ноль.");
                }
                for (int j = 0; j < line_length; j++)
                {
                    result[j] -= result[i] * this[i, j];
                }
            }
            return(result);
        }
Ejemplo n.º 26
0
        public static void localtest()
        {
            double[,] val = new double[4, 4] {
                { 1, 4, 4, 4 }, { 1, 1, 3, 3 }, { 1, 1, 1, 2 }, { 1, 1, 1, 1 }
            };

            IMatrix         mar = new DenseMatrix(val);
            IPreconditioner pre = new LUPreconditioner(mar);

            IVector x = new SimpleVector(new double[4] {
                1, 2, 3, 4
            });

            IVector y = mar.Mult(x, true);

            //should be { 37, 24, 14, 10 }

            y = pre.MultL(x);
            //shold be { 1, 3, 6, 10 }

            y = pre.MultU(x);
            //shold be { 37, -13, -10, -4 }

            IVector z = (IVector)y.Clone();

            //should do not crash

            z = pre.SolveL(x);
            //should be { 1, 1, 1, 1 }

            z = pre.SolveU(x);
            //should be { 13, 0.5, 0.5, -4 }

            IVector ut = mar.T.MultU(x);

            //should be { 1, 6, 13, 20 }

            ut = mar.T.MultU(x, false);
            //should be { 0, 4, 10, 16 }

            IVector lt = mar.T.MultL(x);
            //should be { 10, 9, 7, 4 }
        }
Ejemplo n.º 27
0
        public static void localtest()
        {
            Dictionary <string, string> pathFiles = new Dictionary <string, string>
            {
                { "ig", "./ig.txt" },
                { "jg", "./jg.txt" },
                { "al", "./al.txt" },
            };

            double[] vecval = new double[3] {
                3, 2, 2
            };
            SparseRowMatrix s_matr = new SparseRowMatrix(pathFiles);

            s_matr.CastToNotSymm();
            IVector newV   = new SimpleVector(vecval);
            IVector mult   = s_matr.MultL(newV, true);
            IVector multTT = s_matr.MultU(newV, true);
        }
Ejemplo n.º 28
0
        private void BTN_Renumber_Click(object sender, RoutedEventArgs e)
        {
            Random rnd = new Random();

            new UtilCommand(this,
                            new SimpleVector <int>(rnd.Next(0, matr.nCol()), rnd.Next(0, matr.nCol()), rnd.Next(0, matr.nRow()), rnd.Next(0, matr.nRow())),
                            (MainWindow mw, object val) => {
                SimpleVector <int> vec = (SimpleVector <int>)val;
                ReAssignMatrix <int> mx;
                mx = mw.matr is ReAssignMatrix <int>?(ReAssignMatrix <int>)mw.matr: new ReAssignMatrix <int>(mw.matr);
                if (vec.Get(0) != -1 && vec.Get(1) != -1)
                {
                    mx.SwapCols(vec.Get(0), vec.Get(1));
                }
                if (vec.Get(2) != -1 && vec.Get(3) != -1)
                {
                    mx.SwapRows(vec.Get(2), vec.Get(3));
                }
                mw.ApplyMatrix(mx);
                return(true);
            }
                            ).Execute();
        }
Ejemplo n.º 29
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="x"></param>
 /// <param name="UseDiagonal">различие в делении на диагональ</param>
 /// <returns></returns>
 public IVector SolveL(IVector x, bool UseDiagonal)
 {
     //проверка корректности
     if (this.Size != x.Size)
     {
         throw new DifferentSizeException("Ошибка. Различие в размерности вектора и матрицы в функции SolveL");
     }
     else
     {
         IVector result = new SimpleVector(this.Size);
         double  sum;
         int     jCol;
         var     di = this.Diagonal;
         for (int i = 0; i < this.Size; i++)
         {
             sum = 0;
             for (int j = ig[i]; j < ig[i + 1]; j++)
             {
                 jCol = jg[j];
                 if (jCol < i)
                 {
                     sum += al[j] * result[jCol];
                 }
                 else
                 {
                     break;
                 }
             }
             result[i] = (x[i] - sum);
             if (UseDiagonal == true)
             {
                 result[i] /= di[i];
             }
         }
         return(result);
     }
 }
Ejemplo n.º 30
0
        public static bool SisFrom(string vs, string ws, bool vToW, out bool ortogonal, out bool ortonormal, out double p, out SimpleVector <double> pV, out double ev, out double ew)
        {
            SimpleVector <double> v1, w1;

            if (VectorUtils.TryParseToVector(vs.Trim(), out v1) && VectorUtils.TryParseToVector(ws.Trim(), out w1) && v1.Size == w1.Size)
            {
                ev = v1.Sum(vl => System.Math.Pow(vl, 2));
                ew = w1.Sum(wl => System.Math.Pow(wl, 2));
                var v   = vToW ? v1 : w1;
                var w   = !vToW ? v1 : w1;
                var vMw = System.Math.Abs(v * w);
                var vMv = System.Math.Abs(v * v);
                ortogonal  = vMw <= 0;
                ortonormal = ortogonal && (System.Math.Abs(vMv - 1) <= 0 && System.Math.Abs(w * w - 1) <= 0);
                p          = vMw / vMv;
                p         *= 100;
                p          = System.Math.Round(p, 2);
                p         /= 100;
                pV         = p * v;
                pV.Round(2);
                return(true);
            }
            p          = 0;
            pV         = null;
            ev         = 0;
            ew         = 0;
            ortogonal  = false;
            ortonormal = false;
            return(false);
        }