/// <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)); }
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); }
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()); } } }
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();
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()); } } }
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); }