package ch.akuhn.matrix.eigenvalues; import static org.junit.Assert.assertEquals; import org.junit.Test; import ch.akuhn.matrix.Matrix; public class FewEigenvaluesTest { private FewEigenvalues eigen; private Matrix A; private Matrix randomSymetricMatrix(int n) { Matrix S = Matrix.dense(n, n); for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { double value = Math.random() * 23; S.put(i, j, value); S.put(j, i, value); } } return S; } @Test public void shouldDecomposeRandomArray() { A = randomSymetricMatrix(100); eigen = FewEigenvalues.of(A).largest(40); eigen.run(); assert eigen.value.length == 40; assert eigen.vector.length == 40; } @Test // @Given("shouldDecomposeRandomArray") public void shouldReturnSortedEigenvalues() { shouldDecomposeRandomArray(); for (int i = 1; i < 40; i++) { assert eigen.value[i - 1] <= eigen.value[i]; assert eigen.value[i] > 0; // should be likely :) } } @Test // @Given("shouldDecomposeRandomArray") public void shouldReturnEigenvectors() { shouldDecomposeRandomArray(); for (int i = 1; i < 40; i++) { assert eigen.vector[i] != null; assert eigen.vector[i].size() == 100; } } @Test // @Given("shouldDecomposeRandomArray") public void matrixEigenvectorMultiplicationShouldEqualEigenvectorTimesEigenvalue() { shouldDecomposeRandomArray(); for (int i = 0; i < 40; i++) { assert eigen.vector[i].times(eigen.value[i]).equals(A.mult(eigen.vector[i]), 1e-6); } } @Test public void shouldDecomposeSmallMatrix() { A = Matrix.from(3, 3, 0, 1, -1, 1, 1, 0, -1, 0, 1); eigen = FewEigenvalues.of(A).largest(2); eigen.run(); assertEquals(1, eigen.value[0], 1e-6); assertEquals(2, eigen.value[1], 1e-6); assert A.mult(eigen.vector[0]).equals(eigen.vector[0].times(eigen.value[0]), 1e-6); assert A.mult(eigen.vector[1]).equals(eigen.vector[1].times(eigen.value[1]), 1e-6); } }