public void CompareWithOriginalDenseMatrixWithoutPivoting() { var sparseMatrix = new SparseMatrix(3); sparseMatrix[0, 0] = -1; sparseMatrix[0, 1] = 5; sparseMatrix[0, 2] = 6; sparseMatrix[1, 0] = 3; sparseMatrix[1, 1] = -6; sparseMatrix[1, 2] = 1; sparseMatrix[2, 0] = 6; sparseMatrix[2, 1] = 8; sparseMatrix[2, 2] = 9; var ilu = new Ilutp { PivotTolerance = 0.0, DropTolerance = 0, FillLevel = 10 }; ilu.Initialize(sparseMatrix); var l = GetLowerTriangle(ilu); // Assert l is lower triagonal for (var i = 0; i < l.RowCount; i++) { for (var j = i + 1; j < l.RowCount; j++) { Assert.IsTrue(0.0.AlmostEqual(l[i, j], -Epsilon.Magnitude()), "#01-" + i + "-" + j); } } var u = GetUpperTriangle(ilu); // Assert u is upper triagonal for (var i = 0; i < u.RowCount; i++) { for (var j = 0; j < i; j++) { Assert.IsTrue(0.0.AlmostEqual(u[i, j], -Epsilon.Magnitude()), "#02-" + i + "-" + j); } } var original = l.Multiply(u); for (var i = 0; i < sparseMatrix.RowCount; i++) { for (var j = 0; j < sparseMatrix.ColumnCount; j++) { Assert.IsTrue(((double)sparseMatrix[i, j]).AlmostEqualInDecimalPlaces(original[i, j], 5), "#03-" + i + "-" + j); } } }
/// <summary> /// Check the result. /// </summary> /// <param name="preconditioner">Specific preconditioner.</param> /// <param name="matrix">Source matrix.</param> /// <param name="vector">Initial vector.</param> /// <param name="result">Result vector.</param> protected override void CheckResult(IPreConditioner preconditioner, SparseMatrix matrix, Vector <double> vector, Vector <double> result) { Assert.AreEqual(typeof(Diagonal), preconditioner.GetType(), "#01"); // Compute M * result = product // compare vector and product. Should be equal var product = new DenseVector(result.Count); matrix.Multiply(result, product); for (var i = 0; i < product.Count; i++) { Assert.IsTrue(vector[i].AlmostEqual(product[i], -Epsilon.Magnitude()), "#02-" + i); } }
protected override void CheckResult(IPreConditioner <Complex> preconditioner, SparseMatrix matrix, Vector <Complex> vector, Vector <Complex> result) { Assert.AreEqual(typeof(Ilutp), preconditioner.GetType(), "#01"); // Compute M * result = product // compare vector and product. Should be equal Vector <Complex> product = new DenseVector(result.Count); matrix.Multiply(result, product); for (var i = 0; i < product.Count; i++) { Assert.IsTrue(vector[i].Real.AlmostEqual(product[i].Real, -Epsilon.Magnitude()), "#02-" + i); Assert.IsTrue(vector[i].Imaginary.AlmostEqual(product[i].Imaginary, -Epsilon.Magnitude()), "#03-" + i); } }
public void CompareWithOriginalDenseMatrixWithPivoting() { var sparseMatrix = new SparseMatrix(3); sparseMatrix[0, 0] = -1; sparseMatrix[0, 1] = 5; sparseMatrix[0, 2] = 6; sparseMatrix[1, 0] = 3; sparseMatrix[1, 1] = -6; sparseMatrix[1, 2] = 1; sparseMatrix[2, 0] = 6; sparseMatrix[2, 1] = 8; sparseMatrix[2, 2] = 9; var ilu = new Ilutp { PivotTolerance = 1.0, DropTolerance = 0, FillLevel = 10 }; ilu.Initialize(sparseMatrix); var l = GetLowerTriangle(ilu); var u = GetUpperTriangle(ilu); var pivots = GetPivots(ilu); var p = new SparseMatrix(l.RowCount); for (var i = 0; i < p.RowCount; i++) { p[i, pivots[i]] = 1.0; } var temp = l.Multiply(u); var original = temp.Multiply(p); for (var i = 0; i < sparseMatrix.RowCount; i++) { for (var j = 0; j < sparseMatrix.ColumnCount; j++) { Assert.IsTrue(sparseMatrix[i, j].AlmostEqual(original[i, j], -Epsilon.Magnitude()), "#01-" + i + "-" + j); } } }
public void CompareWithOriginalDenseMatrixWithoutPivoting() { var sparseMatrix = new SparseMatrix(3); sparseMatrix[0, 0] = -1; sparseMatrix[0, 1] = 5; sparseMatrix[0, 2] = 6; sparseMatrix[1, 0] = 3; sparseMatrix[1, 1] = -6; sparseMatrix[1, 2] = 1; sparseMatrix[2, 0] = 6; sparseMatrix[2, 1] = 8; sparseMatrix[2, 2] = 9; var ilu = new ILUTPPreconditioner { PivotTolerance = 0.0, DropTolerance = 0, FillLevel = 10 }; ilu.Initialize(sparseMatrix); var l = GetLowerTriangle(ilu); // Assert l is lower triagonal for (var i = 0; i < l.RowCount; i++) { for (var j = i + 1; j < l.RowCount; j++) { Assert.IsTrue(0.0.AlmostEqualNumbersBetween(l[i, j].Magnitude, -Epsilon.Magnitude()), "#01-" + i + "-" + j); } } var u = GetUpperTriangle(ilu); // Assert u is upper triagonal for (var i = 0; i < u.RowCount; i++) { for (var j = 0; j < i; j++) { Assert.IsTrue(0.0.AlmostEqualNumbersBetween(u[i, j].Magnitude, -Epsilon.Magnitude()), "#02-" + i + "-" + j); } } var original = l.Multiply(u); for (var i = 0; i < sparseMatrix.RowCount; i++) { for (var j = 0; j < sparseMatrix.ColumnCount; j++) { Assert.IsTrue(sparseMatrix[i, j].Real.AlmostEqualNumbersBetween(original[i, j].Real, -Epsilon.Magnitude()), "#03-" + i + "-" + j); Assert.IsTrue(sparseMatrix[i, j].Imaginary.AlmostEqualNumbersBetween(original[i, j].Imaginary, -Epsilon.Magnitude()), "#04-" + i + "-" + j); } } }
public void CompareWithOriginalSparseMatrix() { var sparseMatrix = new SparseMatrix(3); sparseMatrix[0, 0] = -1; sparseMatrix[0, 1] = 5; sparseMatrix[0, 2] = 6; sparseMatrix[1, 0] = 3; sparseMatrix[1, 1] = -6; sparseMatrix[1, 2] = 1; sparseMatrix[2, 0] = 6; sparseMatrix[2, 1] = 8; sparseMatrix[2, 2] = 9; var ilu = new IncompleteLU(); ilu.Initialize(sparseMatrix); var original = GetLowerTriangle(ilu).Multiply(GetUpperTriangle(ilu)); for (var i = 0; i < sparseMatrix.RowCount; i++) { for (var j = 0; j < sparseMatrix.ColumnCount; j++) { Assert.IsTrue(sparseMatrix[i, j].Real.AlmostEqual(original[i, j].Real, -Epsilon.Magnitude()), "#01-" + i + "-" + j); Assert.IsTrue(sparseMatrix[i, j].Imaginary.AlmostEqual(original[i, j].Imaginary, -Epsilon.Magnitude()), "#02-" + i + "-" + j); } } }
public void CompareWithOriginalSparseMatrix() { var sparseMatrix = new SparseMatrix(3); sparseMatrix[0, 0] = -1; sparseMatrix[0, 1] = 5; sparseMatrix[0, 2] = 6; sparseMatrix[1, 0] = 3; sparseMatrix[1, 1] = -6; sparseMatrix[1, 2] = 1; sparseMatrix[2, 0] = 6; sparseMatrix[2, 1] = 8; sparseMatrix[2, 2] = 9; var ilu = new ILU0Preconditioner(); ilu.Initialize(sparseMatrix); var original = GetLowerTriangle(ilu).Multiply(GetUpperTriangle(ilu)); for (var i = 0; i < sparseMatrix.RowCount; i++) { for (var j = 0; j < sparseMatrix.ColumnCount; j++) { Assert.IsTrue(sparseMatrix[i, j].AlmostEqualNumbersBetween(original[i, j], -Epsilon.Magnitude()), "#01-" + i + "-" + j); } } }