public void HilbertMatrixSVD()
        {
            int          n = 4;
            SquareMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(n).ToSquareMatrix();

            SingularValueDecomposition SVD = H.SingularValueDecomposition();

            Assert.IsTrue(SVD.RowCount == n);
            Assert.IsTrue(SVD.ColumnCount == n);
            Assert.IsTrue(SVD.ConditionNumber > 1.0);

            // Reconstruct matrix
            SquareMatrix H2 = new SquareMatrix(n);

            foreach (SingularValueContributor contributor in SVD.Contributors)
            {
                H2 += contributor.SingularValue * ((SquareMatrix)(contributor.LeftSingularVector * contributor.RightSingularVector.Transpose));
            }

            // Use SVD to solve
            ColumnVector b = new ColumnVector(n);

            for (int i = 0; i < b.Dimension; i++)
            {
                b[i] = i;
            }
            ColumnVector x = SVD.Solve(b);

            Assert.IsTrue(TestUtilities.IsNearlyEqual(H * x, b));
        }
Exemple #2
0
 public void SymmetricHilbertMatrixEigenvalues()
 {
     for (int d = 1; d <= 8; d++)
     {
         SymmetricMatrix H  = TestUtilities.CreateSymmetricHilbertMatrix(d);
         double          tr = H.Trace();
         double[]        es = H.Eigenvalues();
         Assert.IsTrue(TestUtilities.IsSumNearlyEqual(es, tr));
     }
 }
Exemple #3
0
 public void SymmetricHilbertMatrixInverse()
 {
     for (int d = 1; d < 4; d++)
     {
         SymmetricMatrix H  = TestUtilities.CreateSymmetricHilbertMatrix(d);
         SymmetricMatrix HI = H.Inverse();
         Assert.IsTrue(TestUtilities.IsNearlyEqual(HI * H, UnitMatrix.OfDimension(d)));
     }
     // fails for d >= 4; look into this
 }
Exemple #4
0
 public void SymmetricHilbertMatrixInverse()
 {
     for (int d = 1; d <= 4; d++)
     {
         Console.WriteLine("d={0}", d);
         SquareMatrix    I  = TestUtilities.CreateSquareUnitMatrix(d);
         SymmetricMatrix H  = TestUtilities.CreateSymmetricHilbertMatrix(d);
         SymmetricMatrix HI = H.Inverse();
         Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, I));
     }
     // fails for d > 4! look into this
 }
Exemple #5
0
        public void SymmetricMatrixDecomposition()
        {
            for (int d = 1; d <= 4; d++)
            {
                SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d);

                CholeskyDecomposition CD = H.CholeskyDecomposition();
                Assert.IsTrue(CD != null, String.Format("d={0} not positive definite", d));
                Assert.IsTrue(CD.Dimension == d);
                SymmetricMatrix HI = CD.Inverse();
                SquareMatrix    I  = TestUtilities.CreateSquareUnitMatrix(d);
                Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, I));
            }
        }
Exemple #6
0
        public void HilbertMatrixCholeskyDecomposition()
        {
            for (int d = 1; d <= 4; d++)
            {
                SymmetricMatrix H = TestUtilities.CreateSymmetricHilbertMatrix(d);

                // Decomposition succeeds
                CholeskyDecomposition CD = H.CholeskyDecomposition();
                Assert.IsTrue(CD != null);
                Assert.IsTrue(CD.Dimension == d);

                // Decomposition works
                SquareMatrix S = CD.SquareRootMatrix();
                Assert.IsTrue(TestUtilities.IsNearlyEqual(S * S.Transpose, H));

                // Inverse works
                SymmetricMatrix HI = CD.Inverse();
                Assert.IsTrue(TestUtilities.IsNearlyEqual(H * HI, UnitMatrix.OfDimension(d)));
            }
        }