/// <summary>
        /// Maps the non-negative abscissas/weights from the interval [-1, 1] to the interval [intervalBegin, intervalEnd].
        /// </summary>
        /// <param name="intervalBegin">Where the interval starts, inclusive and finite.</param>
        /// <param name="intervalEnd">Where the interval stops, inclusive and finite.</param>
        /// <param name="gaussPoint">Object containing the non-negative abscissas/weights, order, and intervalBegin/intervalEnd. The non-negative abscissas/weights are generated over the interval [-1,1] for the given order.</param>
        /// <returns>Object containing the abscissas/weights, order, and intervalBegin/intervalEnd.</returns>
        private static GaussPoint <T> Map <T>(
            T intervalBegin,
            T intervalEnd,
            GaussPoint gaussPoint) where T : unmanaged
        {
            //TODO: not sure wat this work for Complex
            var la        = LinearAlgebraFactory.GetLinearAlgebra <T>();
            var abscissas = new T[gaussPoint.Order];
            var weights   = new T[gaussPoint.Order];
            var num1      = la.Mult(la.Cast(0.5), la.Sub(intervalEnd, intervalBegin));
            var num2      = la.Mult(la.Cast(0.5), la.Sum(intervalEnd, intervalBegin));
            var num3      = gaussPoint.Order + 1 >> 1;

            for (var index1 = 1; index1 <= num3; ++index1)
            {
                var index2 = gaussPoint.Order - index1;
                var index3 = index1 - 1;
                var index4 = num3 - index1;
                abscissas[index2] = la.Sum(la.Mult(la.Cast(gaussPoint.Abscissas[index4]), num1), num2);

                abscissas[index3] = la.Sum(la.Mult(la.Cast(gaussPoint.Abscissas[index4]), la.Mult(num1, la.Cast(-1))), num2);
                weights[index2]   = weights[index3] = la.Mult(la.Cast(gaussPoint.Weights[index4]), num1);
            }

            return(new GaussPoint <T>(gaussPoint.Order, abscissas, weights, intervalBegin, intervalEnd));
        }
Example #2
0
        public static IMatrix <T> Mult <T>(this IMatrix <T> a, IMatrix <T> b) where T : unmanaged
        {
            //TODO: fix this check, problem with Columns for SpraseMatrix
            if (a.ColumnsCount.Max() != b.RowCount)
            {
                throw new Exception("Cant multiplicate two matrix because ColumnsCount not Equal RowsCount");
            }

            var la = LinearAlgebraFactory.GetLinearAlgebra <T>();
            //TODO: fix this allocation, problem with Columns for SpraseMatrix

            var matrixC = new Matrix <T>(a.RowCount, b.ColumnsCount.Max());

            for (var i = 0; i < a.RowCount; i++)
            {
                for (var k = 0; k < a.ColumnsCount[i]; k++)
                {
                    for (var j = 0; j < b.ColumnsCount[k]; j++)
                    {
                        matrixC[i, j] = la.Sum(matrixC[i, j], la.Mult(a[i, k], b[k, j]));
                    }
                }
            }

            return(matrixC);
        }
Example #3
0
        public void WriteSolutionIntoConsoleMachineReadable()
        {
            var la = LinearAlgebraFactory.GetLinearAlgebra <long>();

            if (Messages.Any())
            {
                Messages.ForEach(Console.WriteLine);
            }
            else
            {
                Console.WriteLine($"{CountOfFreeVariables}");

                for (var i = 0; i < CountOfUnknown; ++i)
                {
                    var stringBuilder = new StringBuilder("");
                    // Particular solution of the equation for i row
                    stringBuilder.Append($"{Matrix[i + CountOfEquation][CountOfUnknown]} ");

                    if (CountOfFreeVariables <= 0)
                    {
                        Console.WriteLine(stringBuilder.ToString());
                        continue;
                    }

                    // Free variables for i row
                    for (var j = 0; j < CountOfFreeVariables - 1; ++j)
                    {
                        stringBuilder.Append($"{Matrix[i + CountOfEquation][CountOfUnknown - CountOfFreeVariables + j]} ");
                    }

                    stringBuilder.Append($"{Matrix[i + CountOfEquation][CountOfUnknown - 1]} ");
                    Console.WriteLine(stringBuilder.ToString());
                }
            }
        }
Example #4
0
        public static T Determinant <T>(this IMatrix <T> matrix) where T : unmanaged
        {
            //TODO: fix this check
            if (matrix.RowCount != matrix.ColumnsCount.Max())
            {
                throw new Exception("matrix need to be square.");
            }

            if (matrix.RowCount == 1 && matrix.ColumnsCount.Max() == 1)
            {
                return(matrix[0, 0]);
            }

            var la = LinearAlgebraFactory.GetLinearAlgebra <T>();

            if (matrix.RowCount == 2)
            {
                return(la.Sub(la.Mult(matrix[0, 0], matrix[1, 1]), la.Mult(matrix[0, 1], matrix[1, 0])));
            }

            T sum = la.GetZeroValue();
Example #5
0
        public void WriteSolutionIntoConsoleHumanReadable()
        {
            var la = LinearAlgebraFactory.GetLinearAlgebra <long>();

            if (Messages.Any())
            {
                Messages.ForEach(Console.WriteLine);
            }
            else
            {
                Console.WriteLine($"Count of free variables : {CountOfFreeVariables}");

                for (var i = 0; i < CountOfUnknown; ++i)
                {
                    var stringBuilder = new StringBuilder($"Unknown({i})=");
                    // Particular solution of the equation for i row
                    stringBuilder.Append($"{Matrix[i + CountOfEquation][CountOfUnknown]}");

                    if (CountOfFreeVariables <= 0)
                    {
                        Console.WriteLine(stringBuilder.ToString());

                        continue;
                    }

                    // Free variables for i row
                    for (var j = 0; j < CountOfFreeVariables - 1; ++j)
                    {
                        stringBuilder.Append(la.Sign(Matrix[i + CountOfEquation][CountOfUnknown - CountOfFreeVariables + j]) >= 0 ? " + " : " - ");
                        stringBuilder.Append($"{Math.Abs(Matrix[i + CountOfEquation][CountOfUnknown - CountOfFreeVariables + j])}*Variable({j})");
                    }

                    stringBuilder.Append(la.Sign(Matrix[i + CountOfEquation][CountOfUnknown - 1]) >= 0 ? " + " : " - ");
                    stringBuilder.Append($"{Math.Abs(Matrix[i + CountOfEquation][CountOfUnknown - 1])}*Variable({CountOfFreeVariables})");
                    Console.WriteLine(stringBuilder.ToString());
                }
            }
        }
Example #6
0
        public static IVector <T> Mult <T>(this IMatrix <T> a, IVector <T> b) where T : unmanaged
        {
            //TODO: fix this check, problem with Columns for SpraseMatrix

            if (a.ColumnsCount.Max() != b.Count)
            {
                throw new Exception("Cant multiplicate matrix and vector because ColumnsCount not Equal Count");
            }

            var la = LinearAlgebraFactory.GetLinearAlgebra <T>();

            var vector = new Vector <T>(a.RowCount);

            for (var i = 0; i < a.RowCount; i++)
            {
                for (var j = 0; j < a.ColumnsCount[i]; j++)
                {
                    vector[i] = la.Sum(vector[i], la.Mult(a[i, j], b[j]));
                }
            }

            return(vector);
        }