public void TridiagonalMatrixDuplicationTest()
        {
            TridiagonalMatrix T = CreateRandomTridiagonalMatrix(4);

            // check that clone is clone
            TridiagonalMatrix TC = T.Copy();

            Assert.IsTrue(TC == T);

            // check that clone is independend
            TC[0, 0] += 1.0;
            Assert.IsTrue(TC != T);

            // check that transpose of transpose is original
            TridiagonalMatrix TT = T.Transpose();

            Assert.IsTrue(TT != T);
            TridiagonalMatrix TTT = TT.Transpose();

            Assert.IsTrue(TTT == T);

            // check that transpose is independent
            TTT[0, 0] += 1.0;
            Assert.IsTrue(TTT != T);
        }
Exemplo n.º 2
0
        public void TridiagonalMatrixFibinacciDeterminant()
        {
            // The n X n tri-diagonal matrix with 1s on the diagonal,
            // 1s on the super-diagonal, and -1s on the sub-diagonal
            // has determinant equal to the (n+1)th Fibonacci number.

            foreach (int n in TestUtilities.GenerateIntegerValues(2, 128, 4))
            {
                TridiagonalMatrix T = new TridiagonalMatrix(n);
                for (int i = 0; i < n; i++)
                {
                    T[i, i] = 1.0;
                }
                for (int i = 1; i < n; i++)
                {
                    T[i - 1, i] = 1.0;
                    T[i, i - 1] = -1.0;
                }

                Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                  T.Determinant(),
                                  AdvancedIntegerMath.FibonacciNumber(n + 1)
                                  ));
            }
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void testTridiagonalMultiply()
        public virtual void testTridiagonalMultiply()
        {
            const int n = 37;

            double[] l = new double[n - 1];
            double[] c = new double[n];
            double[] u = new double[n - 1];
            double[] x = new double[n];

            for (int ii = 0; ii < n; ii++)
            {
                c[ii] = RANDOM.nextRandom();
                x[ii] = RANDOM.nextRandom();
                if (ii < n - 1)
                {
                    l[ii] = RANDOM.nextRandom();
                    u[ii] = RANDOM.nextRandom();
                }
            }

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.math.impl.linearalgebra.TridiagonalMatrix m = new com.opengamma.strata.math.impl.linearalgebra.TridiagonalMatrix(c, u, l);
            TridiagonalMatrix m = new TridiagonalMatrix(c, u, l);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.collect.array.DoubleArray xVec = com.opengamma.strata.collect.array.DoubleArray.copyOf(x);
            DoubleArray  xVec = DoubleArray.copyOf(x);
            DoubleArray  y1   = (DoubleArray)ALGEBRA.multiply(m, xVec);
            DoubleMatrix full = m.toDoubleMatrix();
            DoubleArray  y2   = (DoubleArray)ALGEBRA.multiply(full, xVec);

            for (int i = 0; i < n; i++)
            {
                assertEquals(y1.get(i), y2.get(i), 1e-12);
            }
        }
Exemplo n.º 4
0
        public void TestInvert4()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(4);

            m.Data[0, 0] = 2; m.Data[0, 1] = 1; m.Data[0, 2] = 0; m.Data[0, 3] = 0;
            m.Data[1, 0] = 1; m.Data[1, 1] = 4; m.Data[1, 2] = 1; m.Data[1, 3] = 0;
            m.Data[2, 0] = 0; m.Data[2, 1] = 1; m.Data[2, 2] = 4; m.Data[2, 3] = 1;
            m.Data[3, 0] = 0; m.Data[3, 1] = 0; m.Data[3, 2] = 1; m.Data[3, 3] = 2;

            m.Invert();

            // Check data.
            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(0, m.Data[0, 1]);
            Assert.AreEqual(0, m.Data[0, 2]);
            Assert.AreEqual(0, m.Data[0, 3]);

            Assert.AreEqual(0, m.Data[1, 0]);
            Assert.AreEqual(1, m.Data[1, 1]);
            Assert.AreEqual(0, m.Data[1, 2]);
            Assert.AreEqual(0, m.Data[1, 3]);

            Assert.AreEqual(0, m.Data[2, 0]);
            Assert.AreEqual(0, m.Data[2, 1]);
            Assert.AreEqual(1, m.Data[2, 2]);
            Assert.AreEqual(0, m.Data[2, 3]);

            Assert.AreEqual(0, m.Data[3, 0]);
            Assert.AreEqual(0, m.Data[3, 1]);
            Assert.AreEqual(0, m.Data[3, 2]);
            Assert.AreEqual(1, m.Data[3, 3]);

            // Check inverse.
            Assert.AreEqual(new Fraction(26, 45), m.Inverse[0, 0]);
            Assert.AreEqual(new Fraction(-7, 45), m.Inverse[0, 1]);
            Assert.AreEqual(new Fraction(2, 45), m.Inverse[0, 2]);
            Assert.AreEqual(new Fraction(-1, 45), m.Inverse[0, 3]);

            Assert.AreEqual(new Fraction(-7, 45), m.Inverse[1, 0]);
            Assert.AreEqual(new Fraction(14, 45), m.Inverse[1, 1]);
            Assert.AreEqual(new Fraction(-4, 45), m.Inverse[1, 2]);
            Assert.AreEqual(new Fraction(2, 45), m.Inverse[1, 3]);

            Assert.AreEqual(new Fraction(2, 45), m.Inverse[2, 0]);
            Assert.AreEqual(new Fraction(-4, 45), m.Inverse[2, 1]);
            Assert.AreEqual(new Fraction(14, 45), m.Inverse[2, 2]);
            Assert.AreEqual(new Fraction(-7, 45), m.Inverse[2, 3]);

            Assert.AreEqual(new Fraction(-1, 45), m.Inverse[3, 0]);
            Assert.AreEqual(new Fraction(2, 45), m.Inverse[3, 1]);
            Assert.AreEqual(new Fraction(-7, 45), m.Inverse[3, 2]);
            Assert.AreEqual(new Fraction(26, 45), m.Inverse[3, 3]);
        }
