setMatrix([ [3, 1, 1], [1, 2, 2], [1, 2, 2], ]); $eig = new EigenvalueDecomposition($A); self::assertTrue($eig->isSymmetric()); self::assertEqualsWithDelta([0, 2, 5], $eig->getRealEigenvalues()->toArray(), 0.2); self::assertEqualsWithDelta([ [0, 2/\sqrt(6), 1/\sqrt(3)], [1/\sqrt(2), -1/\sqrt(6), 1/\sqrt(3)], [-1/\sqrt(2), -1/\sqrt(6), 1/\sqrt(3)], ], $eig->getV()->toArray(), 0.2); self::assertEqualsWithDelta([ [0, 0, 0], [0, 2, 0], [0, 0, 5], ], $eig->getD()->toArray(), 0.2); } public function testNonSymmetricMatrix() : void { $A = new Matrix(); $A->setMatrix([ [-2, -4, 2], [-2, 1, 2], [4, 2, 5], ]); $eig = new EigenvalueDecomposition($A); self::assertFalse($eig->isSymmetric()); self::assertEqualsWithDelta([-5, 3, 6], $eig->getRealEigenvalues()->toArray(), 0.2); self::assertEqualsWithDelta([ [-\sqrt(2/3), \sqrt(2/7), -1/\sqrt(293)], [-1/\sqrt(6), -3/\sqrt(14), -6/\sqrt(293)], [1/\sqrt(6), -1/\sqrt(14), -16/\sqrt(293)], ], $eig->getV()->toArray(), 0.2); self::assertEqualsWithDelta([ [-5, 0, 0], [0, 3, 0], [0, 0, 6], ], $eig->getD()->toArray(), 0.2); } public function testCompositeSymmetric() : void { $A = new Matrix(); $A->setMatrix([ [3, 1, 1], [1, 2, 2], [1, 2, 2], ]); $eig = new EigenvalueDecomposition($A); self::assertEqualsWithDelta( $A->toArray(), $eig->getV() ->mult($eig->getD()) ->mult($eig->getV()->transpose()) ->toArray() , 0.2); } public function testCompositeNonSymmetric() : void { $A = new Matrix(); $A->setMatrix([ [-2, -4, 2], [-2, 1, 2], [4, 2, 5], ]); $eig = new EigenvalueDecomposition($A); self::assertEqualsWithDelta( $A->toArray(), $eig->getV() ->mult($eig->getD()) ->mult($eig->getV()->inverse()) ->toArray(), 0.2 ); } }