test_rules_integrals.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from src.rules.integrals import indef, choose_constant, solve_integral, \
  2. match_solve_indef, solve_indef, match_integrate_variable_power, \
  3. integrate_variable_root, integrate_variable_exponent, \
  4. match_constant_integral, constant_integral, \
  5. match_factor_out_constant, factor_out_constant, \
  6. match_division_integral, division_integral, extend_division_integral, \
  7. match_function_integral, logarithm_integral, sinus_integral, \
  8. cosinus_integral
  9. from src.node import Scope
  10. from src.possibilities import Possibility as P
  11. from tests.rulestestcase import RulesTestCase, tree
  12. class TestRulesIntegrals(RulesTestCase):
  13. def test_choose_constant(self):
  14. a, b, c = tree('a, b, c')
  15. self.assertEqual(choose_constant(tree('int x ^ n')), c)
  16. self.assertEqual(choose_constant(tree('int x ^ c')), a)
  17. self.assertEqual(choose_constant(tree('int a ^ c da')), b)
  18. def test_match_solve_indef(self):
  19. root = tree('[x ^ 2]_a^b')
  20. self.assertEqualPos(match_solve_indef(root), [P(root, solve_indef)])
  21. def test_solve_integral(self):
  22. root, F, Fc = tree('int x ^ 2 dx, 1 / 3 x ^ 3, 1 / 3 x ^ 3 + c')
  23. self.assertEqual(solve_integral(root, F), Fc)
  24. x2, x, a, b = root = tree('int_a^b x ^ 2 dx')
  25. self.assertEqual(solve_integral(root, F), indef(Fc, a, b))
  26. def test_solve_integral_skip_indef(self):
  27. root, x, c, l1 = tree('int_a^b y ^ x dy, x, c, 1')
  28. F = tree('1 / (x + 1)y ^ (x + 1)')
  29. y, a, b = root[1:4]
  30. Fx = lambda y: l1 / (x + 1) * y ** (x + 1) + c
  31. self.assertEqual(solve_integral(root, F), Fx(b) - Fx(a))
  32. def test_solve_indef(self):
  33. root, expect = tree('[x ^ 2]_a^b, b2 - a2')
  34. self.assertEqual(solve_indef(root, ()), expect)
  35. def test_match_integrate_variable_power(self):
  36. for root in tree('int x ^ n, int x ^ n'):
  37. self.assertEqualPos(match_integrate_variable_power(root),
  38. [P(root, integrate_variable_root)])
  39. for root in tree('int g ^ x, int g ^ x'):
  40. self.assertEqualPos(match_integrate_variable_power(root),
  41. [P(root, integrate_variable_exponent)])
  42. def test_integrate_variable_root(self):
  43. root, expect = tree('int x ^ n, x ^ (n + 1) / (n + 1) + c')
  44. self.assertEqual(integrate_variable_root(root, ()), expect)
  45. def test_integrate_variable_exponent(self):
  46. root, expect = tree('int g ^ x, g ^ x / ln(g) + c')
  47. self.assertEqual(integrate_variable_exponent(root, ()), expect)
  48. def test_match_constant_integral(self):
  49. root0, root1 = tree('int 2, int c dx')
  50. self.assertEqualPos(match_constant_integral(root0),
  51. [P(root0, constant_integral)])
  52. self.assertEqualPos(match_constant_integral(root1),
  53. [P(root1, constant_integral)])
  54. def test_constant_integral(self):
  55. root, expect = tree('int 2, 2x + c')
  56. self.assertEqual(constant_integral(root, ()), expect)
  57. root, expect = tree('int_0^4 2, [2x + c]_0^4')
  58. self.assertEqual(constant_integral(root, ()), expect)
  59. def test_match_factor_out_constant(self):
  60. root, c, cx = tree('int cx dx, c, cx')
  61. self.assertEqualPos(match_factor_out_constant(root),
  62. [P(root, factor_out_constant, (Scope(cx), c))])
  63. def test_factor_out_constant(self):
  64. root, expect = tree('int cx2 dx, c int x2 dx')
  65. c, x2 = cx2 = root[0]
  66. self.assertEqual(factor_out_constant(root, (Scope(cx2), c)), expect)
  67. def test_match_division_integral(self):
  68. root0, root1 = tree('int 1 / x, int 2 / x')
  69. self.assertEqualPos(match_division_integral(root0),
  70. [P(root0, division_integral)])
  71. self.assertEqualPos(match_division_integral(root1),
  72. [P(root1, extend_division_integral)])
  73. def test_division_integral(self):
  74. root, expect = tree('int 1 / x dx, ln|x| + c')
  75. self.assertEqual(division_integral(root, ()), expect)
  76. def test_extend_division_integral(self):
  77. root, expect = tree('int a / x dx, int a(1 / x) dx')
  78. self.assertEqual(extend_division_integral(root, ()), expect)
  79. def test_match_division_integral_chain(self):
  80. self.assertRewrite([
  81. 'int a / x',
  82. 'int a(1 / x) dx',
  83. # FIXME: 'a int 1 / x dx', # fix with strategy
  84. # FIXME: 'aln|x| + c',
  85. ])
  86. def test_match_function_integral(self):
  87. root0, root1, root2 = tree('int ln x, int sin x, int cos x')
  88. self.assertEqualPos(match_function_integral(root0),
  89. [P(root0, logarithm_integral)])
  90. self.assertEqualPos(match_function_integral(root1),
  91. [P(root1, sinus_integral)])
  92. self.assertEqualPos(match_function_integral(root2),
  93. [P(root2, cosinus_integral)])
  94. def test_logarithm_integral(self):
  95. root, expect = tree('int ln x, (xlnx - x) / ln e + c')
  96. self.assertEqual(logarithm_integral(root, ()), expect)
  97. def test_sinus_integral(self):
  98. root, expect = tree('int sin x, -cos x + c')
  99. self.assertEqual(sinus_integral(root, ()), expect)
  100. def test_cosinus_integral(self):
  101. root, expect = tree('int cos x, sin x + c')
  102. self.assertEqual(cosinus_integral(root, ()), expect)