Exemplo n.º 5
0
        public void TestInvert3()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(4);

            m.Data[0, 0] = 3; m.Data[0, 1] = 2; m.Data[0, 2] = 0; m.Data[0, 3] = 0;
            m.Data[1, 0] = 2; m.Data[1, 1] = 5; m.Data[1, 2] = 2; m.Data[1, 3] = 0;
            m.Data[2, 0] = 0; m.Data[2, 1] = 2; m.Data[2, 2] = 1; m.Data[2, 3] = 2;
            m.Data[3, 0] = 0; m.Data[3, 1] = 0; m.Data[3, 2] = 2; m.Data[3, 3] = 7;

            m.Invert();

            // Check data.
            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(0, m.Data[0, 1]);
            Assert.AreEqual(0, m.Data[0, 2]);
            Assert.AreEqual(0, m.Data[0, 3]);

            Assert.AreEqual(0, m.Data[1, 0]);
            Assert.AreEqual(1, m.Data[1, 1]);
            Assert.AreEqual(0, m.Data[1, 2]);
            Assert.AreEqual(0, m.Data[1, 3]);

            Assert.AreEqual(0, m.Data[2, 0]);
            Assert.AreEqual(0, m.Data[2, 1]);
            Assert.AreEqual(1, m.Data[2, 2]);
            Assert.AreEqual(0, m.Data[2, 3]);

            Assert.AreEqual(0, m.Data[3, 0]);
            Assert.AreEqual(0, m.Data[3, 1]);
            Assert.AreEqual(0, m.Data[3, 2]);
            Assert.AreEqual(1, m.Data[3, 3]);

            // Check inverse.
            Assert.AreEqual(new Fraction(13, 51), m.Inverse[0, 0]);
            Assert.AreEqual(new Fraction(2, 17), m.Inverse[0, 1]);
            Assert.AreEqual(new Fraction(-28, 51), m.Inverse[0, 2]);
            Assert.AreEqual(new Fraction(8, 51), m.Inverse[0, 3]);

            Assert.AreEqual(new Fraction(2, 17), m.Inverse[1, 0]);
            Assert.AreEqual(new Fraction(-3, 17), m.Inverse[1, 1]);
            Assert.AreEqual(new Fraction(14, 17), m.Inverse[1, 2]);
            Assert.AreEqual(new Fraction(-4, 17), m.Inverse[1, 3]);

            Assert.AreEqual(new Fraction(-28, 51), m.Inverse[2, 0]);
            Assert.AreEqual(new Fraction(14, 17), m.Inverse[2, 1]);
            Assert.AreEqual(new Fraction(-77, 51), m.Inverse[2, 2]);
            Assert.AreEqual(new Fraction(22, 51), m.Inverse[2, 3]);

            Assert.AreEqual(new Fraction(8, 51), m.Inverse[3, 0]);
            Assert.AreEqual(new Fraction(-4, 17), m.Inverse[3, 1]);
            Assert.AreEqual(new Fraction(22, 51), m.Inverse[3, 2]);
            Assert.AreEqual(new Fraction(1, 51), m.Inverse[3, 3]);
        }
