test_subscheck.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. from sympy.core.function import (Derivative, Function, diff)
  2. from sympy.core.numbers import (I, Rational, pi)
  3. from sympy.core.relational import Eq
  4. from sympy.core.symbol import (Symbol, symbols)
  5. from sympy.functions.elementary.exponential import (exp, log)
  6. from sympy.functions.elementary.miscellaneous import sqrt
  7. from sympy.functions.elementary.trigonometric import (cos, sin)
  8. from sympy.functions.special.error_functions import (Ei, erf, erfi)
  9. from sympy.integrals.integrals import Integral
  10. from sympy.solvers.ode.subscheck import checkodesol, checksysodesol
  11. from sympy.functions import besselj, bessely
  12. from sympy.testing.pytest import raises, slow
  13. C0, C1, C2, C3, C4 = symbols('C0:5')
  14. u, x, y, z = symbols('u,x:z', real=True)
  15. f = Function('f')
  16. g = Function('g')
  17. h = Function('h')
  18. @slow
  19. def test_checkodesol():
  20. # For the most part, checkodesol is well tested in the tests below.
  21. # These tests only handle cases not checked below.
  22. raises(ValueError, lambda: checkodesol(f(x, y).diff(x), Eq(f(x, y), x)))
  23. raises(ValueError, lambda: checkodesol(f(x).diff(x), Eq(f(x, y),
  24. x), f(x, y)))
  25. assert checkodesol(f(x).diff(x), Eq(f(x, y), x)) == \
  26. (False, -f(x).diff(x) + f(x, y).diff(x) - 1)
  27. assert checkodesol(f(x).diff(x), Eq(f(x), x)) is not True
  28. assert checkodesol(f(x).diff(x), Eq(f(x), x)) == (False, 1)
  29. sol1 = Eq(f(x)**5 + 11*f(x) - 2*f(x) + x, 0)
  30. assert checkodesol(diff(sol1.lhs, x), sol1) == (True, 0)
  31. assert checkodesol(diff(sol1.lhs, x)*exp(f(x)), sol1) == (True, 0)
  32. assert checkodesol(diff(sol1.lhs, x, 2), sol1) == (True, 0)
  33. assert checkodesol(diff(sol1.lhs, x, 2)*exp(f(x)), sol1) == (True, 0)
  34. assert checkodesol(diff(sol1.lhs, x, 3), sol1) == (True, 0)
  35. assert checkodesol(diff(sol1.lhs, x, 3)*exp(f(x)), sol1) == (True, 0)
  36. assert checkodesol(diff(sol1.lhs, x, 3), Eq(f(x), x*log(x))) == \
  37. (False, 60*x**4*((log(x) + 1)**2 + log(x))*(
  38. log(x) + 1)*log(x)**2 - 5*x**4*log(x)**4 - 9)
  39. assert checkodesol(diff(exp(f(x)) + x, x)*x, Eq(exp(f(x)) + x, 0)) == \
  40. (True, 0)
  41. assert checkodesol(diff(exp(f(x)) + x, x)*x, Eq(exp(f(x)) + x, 0),
  42. solve_for_func=False) == (True, 0)
  43. assert checkodesol(f(x).diff(x, 2), [Eq(f(x), C1 + C2*x),
  44. Eq(f(x), C2 + C1*x), Eq(f(x), C1*x + C2*x**2)]) == \
  45. [(True, 0), (True, 0), (False, C2)]
  46. assert checkodesol(f(x).diff(x, 2), {Eq(f(x), C1 + C2*x),
  47. Eq(f(x), C2 + C1*x), Eq(f(x), C1*x + C2*x**2)}) == \
  48. {(True, 0), (True, 0), (False, C2)}
  49. assert checkodesol(f(x).diff(x) - 1/f(x)/2, Eq(f(x)**2, x)) == \
  50. [(True, 0), (True, 0)]
  51. assert checkodesol(f(x).diff(x) - f(x), Eq(C1*exp(x), f(x))) == (True, 0)
  52. # Based on test_1st_homogeneous_coeff_ode2_eq3sol. Make sure that
  53. # checkodesol tries back substituting f(x) when it can.
  54. eq3 = x*exp(f(x)/x) + f(x) - x*f(x).diff(x)
  55. sol3 = Eq(f(x), log(log(C1/x)**(-x)))
  56. assert not checkodesol(eq3, sol3)[1].has(f(x))
  57. # This case was failing intermittently depending on hash-seed:
  58. eqn = Eq(Derivative(x*Derivative(f(x), x), x)/x, exp(x))
  59. sol = Eq(f(x), C1 + C2*log(x) + exp(x) - Ei(x))
  60. assert checkodesol(eqn, sol, order=2, solve_for_func=False)[0]
  61. eq = x**2*(f(x).diff(x, 2)) + x*(f(x).diff(x)) + (2*x**2 +25)*f(x)
  62. sol = Eq(f(x), C1*besselj(5*I, sqrt(2)*x) + C2*bessely(5*I, sqrt(2)*x))
  63. assert checkodesol(eq, sol) == (True, 0)
  64. eqs = [Eq(f(x).diff(x), f(x) + g(x)), Eq(g(x).diff(x), f(x) + g(x))]
  65. sol = [Eq(f(x), -C1 + C2*exp(2*x)), Eq(g(x), C1 + C2*exp(2*x))]
  66. assert checkodesol(eqs, sol) == (True, [0, 0])
  67. def test_checksysodesol():
  68. x, y, z = symbols('x, y, z', cls=Function)
  69. t = Symbol('t')
  70. eq = (Eq(diff(x(t),t), 9*y(t)), Eq(diff(y(t),t), 12*x(t)))
  71. sol = [Eq(x(t), 9*C1*exp(-6*sqrt(3)*t) + 9*C2*exp(6*sqrt(3)*t)), \
  72. Eq(y(t), -6*sqrt(3)*C1*exp(-6*sqrt(3)*t) + 6*sqrt(3)*C2*exp(6*sqrt(3)*t))]
  73. assert checksysodesol(eq, sol) == (True, [0, 0])
  74. eq = (Eq(diff(x(t),t), 2*x(t) + 4*y(t)), Eq(diff(y(t),t), 12*x(t) + 41*y(t)))
  75. sol = [Eq(x(t), 4*C1*exp(t*(-sqrt(1713)/2 + Rational(43, 2))) + 4*C2*exp(t*(sqrt(1713)/2 + \
  76. Rational(43, 2)))), Eq(y(t), C1*(-sqrt(1713)/2 + Rational(39, 2))*exp(t*(-sqrt(1713)/2 + \
  77. Rational(43, 2))) + C2*(Rational(39, 2) + sqrt(1713)/2)*exp(t*(sqrt(1713)/2 + Rational(43, 2))))]
  78. assert checksysodesol(eq, sol) == (True, [0, 0])
  79. eq = (Eq(diff(x(t),t), x(t) + y(t)), Eq(diff(y(t),t), -2*x(t) + 2*y(t)))
  80. sol = [Eq(x(t), (C1*sin(sqrt(7)*t/2) + C2*cos(sqrt(7)*t/2))*exp(t*Rational(3, 2))), \
  81. Eq(y(t), ((C1/2 - sqrt(7)*C2/2)*sin(sqrt(7)*t/2) + (sqrt(7)*C1/2 + \
  82. C2/2)*cos(sqrt(7)*t/2))*exp(t*Rational(3, 2)))]
  83. assert checksysodesol(eq, sol) == (True, [0, 0])
  84. eq = (Eq(diff(x(t),t), x(t) + y(t) + 9), Eq(diff(y(t),t), 2*x(t) + 5*y(t) + 23))
  85. sol = [Eq(x(t), C1*exp(t*(-sqrt(6) + 3)) + C2*exp(t*(sqrt(6) + 3)) - \
  86. Rational(22, 3)), Eq(y(t), C1*(-sqrt(6) + 2)*exp(t*(-sqrt(6) + 3)) + C2*(2 + \
  87. sqrt(6))*exp(t*(sqrt(6) + 3)) - Rational(5, 3))]
  88. assert checksysodesol(eq, sol) == (True, [0, 0])
  89. eq = (Eq(diff(x(t),t), x(t) + y(t) + 81), Eq(diff(y(t),t), -2*x(t) + y(t) + 23))
  90. sol = [Eq(x(t), (C1*sin(sqrt(2)*t) + C2*cos(sqrt(2)*t))*exp(t) - Rational(58, 3)), \
  91. Eq(y(t), (sqrt(2)*C1*cos(sqrt(2)*t) - sqrt(2)*C2*sin(sqrt(2)*t))*exp(t) - Rational(185, 3))]
  92. assert checksysodesol(eq, sol) == (True, [0, 0])
  93. eq = (Eq(diff(x(t),t), 5*t*x(t) + 2*y(t)), Eq(diff(y(t),t), 2*x(t) + 5*t*y(t)))
  94. sol = [Eq(x(t), (C1*exp(Integral(2, t).doit()) + C2*exp(-(Integral(2, t)).doit()))*\
  95. exp((Integral(5*t, t)).doit())), Eq(y(t), (C1*exp((Integral(2, t)).doit()) - \
  96. C2*exp(-(Integral(2, t)).doit()))*exp((Integral(5*t, t)).doit()))]
  97. assert checksysodesol(eq, sol) == (True, [0, 0])
  98. eq = (Eq(diff(x(t),t), 5*t*x(t) + t**2*y(t)), Eq(diff(y(t),t), -t**2*x(t) + 5*t*y(t)))
  99. sol = [Eq(x(t), (C1*cos((Integral(t**2, t)).doit()) + C2*sin((Integral(t**2, t)).doit()))*\
  100. exp((Integral(5*t, t)).doit())), Eq(y(t), (-C1*sin((Integral(t**2, t)).doit()) + \
  101. C2*cos((Integral(t**2, t)).doit()))*exp((Integral(5*t, t)).doit()))]
  102. assert checksysodesol(eq, sol) == (True, [0, 0])
  103. eq = (Eq(diff(x(t),t), 5*t*x(t) + t**2*y(t)), Eq(diff(y(t),t), -t**2*x(t) + (5*t+9*t**2)*y(t)))
  104. sol = [Eq(x(t), (C1*exp((-sqrt(77)/2 + Rational(9, 2))*(Integral(t**2, t)).doit()) + \
  105. C2*exp((sqrt(77)/2 + Rational(9, 2))*(Integral(t**2, t)).doit()))*exp((Integral(5*t, t)).doit())), \
  106. Eq(y(t), (C1*(-sqrt(77)/2 + Rational(9, 2))*exp((-sqrt(77)/2 + Rational(9, 2))*(Integral(t**2, t)).doit()) + \
  107. C2*(sqrt(77)/2 + Rational(9, 2))*exp((sqrt(77)/2 + Rational(9, 2))*(Integral(t**2, t)).doit()))*exp((Integral(5*t, t)).doit()))]
  108. assert checksysodesol(eq, sol) == (True, [0, 0])
  109. eq = (Eq(diff(x(t),t,t), 5*x(t) + 43*y(t)), Eq(diff(y(t),t,t), x(t) + 9*y(t)))
  110. root0 = -sqrt(-sqrt(47) + 7)
  111. root1 = sqrt(-sqrt(47) + 7)
  112. root2 = -sqrt(sqrt(47) + 7)
  113. root3 = sqrt(sqrt(47) + 7)
  114. sol = [Eq(x(t), 43*C1*exp(t*root0) + 43*C2*exp(t*root1) + 43*C3*exp(t*root2) + 43*C4*exp(t*root3)), \
  115. Eq(y(t), C1*(root0**2 - 5)*exp(t*root0) + C2*(root1**2 - 5)*exp(t*root1) + \
  116. C3*(root2**2 - 5)*exp(t*root2) + C4*(root3**2 - 5)*exp(t*root3))]
  117. assert checksysodesol(eq, sol) == (True, [0, 0])
  118. eq = (Eq(diff(x(t),t,t), 8*x(t)+3*y(t)+31), Eq(diff(y(t),t,t), 9*x(t)+7*y(t)+12))
  119. root0 = -sqrt(-sqrt(109)/2 + Rational(15, 2))
  120. root1 = sqrt(-sqrt(109)/2 + Rational(15, 2))
  121. root2 = -sqrt(sqrt(109)/2 + Rational(15, 2))
  122. root3 = sqrt(sqrt(109)/2 + Rational(15, 2))
  123. sol = [Eq(x(t), 3*C1*exp(t*root0) + 3*C2*exp(t*root1) + 3*C3*exp(t*root2) + 3*C4*exp(t*root3) - Rational(181, 29)), \
  124. Eq(y(t), C1*(root0**2 - 8)*exp(t*root0) + C2*(root1**2 - 8)*exp(t*root1) + \
  125. C3*(root2**2 - 8)*exp(t*root2) + C4*(root3**2 - 8)*exp(t*root3) + Rational(183, 29))]
  126. assert checksysodesol(eq, sol) == (True, [0, 0])
  127. eq = (Eq(diff(x(t),t,t) - 9*diff(y(t),t) + 7*x(t),0), Eq(diff(y(t),t,t) + 9*diff(x(t),t) + 7*y(t),0))
  128. sol = [Eq(x(t), C1*cos(t*(Rational(9, 2) + sqrt(109)/2)) + C2*sin(t*(Rational(9, 2) + sqrt(109)/2)) + \
  129. C3*cos(t*(-sqrt(109)/2 + Rational(9, 2))) + C4*sin(t*(-sqrt(109)/2 + Rational(9, 2)))), Eq(y(t), -C1*sin(t*(Rational(9, 2) + sqrt(109)/2)) \
  130. + C2*cos(t*(Rational(9, 2) + sqrt(109)/2)) - C3*sin(t*(-sqrt(109)/2 + Rational(9, 2))) + C4*cos(t*(-sqrt(109)/2 + Rational(9, 2))))]
  131. assert checksysodesol(eq, sol) == (True, [0, 0])
  132. eq = (Eq(diff(x(t),t,t), 9*t*diff(y(t),t)-9*y(t)), Eq(diff(y(t),t,t),7*t*diff(x(t),t)-7*x(t)))
  133. I1 = sqrt(6)*7**Rational(1, 4)*sqrt(pi)*erfi(sqrt(6)*7**Rational(1, 4)*t/2)/2 - exp(3*sqrt(7)*t**2/2)/t
  134. I2 = -sqrt(6)*7**Rational(1, 4)*sqrt(pi)*erf(sqrt(6)*7**Rational(1, 4)*t/2)/2 - exp(-3*sqrt(7)*t**2/2)/t
  135. sol = [Eq(x(t), C3*t + t*(9*C1*I1 + 9*C2*I2)), Eq(y(t), C4*t + t*(3*sqrt(7)*C1*I1 - 3*sqrt(7)*C2*I2))]
  136. assert checksysodesol(eq, sol) == (True, [0, 0])
  137. eq = (Eq(diff(x(t),t), 21*x(t)), Eq(diff(y(t),t), 17*x(t)+3*y(t)), Eq(diff(z(t),t), 5*x(t)+7*y(t)+9*z(t)))
  138. sol = [Eq(x(t), C1*exp(21*t)), Eq(y(t), 17*C1*exp(21*t)/18 + C2*exp(3*t)), \
  139. Eq(z(t), 209*C1*exp(21*t)/216 - 7*C2*exp(3*t)/6 + C3*exp(9*t))]
  140. assert checksysodesol(eq, sol) == (True, [0, 0, 0])
  141. eq = (Eq(diff(x(t),t),3*y(t)-11*z(t)),Eq(diff(y(t),t),7*z(t)-3*x(t)),Eq(diff(z(t),t),11*x(t)-7*y(t)))
  142. sol = [Eq(x(t), 7*C0 + sqrt(179)*C1*cos(sqrt(179)*t) + (77*C1/3 + 130*C2/3)*sin(sqrt(179)*t)), \
  143. Eq(y(t), 11*C0 + sqrt(179)*C2*cos(sqrt(179)*t) + (-58*C1/3 - 77*C2/3)*sin(sqrt(179)*t)), \
  144. Eq(z(t), 3*C0 + sqrt(179)*(-7*C1/3 - 11*C2/3)*cos(sqrt(179)*t) + (11*C1 - 7*C2)*sin(sqrt(179)*t))]
  145. assert checksysodesol(eq, sol) == (True, [0, 0, 0])
  146. eq = (Eq(3*diff(x(t),t),4*5*(y(t)-z(t))),Eq(4*diff(y(t),t),3*5*(z(t)-x(t))),Eq(5*diff(z(t),t),3*4*(x(t)-y(t))))
  147. sol = [Eq(x(t), C0 + 5*sqrt(2)*C1*cos(5*sqrt(2)*t) + (12*C1/5 + 164*C2/15)*sin(5*sqrt(2)*t)), \
  148. Eq(y(t), C0 + 5*sqrt(2)*C2*cos(5*sqrt(2)*t) + (-51*C1/10 - 12*C2/5)*sin(5*sqrt(2)*t)), \
  149. Eq(z(t), C0 + 5*sqrt(2)*(-9*C1/25 - 16*C2/25)*cos(5*sqrt(2)*t) + (12*C1/5 - 12*C2/5)*sin(5*sqrt(2)*t))]
  150. assert checksysodesol(eq, sol) == (True, [0, 0, 0])
  151. eq = (Eq(diff(x(t),t),4*x(t) - z(t)),Eq(diff(y(t),t),2*x(t)+2*y(t)-z(t)),Eq(diff(z(t),t),3*x(t)+y(t)))
  152. sol = [Eq(x(t), C1*exp(2*t) + C2*t*exp(2*t) + C2*exp(2*t) + C3*t**2*exp(2*t)/2 + C3*t*exp(2*t) + C3*exp(2*t)), \
  153. Eq(y(t), C1*exp(2*t) + C2*t*exp(2*t) + C2*exp(2*t) + C3*t**2*exp(2*t)/2 + C3*t*exp(2*t)), \
  154. Eq(z(t), 2*C1*exp(2*t) + 2*C2*t*exp(2*t) + C2*exp(2*t) + C3*t**2*exp(2*t) + C3*t*exp(2*t) + C3*exp(2*t))]
  155. assert checksysodesol(eq, sol) == (True, [0, 0, 0])
  156. eq = (Eq(diff(x(t),t),4*x(t) - y(t) - 2*z(t)),Eq(diff(y(t),t),2*x(t) + y(t)- 2*z(t)),Eq(diff(z(t),t),5*x(t)-3*z(t)))
  157. sol = [Eq(x(t), C1*exp(2*t) + C2*(-sin(t) + 3*cos(t)) + C3*(3*sin(t) + cos(t))), \
  158. Eq(y(t), C2*(-sin(t) + 3*cos(t)) + C3*(3*sin(t) + cos(t))), Eq(z(t), C1*exp(2*t) + 5*C2*cos(t) + 5*C3*sin(t))]
  159. assert checksysodesol(eq, sol) == (True, [0, 0, 0])
  160. eq = (Eq(diff(x(t),t),x(t)*y(t)**3), Eq(diff(y(t),t),y(t)**5))
  161. sol = [Eq(x(t), C1*exp((-1/(4*C2 + 4*t))**(Rational(-1, 4)))), Eq(y(t), -(-1/(4*C2 + 4*t))**Rational(1, 4)), \
  162. Eq(x(t), C1*exp(-1/(-1/(4*C2 + 4*t))**Rational(1, 4))), Eq(y(t), (-1/(4*C2 + 4*t))**Rational(1, 4)), \
  163. Eq(x(t), C1*exp(-I/(-1/(4*C2 + 4*t))**Rational(1, 4))), Eq(y(t), -I*(-1/(4*C2 + 4*t))**Rational(1, 4)), \
  164. Eq(x(t), C1*exp(I/(-1/(4*C2 + 4*t))**Rational(1, 4))), Eq(y(t), I*(-1/(4*C2 + 4*t))**Rational(1, 4))]
  165. assert checksysodesol(eq, sol) == (True, [0, 0])
  166. eq = (Eq(diff(x(t),t), exp(3*x(t))*y(t)**3),Eq(diff(y(t),t), y(t)**5))
  167. sol = [Eq(x(t), -log(C1 - 3/(-1/(4*C2 + 4*t))**Rational(1, 4))/3), Eq(y(t), -(-1/(4*C2 + 4*t))**Rational(1, 4)), \
  168. Eq(x(t), -log(C1 + 3/(-1/(4*C2 + 4*t))**Rational(1, 4))/3), Eq(y(t), (-1/(4*C2 + 4*t))**Rational(1, 4)), \
  169. Eq(x(t), -log(C1 + 3*I/(-1/(4*C2 + 4*t))**Rational(1, 4))/3), Eq(y(t), -I*(-1/(4*C2 + 4*t))**Rational(1, 4)), \
  170. Eq(x(t), -log(C1 - 3*I/(-1/(4*C2 + 4*t))**Rational(1, 4))/3), Eq(y(t), I*(-1/(4*C2 + 4*t))**Rational(1, 4))]
  171. assert checksysodesol(eq, sol) == (True, [0, 0])
  172. eq = (Eq(x(t),t*diff(x(t),t)+diff(x(t),t)*diff(y(t),t)), Eq(y(t),t*diff(y(t),t)+diff(y(t),t)**2))
  173. sol = {Eq(x(t), C1*C2 + C1*t), Eq(y(t), C2**2 + C2*t)}
  174. assert checksysodesol(eq, sol) == (True, [0, 0])