public void InverseTest() { double[,] value = { { 2, 3, 0 }, { -1, 2, 1 }, { 0, -1, 3 } }; double[,] expectedInverse = { { 0.3043, -0.3913, 0.1304 }, { 0.1304, 0.2609, -0.0870 }, { 0.0435, 0.0870, 0.3043 }, }; var target = new LuDecomposition(value); double[,] actualInverse = target.Inverse(); Assert.IsTrue(Matrix.IsEqual(expectedInverse, actualInverse, 0.001)); Assert.IsTrue(Matrix.IsEqual(value, target.Reverse())); var target2 = new JaggedLuDecomposition(value.ToJagged()); actualInverse = target2.Inverse().ToMatrix(); Assert.IsTrue(Matrix.IsEqual(expectedInverse, actualInverse, 0.001)); Assert.IsTrue(Matrix.IsEqual(value, target2.Reverse())); }
public void SolveTest1() { double[,] value = { { 2, 3, 0 }, { -1, 2, 1 }, { 0, -1, 3 } }; double[] rhs = { 5, 0, 1 }; double[] expected = { 1.6522, 0.5652, 0.5217, }; var target = new LuDecomposition(value); double[] actual = target.Solve(rhs); Assert.IsTrue(Matrix.IsEqual(expected, actual, 1e-3)); Assert.IsTrue(Matrix.IsEqual(value, target.Reverse())); var target2 = new JaggedLuDecomposition(value.ToJagged()); actual = target2.Solve(rhs); Assert.IsTrue(Matrix.IsEqual(expected, actual, 1e-3)); Assert.IsTrue(Matrix.IsEqual(value, target2.Reverse())); }
public void JaggedDeterminantTest() { double[,] value = { { 2, 3, 0 }, { -1, 2, 1 }, { 0, -1, 3 } }; var lu = new JaggedLuDecomposition(value.ToJagged()); Assert.AreEqual(23, lu.Determinant); Assert.IsTrue(lu.Nonsingular); }
public void SolveTest4() { double[,] value = { { 2.1, 3.1 }, { 1.6, 4.2 }, }; double[] rhs = { 6.1, 4.3 }; double[] expected = { 3.1839, -0.1891 }; var target1 = new LuDecomposition(value); var target2 = new JaggedLuDecomposition(value.ToJagged()); Assert.IsTrue(Matrix.IsEqual(expected, target1.Solve(rhs), 1e-3)); Assert.IsTrue(Matrix.IsEqual(expected, target2.Solve(rhs), 1e-3)); }
public void InverseTestNaN() { int n = 5; var I = Matrix.Identity(n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { double[,] value = Matrix.Magic(n); value[i, j] = double.NaN; var target = new LuDecomposition(value); Assert.IsTrue(Matrix.IsEqual(target.Solve(I), target.Inverse())); var target2 = new JaggedLuDecomposition(value.ToJagged()); Assert.IsTrue(Matrix.IsEqual(target2.Solve(I.ToJagged()), target2.Inverse())); } } }
public void LuDecompositionConstructorTest() { #region doc_ctor // Let's say we would like to compute the // LU decomposition of the following matrix: double[][] matrix = { new double[] { 2, -1, 0 }, new double[] { -1, 2, -1 }, new double[] { 0, -1, 2 } }; // Compute the LU decomposition with: var lu = new JaggedLuDecomposition(matrix); // Retrieve the lower triangular factor L: double[][] L = lu.LowerTriangularFactor; // Should be equal to double[][] expectedL = { new double[] { 1.0000, 0, 0 }, new double[] { -0.5000, 1.0000, 0 }, new double[] { 0, -0.6667, 1.0000 }, }; // Retrieve the upper triangular factor U: double[][] U = lu.UpperTriangularFactor; // Should be equal to double[][] expectedU = { new double[] { 2.0000, -1.0000, 0 }, new double[] { 0, 1.5000, -1.0000 }, new double[] { 0, 0, 1.3333 }, }; // Certify that the decomposition has worked as expected by // trying to reconstruct the original matrix with R = L * U: double[][] reconstruction = L.Dot(U); // reconstruction should be equal to // { // { 2, -1, 0 }, // { -1, 2, -1 }, // { 0, -1, 2 } // }; #endregion Assert.IsTrue(Matrix.IsEqual(matrix, reconstruction, 1e-4)); Assert.IsTrue(Matrix.IsEqual(expectedL, L, 1e-4)); Assert.IsTrue(Matrix.IsEqual(expectedU, U, 1e-4)); lu = new JaggedLuDecomposition(matrix.Transpose(), true); L = lu.LowerTriangularFactor; U = lu.UpperTriangularFactor; Assert.IsTrue(Matrix.IsEqual(expectedL, L, 0.001)); Assert.IsTrue(Matrix.IsEqual(expectedU, U, 0.001)); }