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); }
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); } }
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]); }
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]); }
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); }
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); }
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]); }
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]); }
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)); } }
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)); }
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]); }
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]); }