Exemplo n.º 6
0
        public void TridiagonalMatrixAccessTest()
        {
            TridiagonalMatrix T = CreateRandomTridiagonalMatrix(4);

            // check nullity
            Assert.IsTrue(T != null);

            // check dimension
            Assert.IsTrue(T.Dimension == 4);

            // check off-diagonal element
            Assert.IsTrue(T[0, 3] == 0.0);
        }
Exemplo n.º 7
0
        public TridiagonalMatrix CreateRandomTridiagonalMatrix(int n, Random rng)
        {
            TridiagonalMatrix T = new TridiagonalMatrix(n);

            for (int i = 0; i < (n - 1); i++)
            {
                T[i, i]     = 2.0 * rng.NextDouble() - 1.0;
                T[i + 1, i] = 2.0 * rng.NextDouble() - 1.0;
                T[i, i + 1] = 2.0 * rng.NextDouble() - 1.0;
            }
            T[n - 1, n - 1] = 2.0 * rng.NextDouble() - 1.0;
            return(T);
        }
Exemplo n.º 8
0
        public void TestRowSubtract2()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(2);

            m.Data[0, 0] = 1;
            m.Data[0, 1] = 2;
            m.Data[1, 0] = 3;
            m.Data[1, 1] = 4;

            m.RowSubtract(1, 0);

            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(2, m.Data[0, 1]);
            Assert.AreEqual(2, m.Data[1, 0]);
            Assert.AreEqual(2, m.Data[1, 1]);
        }
Exemplo n.º 9
0
        public void TestRowMulitply2()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(2);

            m.Data[0, 0] = 1;
            m.Data[0, 1] = 2;
            m.Data[1, 0] = 3;
            m.Data[1, 1] = 4;

            m.RowMultiply(1, -2);

            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(2, m.Data[0, 1]);
            Assert.AreEqual(-6, m.Data[1, 0]);
            Assert.AreEqual(-8, m.Data[1, 1]);
        }
Exemplo n.º 10
0
        public void TestRowMulitply1()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(2);

            m.Data[0, 0] = 1;
            m.Data[0, 1] = 2;
            m.Data[1, 0] = 3;
            m.Data[1, 1] = 4;

            m.RowMultiply(0, 2);

            Assert.AreEqual(2, m.Data[0, 0]);
            Assert.AreEqual(4, m.Data[0, 1]);
            Assert.AreEqual(3, m.Data[1, 0]);
            Assert.AreEqual(4, m.Data[1, 1]);
        }
        public void TridiagonalMatrixLUDecompositionTest()
        {
            for (int d = 3; d < 100; d = 2 * d)
            {
                Console.WriteLine("d={0}", d);

                TridiagonalMatrix T = CreateRandomTridiagonalMatrix(d);
                Assert.IsTrue(T.Dimension == d);


                TridiagonalLUDecomposition LU = T.LUDecomposition();
                Assert.IsTrue(LU.Dimension == d);

                // check determinant
                Assert.IsTrue(TestUtilities.IsNearlyEqual(LU.Determinant(), T.Determinant()));

                //SquareMatrix P = LU.PMatrix();
                //SquareMatrix L = LU.LMatrix();
                //SquareMatrix U = LU.UMatrix();

                //SquareMatrixTest.PrintMatrix(T);
                //SquareMatrixTest.PrintMatrix(L);
                //SquareMatrixTest.PrintMatrix(U);
                //SquareMatrixTest.PrintMatrix(L * U);


                // check solution to decomposition
                ColumnVector b = new ColumnVector(d);
                for (int i = 0; i < d; i++)
                {
                    b[i] = i;
                }
                ColumnVector x = LU.Solve(b);
                Assert.IsTrue(TestUtilities.IsNearlyEqual(T * x, b));

                // test inverse
                SquareMatrix TI = LU.Inverse();
                SquareMatrix I  = new SquareMatrix(d);
                for (int i = 0; i < d; i++)
                {
                    I[i, i] = 1.0;
                }
                Assert.IsTrue(TestUtilities.IsNearlyEqual(TI * T, I));
            }
        }
