FunctionMatrixTest.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace MathPHP\Tests\LinearAlgebra\Matrix\Other;
  3. use MathPHP\Exception;
  4. use MathPHP\LinearAlgebra\FunctionMatrix;
  5. class FunctionMatrixTest extends \PHPUnit\Framework\TestCase
  6. {
  7. /**
  8. * @test evaluate
  9. * @throws \Exception
  10. */
  11. public function testEvaluate()
  12. {
  13. // Given
  14. $A = [
  15. [
  16. function ($params) {
  17. $x = $params['x'];
  18. $y = $params['y'];
  19. return $x ** 2 * $y;
  20. }
  21. ],
  22. [
  23. function ($params) {
  24. $x = $params['x'];
  25. $y = $params['y'];
  26. return 5 * $x + \sin($y);
  27. }
  28. ],
  29. ];
  30. $M = new FunctionMatrix($A);
  31. // When
  32. $ME = $M->evaluate(['x' => 1, 'y' => 2]);
  33. // Then
  34. $this->assertEqualsWithDelta(2, $ME->get(0, 0), 0.000001);
  35. $this->assertEqualsWithDelta(5.90929742683, $ME->get(1, 0), 0.000001);
  36. }
  37. /**
  38. * @test evaluate
  39. * @throws \Exception
  40. */
  41. public function testEvaluateSquare()
  42. {
  43. // Given
  44. $A = [
  45. [
  46. function ($params) {
  47. $x = $params['x'];
  48. $y = $params['y'];
  49. return $x + $y;
  50. },
  51. function ($params) {
  52. $x = $params['x'];
  53. $y = $params['y'];
  54. return $x - $y;
  55. }
  56. ],
  57. [
  58. function ($params) {
  59. $x = $params['x'];
  60. $y = $params['y'];
  61. return $x * $y;
  62. },
  63. function ($params) {
  64. $x = $params['x'];
  65. $y = $params['y'];
  66. return $x / $y;
  67. }
  68. ],
  69. ];
  70. $M = new FunctionMatrix($A);
  71. // When
  72. $ME = $M->evaluate(['x' => 1, 'y' => 2]);
  73. // Then
  74. $this->assertEqualsWithDelta(3, $ME[0][0], 0.000001);
  75. $this->assertEqualsWithDelta(-1, $ME[0][1], 0.000001);
  76. $this->assertEqualsWithDelta(2, $ME[1][0], 0.000001);
  77. $this->assertEqualsWithDelta(1 / 2, $ME[1][1], 0.000001);
  78. }
  79. /**
  80. * @test evaluate
  81. * @throws \Exception
  82. */
  83. public function testConstructionExceptionDifferenceDimensions()
  84. {
  85. // Given
  86. $A = [
  87. [
  88. function ($params) {
  89. $x = $params['x'];
  90. $y = $params['y'];
  91. return $x ** 2 * $y;
  92. },
  93. function ($params) {
  94. $x = $params['x'];
  95. $y = $params['y'];
  96. return $x ** 2 * $y;
  97. },
  98. ],
  99. [
  100. function ($params) {
  101. $x = $params['x'];
  102. $y = $params['y'];
  103. return 5 * $x + \sin($y);
  104. }
  105. ],
  106. ];
  107. // Then
  108. $this->expectException(Exception\BadDataException::class);
  109. // When
  110. $M = new FunctionMatrix($A);
  111. }
  112. }