HouseholderTest.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace MathPHP\Tests\LinearAlgebra\Matrix\Other;
  3. use MathPHP\LinearAlgebra\Householder;
  4. use MathPHP\LinearAlgebra\MatrixFactory;
  5. class HouseholderTest extends \PHPUnit\Framework\TestCase
  6. {
  7. use \MathPHP\Tests\LinearAlgebra\Fixture\MatrixDataProvider;
  8. /**
  9. * @test Householder transformation creates a matrix that is involutory
  10. * @dataProvider dataProviderForHouseholder
  11. * @param array $A
  12. * @throws \Exception
  13. */
  14. public function testHouseholderTransformMatrixInvolutoryProperty(array $A)
  15. {
  16. // Given
  17. $A = MatrixFactory::create($A);
  18. // When
  19. $H = Householder::transform($A);
  20. // Then
  21. $this->assertTrue($H->isInvolutory());
  22. }
  23. /**
  24. * @test Householder transformation creates a matrix with a determinant that is -1
  25. * @dataProvider dataProviderForHouseholder
  26. * @param array $A
  27. * @throws \Exception
  28. */
  29. public function testHouseholderTransformMatrixDeterminant(array $A)
  30. {
  31. // Given
  32. $A = MatrixFactory::create($A);
  33. // When
  34. $H = Householder::transform($A);
  35. // Then
  36. $this->assertEqualsWithDelta(-1, $H->det(), 0.000001);
  37. }
  38. /**
  39. * @test Householder transformation creates a matrix that has eigenvalues 1 and -1
  40. * @dataProvider dataProviderForHouseholder
  41. * @param array $A
  42. * @throws \Exception
  43. */
  44. public function testHouseholderTransformMatrixEigenvalues(array $A)
  45. {
  46. // Given
  47. $A = MatrixFactory::create($A);
  48. // When
  49. $H = Householder::transform($A);
  50. // Then
  51. $eigenvalues = \array_filter(
  52. $H->eigenvalues(),
  53. function ($x) {
  54. return !\is_nan($x);
  55. }
  56. );
  57. $this->assertEqualsWithDelta(1, max($eigenvalues), 0.00001);
  58. $this->assertEqualsWithDelta(-1, \min($eigenvalues), 0.00001);
  59. }
  60. /**
  61. * @return array
  62. */
  63. public function dataProviderForHouseholder(): array
  64. {
  65. return [
  66. [
  67. [
  68. [4, 1, -2, 2],
  69. [1, 2, 0, 1],
  70. [-2, 0, 3, -2],
  71. [2, 1, -2, -1],
  72. ]
  73. ],
  74. [
  75. [
  76. [1, 0, 0, 0],
  77. [0, -1 / 3, 2 / 3, -2 / 3],
  78. [0, 2 / 3, 2 / 3, 1 / 3],
  79. [0, -2 / 3, 1 / 3, 2 / 3],
  80. ]
  81. ],
  82. [
  83. [
  84. [1, 0, 0, 0],
  85. [0, 1, 0, 0],
  86. [0, 0, -3 / 5, -4 / 5],
  87. [0, 0, -4 / 5, 3 / 5],
  88. ]
  89. ],
  90. [
  91. [
  92. [2, -2, 18],
  93. [2, 1, 0],
  94. [1, 2, 0],
  95. ],
  96. ],
  97. [
  98. [
  99. [-1.8, 12],
  100. [2.4, -6],
  101. ],
  102. ],
  103. [
  104. [
  105. [1, 0, 0, 0, 0],
  106. [0, 0, 1, 0, 0],
  107. [1, -7, 0, 4, 2],
  108. [0, 4, 2, -7, 1],
  109. [0, 2, 0, 1, -7],
  110. ],
  111. ],
  112. [
  113. [
  114. [0, 1, 0, 0],
  115. [4.9497, 0, -2.8284, -1.4142],
  116. [4, 2, -7, 1],
  117. [2, 0, 1, -7],
  118. ],
  119. ],
  120. [
  121. [
  122. [-1.6318, 1.6208, 0.4767],
  123. [0.6813, -3.4045, 2.5281],
  124. [-0.6594, 2.7978, -6.236],
  125. ],
  126. ],
  127. [
  128. [
  129. [1.8953, -5.8889],
  130. [-2.3316, 1.9103],
  131. ],
  132. ],
  133. [
  134. [
  135. [6, 3],
  136. [8, 4],
  137. ]
  138. ],
  139. [
  140. [
  141. [2, -2, 18],
  142. [2, 1, 0],
  143. [1, 2, 0],
  144. ]
  145. ],
  146. [
  147. [
  148. [12, -51, 4],
  149. [ 6, 167, -68],
  150. [-4, 24, -41],
  151. ]
  152. ],
  153. [
  154. [
  155. [4, 3, 7],
  156. [1, 3, 6],
  157. [8, 5, 7],
  158. ]
  159. ],
  160. [
  161. [
  162. [1, 2, 3, 2],
  163. [4, 5, 6, 2],
  164. [7, 8, 9, 2],
  165. [4, 5, 5, 6],
  166. ]
  167. ],
  168. [
  169. [
  170. [7, 8, 9, 2],
  171. [1, 2, 3, 2],
  172. [4, -3, 2, 12],
  173. [4, 1, -6, 6],
  174. ]
  175. ],
  176. [
  177. [
  178. [3, 7, 6, 4, 5],
  179. [2, 3, 6, 5, 8],
  180. [2, 3, 4, 1, 0],
  181. [3, 7, 6, 7, 7],
  182. [1, 3, 4, 9, 4],
  183. ]
  184. ],
  185. [
  186. [
  187. [2, -2, -3],
  188. [0, -6, -1],
  189. [0, 0, 1],
  190. [0, 0, 4],
  191. ]
  192. ],
  193. [
  194. [
  195. [1,0,0],
  196. [0,0,0],
  197. [0,0,0],
  198. [0,0,0],
  199. ]
  200. ],
  201. [
  202. [
  203. [3, 7, 6, 4, 5, 8],
  204. [2, 3, 6, 5, 8, 9],
  205. [2, 3, 4, 1, 0, 9],
  206. [3, 7, 6, 7, 7, 3],
  207. [1, 3, 4, 9, 4, 8],
  208. ]
  209. ],
  210. ];
  211. }
  212. }