Exemplo n.º 12
0
        private DoubleArray multiply(DoubleArray vector, TridiagonalMatrix matrix)
        {
            double[] a = matrix.LowerSubDiagonalData;
            double[] b = matrix.DiagonalData;
            double[] c = matrix.UpperSubDiagonalData;
            double[] x = vector.toArrayUnsafe();
            int      n = x.Length;

            ArgChecker.isTrue(b.Length == n, "Matrix/vector size mismatch");
            double[] res = new double[n];
            int      i;

            res[0]     = b[0] * x[0] + a[0] * x[1];
            res[n - 1] = b[n - 1] * x[n - 1] + c[n - 2] * x[n - 2];
            for (i = 1; i < n - 1; i++)
            {
                res[i] = a[i] * x[i + 1] + b[i] * x[i] + c[i - 1] * x[i - 1];
            }
            return(DoubleArray.ofUnsafe(res));
        }
            internal static DoubleMatrix getInverseTridiagonalMatrix(double[] deltaX, bool leftNatural, bool rightNatural)
            {
                InverseTridiagonalMatrixCalculator invertor = new InverseTridiagonalMatrixCalculator();
                int n = deltaX.Length + 1;

                double[] a = new double[n];
                double[] b = new double[n - 1];
                double[] c = new double[n - 1];
                for (int i = 1; i < n - 1; i++)
                {
                    a[i]     = (deltaX[i - 1] + deltaX[i]) / 3.0;
                    b[i]     = deltaX[i] / 6.0;
                    c[i - 1] = deltaX[i - 1] / 6.0;
                }

                // Boundary condition
                if (leftNatural)
                {
                    a[0] = 1.0;
                    b[0] = 0.0;
                }
                else
                {
                    a[0] = -deltaX[0] / 3.0;
                    b[0] = deltaX[0] / 6.0;
                }
                if (rightNatural)
                {
                    a[n - 1] = 1.0;
                    c[n - 2] = 0.0;
                }
                else
                {
                    a[n - 1] = deltaX[n - 2] / 3.0;
                    c[n - 2] = deltaX[n - 2] / 6.0;
                }

                TridiagonalMatrix tridiagonal = new TridiagonalMatrix(a, b, c);

                return(invertor.apply(tridiagonal));
            }
Exemplo n.º 14
0
        public void TestInvert1()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(2);

            m.Data[0, 0] = 2;
            m.Data[0, 1] = 1;
            m.Data[1, 0] = 1;
            m.Data[1, 1] = 4;

            m.Invert();

            // Check data.
            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(0, m.Data[0, 1]);
            Assert.AreEqual(0, m.Data[1, 0]);
            Assert.AreEqual(1, m.Data[1, 1]);

            // Check inverse.
            Assert.AreEqual(new Fraction(256, 448), m.Inverse[0, 0]);
            Assert.AreEqual(new Fraction(-64, 448), m.Inverse[0, 1]);
            Assert.AreEqual(new Fraction(-2, 14), m.Inverse[1, 0]);
            Assert.AreEqual(new Fraction(4, 14), m.Inverse[1, 1]);
        }
Exemplo n.º 15
0
        public void TestInvert2()
        {
            TridiagonalMatrix m = new TridiagonalMatrix(3);

            m.Data[0, 0] = 2; m.Data[0, 1] = 1; m.Data[0, 2] = 0;
            m.Data[1, 0] = 1; m.Data[1, 1] = 4; m.Data[1, 2] = 1;
            m.Data[2, 0] = 0; m.Data[2, 1] = 1; m.Data[2, 2] = 2;

            m.Invert();

            // Check data.
            Assert.AreEqual(1, m.Data[0, 0]);
            Assert.AreEqual(0, m.Data[0, 1]);
            Assert.AreEqual(0, m.Data[0, 2]);

            Assert.AreEqual(0, m.Data[1, 0]);
            Assert.AreEqual(1, m.Data[1, 1]);
            Assert.AreEqual(0, m.Data[1, 2]);

            Assert.AreEqual(0, m.Data[2, 0]);
            Assert.AreEqual(0, m.Data[2, 1]);
            Assert.AreEqual(1, m.Data[2, 2]);

            // Check inverse.
            Assert.AreEqual(new Fraction(7, 12), m.Inverse[0, 0]);
            Assert.AreEqual(new Fraction(-1, 6), m.Inverse[0, 1]);
            Assert.AreEqual(new Fraction(1, 12), m.Inverse[0, 2]);

            Assert.AreEqual(new Fraction(-1, 6), m.Inverse[1, 0]);
            Assert.AreEqual(new Fraction(1, 3), m.Inverse[1, 1]);
            Assert.AreEqual(new Fraction(-1, 6), m.Inverse[1, 2]);

            Assert.AreEqual(new Fraction(1, 12), m.Inverse[2, 0]);
            Assert.AreEqual(new Fraction(-1, 6), m.Inverse[2, 1]);
            Assert.AreEqual(new Fraction(7, 12), m.Inverse[2, 2]);
        }