m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1504 lines
56 KiB

7 months ago
  1. from sympy.concrete.summations import Sum
  2. from sympy.core.add import Add
  3. from sympy.core.basic import Basic
  4. from sympy.core.containers import Tuple
  5. from sympy.core.expr import unchanged
  6. from sympy.core.function import (Function, diff, expand)
  7. from sympy.core.mul import Mul
  8. from sympy.core.numbers import (Float, I, Rational, oo, pi, zoo)
  9. from sympy.core.relational import (Eq, Ge, Gt, Ne)
  10. from sympy.core.singleton import S
  11. from sympy.core.symbol import (Symbol, symbols)
  12. from sympy.functions.combinatorial.factorials import factorial
  13. from sympy.functions.elementary.complexes import (Abs, adjoint, arg, conjugate, im, re, transpose)
  14. from sympy.functions.elementary.exponential import (exp, log)
  15. from sympy.functions.elementary.miscellaneous import (Max, Min, sqrt)
  16. from sympy.functions.elementary.piecewise import (Piecewise,
  17. piecewise_fold, Undefined, ExprCondPair)
  18. from sympy.functions.elementary.trigonometric import (cos, sin)
  19. from sympy.functions.special.delta_functions import (DiracDelta, Heaviside)
  20. from sympy.functions.special.tensor_functions import KroneckerDelta
  21. from sympy.integrals.integrals import (Integral, integrate)
  22. from sympy.logic.boolalg import (And, ITE, Not, Or)
  23. from sympy.matrices.expressions.matexpr import MatrixSymbol
  24. from sympy.printing import srepr
  25. from sympy.sets.contains import Contains
  26. from sympy.sets.sets import Interval
  27. from sympy.solvers.solvers import solve
  28. from sympy.testing.pytest import raises, slow
  29. from sympy.utilities.lambdify import lambdify
  30. a, b, c, d, x, y = symbols('a:d, x, y')
  31. z = symbols('z', nonzero=True)
  32. def test_piecewise1():
  33. # Test canonicalization
  34. assert unchanged(Piecewise, ExprCondPair(x, x < 1), ExprCondPair(0, True))
  35. assert Piecewise((x, x < 1), (0, True)) == Piecewise(ExprCondPair(x, x < 1),
  36. ExprCondPair(0, True))
  37. assert Piecewise((x, x < 1), (0, True), (1, True)) == \
  38. Piecewise((x, x < 1), (0, True))
  39. assert Piecewise((x, x < 1), (0, False), (-1, 1 > 2)) == \
  40. Piecewise((x, x < 1))
  41. assert Piecewise((x, x < 1), (0, x < 1), (0, True)) == \
  42. Piecewise((x, x < 1), (0, True))
  43. assert Piecewise((x, x < 1), (0, x < 2), (0, True)) == \
  44. Piecewise((x, x < 1), (0, True))
  45. assert Piecewise((x, x < 1), (x, x < 2), (0, True)) == \
  46. Piecewise((x, Or(x < 1, x < 2)), (0, True))
  47. assert Piecewise((x, x < 1), (x, x < 2), (x, True)) == x
  48. assert Piecewise((x, True)) == x
  49. # Explicitly constructed empty Piecewise not accepted
  50. raises(TypeError, lambda: Piecewise())
  51. # False condition is never retained
  52. assert Piecewise((2*x, x < 0), (x, False)) == \
  53. Piecewise((2*x, x < 0), (x, False), evaluate=False) == \
  54. Piecewise((2*x, x < 0))
  55. assert Piecewise((x, False)) == Undefined
  56. raises(TypeError, lambda: Piecewise(x))
  57. assert Piecewise((x, 1)) == x # 1 and 0 are accepted as True/False
  58. raises(TypeError, lambda: Piecewise((x, 2)))
  59. raises(TypeError, lambda: Piecewise((x, x**2)))
  60. raises(TypeError, lambda: Piecewise(([1], True)))
  61. assert Piecewise(((1, 2), True)) == Tuple(1, 2)
  62. cond = (Piecewise((1, x < 0), (2, True)) < y)
  63. assert Piecewise((1, cond)
  64. ) == Piecewise((1, ITE(x < 0, y > 1, y > 2)))
  65. assert Piecewise((1, x > 0), (2, And(x <= 0, x > -1))
  66. ) == Piecewise((1, x > 0), (2, x > -1))
  67. assert Piecewise((1, x <= 0), (2, (x < 0) & (x > -1))
  68. ) == Piecewise((1, x <= 0))
  69. # test for supporting Contains in Piecewise
  70. pwise = Piecewise(
  71. (1, And(x <= 6, x > 1, Contains(x, S.Integers))),
  72. (0, True))
  73. assert pwise.subs(x, pi) == 0
  74. assert pwise.subs(x, 2) == 1
  75. assert pwise.subs(x, 7) == 0
  76. # Test subs
  77. p = Piecewise((-1, x < -1), (x**2, x < 0), (log(x), x >= 0))
  78. p_x2 = Piecewise((-1, x**2 < -1), (x**4, x**2 < 0), (log(x**2), x**2 >= 0))
  79. assert p.subs(x, x**2) == p_x2
  80. assert p.subs(x, -5) == -1
  81. assert p.subs(x, -1) == 1
  82. assert p.subs(x, 1) == log(1)
  83. # More subs tests
  84. p2 = Piecewise((1, x < pi), (-1, x < 2*pi), (0, x > 2*pi))
  85. p3 = Piecewise((1, Eq(x, 0)), (1/x, True))
  86. p4 = Piecewise((1, Eq(x, 0)), (2, 1/x>2))
  87. assert p2.subs(x, 2) == 1
  88. assert p2.subs(x, 4) == -1
  89. assert p2.subs(x, 10) == 0
  90. assert p3.subs(x, 0.0) == 1
  91. assert p4.subs(x, 0.0) == 1
  92. f, g, h = symbols('f,g,h', cls=Function)
  93. pf = Piecewise((f(x), x < -1), (f(x) + h(x) + 2, x <= 1))
  94. pg = Piecewise((g(x), x < -1), (g(x) + h(x) + 2, x <= 1))
  95. assert pg.subs(g, f) == pf
  96. assert Piecewise((1, Eq(x, 0)), (0, True)).subs(x, 0) == 1
  97. assert Piecewise((1, Eq(x, 0)), (0, True)).subs(x, 1) == 0
  98. assert Piecewise((1, Eq(x, y)), (0, True)).subs(x, y) == 1
  99. assert Piecewise((1, Eq(x, z)), (0, True)).subs(x, z) == 1
  100. assert Piecewise((1, Eq(exp(x), cos(z))), (0, True)).subs(x, z) == \
  101. Piecewise((1, Eq(exp(z), cos(z))), (0, True))
  102. p5 = Piecewise( (0, Eq(cos(x) + y, 0)), (1, True))
  103. assert p5.subs(y, 0) == Piecewise( (0, Eq(cos(x), 0)), (1, True))
  104. assert Piecewise((-1, y < 1), (0, x < 0), (1, Eq(x, 0)), (2, True)
  105. ).subs(x, 1) == Piecewise((-1, y < 1), (2, True))
  106. assert Piecewise((1, Eq(x**2, -1)), (2, x < 0)).subs(x, I) == 1
  107. p6 = Piecewise((x, x > 0))
  108. n = symbols('n', negative=True)
  109. assert p6.subs(x, n) == Undefined
  110. # Test evalf
  111. assert p.evalf() == Piecewise((-1.0, x < -1), (x**2, x < 0), (log(x), True))
  112. assert p.evalf(subs={x: -2}) == -1
  113. assert p.evalf(subs={x: -1}) == 1
  114. assert p.evalf(subs={x: 1}) == log(1)
  115. assert p6.evalf(subs={x: -5}) == Undefined
  116. # Test doit
  117. f_int = Piecewise((Integral(x, (x, 0, 1)), x < 1))
  118. assert f_int.doit() == Piecewise( (S.Half, x < 1) )
  119. # Test differentiation
  120. f = x
  121. fp = x*p
  122. dp = Piecewise((0, x < -1), (2*x, x < 0), (1/x, x >= 0))
  123. fp_dx = x*dp + p
  124. assert diff(p, x) == dp
  125. assert diff(f*p, x) == fp_dx
  126. # Test simple arithmetic
  127. assert x*p == fp
  128. assert x*p + p == p + x*p
  129. assert p + f == f + p
  130. assert p + dp == dp + p
  131. assert p - dp == -(dp - p)
  132. # Test power
  133. dp2 = Piecewise((0, x < -1), (4*x**2, x < 0), (1/x**2, x >= 0))
  134. assert dp**2 == dp2
  135. # Test _eval_interval
  136. f1 = x*y + 2
  137. f2 = x*y**2 + 3
  138. peval = Piecewise((f1, x < 0), (f2, x > 0))
  139. peval_interval = f1.subs(
  140. x, 0) - f1.subs(x, -1) + f2.subs(x, 1) - f2.subs(x, 0)
  141. assert peval._eval_interval(x, 0, 0) == 0
  142. assert peval._eval_interval(x, -1, 1) == peval_interval
  143. peval2 = Piecewise((f1, x < 0), (f2, True))
  144. assert peval2._eval_interval(x, 0, 0) == 0
  145. assert peval2._eval_interval(x, 1, -1) == -peval_interval
  146. assert peval2._eval_interval(x, -1, -2) == f1.subs(x, -2) - f1.subs(x, -1)
  147. assert peval2._eval_interval(x, -1, 1) == peval_interval
  148. assert peval2._eval_interval(x, None, 0) == peval2.subs(x, 0)
  149. assert peval2._eval_interval(x, -1, None) == -peval2.subs(x, -1)
  150. # Test integration
  151. assert p.integrate() == Piecewise(
  152. (-x, x < -1),
  153. (x**3/3 + Rational(4, 3), x < 0),
  154. (x*log(x) - x + Rational(4, 3), True))
  155. p = Piecewise((x, x < 1), (x**2, -1 <= x), (x, 3 < x))
  156. assert integrate(p, (x, -2, 2)) == Rational(5, 6)
  157. assert integrate(p, (x, 2, -2)) == Rational(-5, 6)
  158. p = Piecewise((0, x < 0), (1, x < 1), (0, x < 2), (1, x < 3), (0, True))
  159. assert integrate(p, (x, -oo, oo)) == 2
  160. p = Piecewise((x, x < -10), (x**2, x <= -1), (x, 1 < x))
  161. assert integrate(p, (x, -2, 2)) == Undefined
  162. # Test commutativity
  163. assert isinstance(p, Piecewise) and p.is_commutative is True
  164. def test_piecewise_free_symbols():
  165. f = Piecewise((x, a < 0), (y, True))
  166. assert f.free_symbols == {x, y, a}
  167. def test_piecewise_integrate1():
  168. x, y = symbols('x y', real=True)
  169. f = Piecewise(((x - 2)**2, x >= 0), (1, True))
  170. assert integrate(f, (x, -2, 2)) == Rational(14, 3)
  171. g = Piecewise(((x - 5)**5, x >= 4), (f, True))
  172. assert integrate(g, (x, -2, 2)) == Rational(14, 3)
  173. assert integrate(g, (x, -2, 5)) == Rational(43, 6)
  174. assert g == Piecewise(((x - 5)**5, x >= 4), (f, x < 4))
  175. g = Piecewise(((x - 5)**5, 2 <= x), (f, x < 2))
  176. assert integrate(g, (x, -2, 2)) == Rational(14, 3)
  177. assert integrate(g, (x, -2, 5)) == Rational(-701, 6)
  178. assert g == Piecewise(((x - 5)**5, 2 <= x), (f, True))
  179. g = Piecewise(((x - 5)**5, 2 <= x), (2*f, True))
  180. assert integrate(g, (x, -2, 2)) == Rational(28, 3)
  181. assert integrate(g, (x, -2, 5)) == Rational(-673, 6)
  182. def test_piecewise_integrate1b():
  183. g = Piecewise((1, x > 0), (0, Eq(x, 0)), (-1, x < 0))
  184. assert integrate(g, (x, -1, 1)) == 0
  185. g = Piecewise((1, x - y < 0), (0, True))
  186. assert integrate(g, (y, -oo, 0)) == -Min(0, x)
  187. assert g.subs(x, -3).integrate((y, -oo, 0)) == 3
  188. assert integrate(g, (y, 0, -oo)) == Min(0, x)
  189. assert integrate(g, (y, 0, oo)) == -Max(0, x) + oo
  190. assert integrate(g, (y, -oo, 42)) == -Min(42, x) + 42
  191. assert integrate(g, (y, -oo, oo)) == -x + oo
  192. g = Piecewise((0, x < 0), (x, x <= 1), (1, True))
  193. gy1 = g.integrate((x, y, 1))
  194. g1y = g.integrate((x, 1, y))
  195. for yy in (-1, S.Half, 2):
  196. assert g.integrate((x, yy, 1)) == gy1.subs(y, yy)
  197. assert g.integrate((x, 1, yy)) == g1y.subs(y, yy)
  198. assert gy1 == Piecewise(
  199. (-Min(1, Max(0, y))**2/2 + S.Half, y < 1),
  200. (-y + 1, True))
  201. assert g1y == Piecewise(
  202. (Min(1, Max(0, y))**2/2 - S.Half, y < 1),
  203. (y - 1, True))
  204. @slow
  205. def test_piecewise_integrate1ca():
  206. y = symbols('y', real=True)
  207. g = Piecewise(
  208. (1 - x, Interval(0, 1).contains(x)),
  209. (1 + x, Interval(-1, 0).contains(x)),
  210. (0, True)
  211. )
  212. gy1 = g.integrate((x, y, 1))
  213. g1y = g.integrate((x, 1, y))
  214. assert g.integrate((x, -2, 1)) == gy1.subs(y, -2)
  215. assert g.integrate((x, 1, -2)) == g1y.subs(y, -2)
  216. assert g.integrate((x, 0, 1)) == gy1.subs(y, 0)
  217. assert g.integrate((x, 1, 0)) == g1y.subs(y, 0)
  218. assert g.integrate((x, 2, 1)) == gy1.subs(y, 2)
  219. assert g.integrate((x, 1, 2)) == g1y.subs(y, 2)
  220. assert piecewise_fold(gy1.rewrite(Piecewise)
  221. ).simplify() == Piecewise(
  222. (1, y <= -1),
  223. (-y**2/2 - y + S.Half, y <= 0),
  224. (y**2/2 - y + S.Half, y < 1),
  225. (0, True))
  226. assert piecewise_fold(g1y.rewrite(Piecewise)
  227. ).simplify() == Piecewise(
  228. (-1, y <= -1),
  229. (y**2/2 + y - S.Half, y <= 0),
  230. (-y**2/2 + y - S.Half, y < 1),
  231. (0, True))
  232. assert gy1 == Piecewise(
  233. (
  234. -Min(1, Max(-1, y))**2/2 - Min(1, Max(-1, y)) +
  235. Min(1, Max(0, y))**2 + S.Half, y < 1),
  236. (0, True)
  237. )
  238. assert g1y == Piecewise(
  239. (
  240. Min(1, Max(-1, y))**2/2 + Min(1, Max(-1, y)) -
  241. Min(1, Max(0, y))**2 - S.Half, y < 1),
  242. (0, True))
  243. @slow
  244. def test_piecewise_integrate1cb():
  245. y = symbols('y', real=True)
  246. g = Piecewise(
  247. (0, Or(x <= -1, x >= 1)),
  248. (1 - x, x > 0),
  249. (1 + x, True)
  250. )
  251. gy1 = g.integrate((x, y, 1))
  252. g1y = g.integrate((x, 1, y))
  253. assert g.integrate((x, -2, 1)) == gy1.subs(y, -2)
  254. assert g.integrate((x, 1, -2)) == g1y.subs(y, -2)
  255. assert g.integrate((x, 0, 1)) == gy1.subs(y, 0)
  256. assert g.integrate((x, 1, 0)) == g1y.subs(y, 0)
  257. assert g.integrate((x, 2, 1)) == gy1.subs(y, 2)
  258. assert g.integrate((x, 1, 2)) == g1y.subs(y, 2)
  259. assert piecewise_fold(gy1.rewrite(Piecewise)
  260. ).simplify() == Piecewise(
  261. (1, y <= -1),
  262. (-y**2/2 - y + S.Half, y <= 0),
  263. (y**2/2 - y + S.Half, y < 1),
  264. (0, True))
  265. assert piecewise_fold(g1y.rewrite(Piecewise)
  266. ).simplify() == Piecewise(
  267. (-1, y <= -1),
  268. (y**2/2 + y - S.Half, y <= 0),
  269. (-y**2/2 + y - S.Half, y < 1),
  270. (0, True))
  271. # g1y and gy1 should simplify if the condition that y < 1
  272. # is applied, e.g. Min(1, Max(-1, y)) --> Max(-1, y)
  273. assert gy1 == Piecewise(
  274. (
  275. -Min(1, Max(-1, y))**2/2 - Min(1, Max(-1, y)) +
  276. Min(1, Max(0, y))**2 + S.Half, y < 1),
  277. (0, True)
  278. )
  279. assert g1y == Piecewise(
  280. (
  281. Min(1, Max(-1, y))**2/2 + Min(1, Max(-1, y)) -
  282. Min(1, Max(0, y))**2 - S.Half, y < 1),
  283. (0, True))
  284. def test_piecewise_integrate2():
  285. from itertools import permutations
  286. lim = Tuple(x, c, d)
  287. p = Piecewise((1, x < a), (2, x > b), (3, True))
  288. q = p.integrate(lim)
  289. assert q == Piecewise(
  290. (-c + 2*d - 2*Min(d, Max(a, c)) + Min(d, Max(a, b, c)), c < d),
  291. (-2*c + d + 2*Min(c, Max(a, d)) - Min(c, Max(a, b, d)), True))
  292. for v in permutations((1, 2, 3, 4)):
  293. r = dict(zip((a, b, c, d), v))
  294. assert p.subs(r).integrate(lim.subs(r)) == q.subs(r)
  295. def test_meijer_bypass():
  296. # totally bypass meijerg machinery when dealing
  297. # with Piecewise in integrate
  298. assert Piecewise((1, x < 4), (0, True)).integrate((x, oo, 1)) == -3
  299. def test_piecewise_integrate3_inequality_conditions():
  300. from sympy.utilities.iterables import cartes
  301. lim = (x, 0, 5)
  302. # set below includes two pts below range, 2 pts in range,
  303. # 2 pts above range, and the boundaries
  304. N = (-2, -1, 0, 1, 2, 5, 6, 7)
  305. p = Piecewise((1, x > a), (2, x > b), (0, True))
  306. ans = p.integrate(lim)
  307. for i, j in cartes(N, repeat=2):
  308. reps = dict(zip((a, b), (i, j)))
  309. assert ans.subs(reps) == p.subs(reps).integrate(lim)
  310. assert ans.subs(a, 4).subs(b, 1) == 0 + 2*3 + 1
  311. p = Piecewise((1, x > a), (2, x < b), (0, True))
  312. ans = p.integrate(lim)
  313. for i, j in cartes(N, repeat=2):
  314. reps = dict(zip((a, b), (i, j)))
  315. assert ans.subs(reps) == p.subs(reps).integrate(lim)
  316. # delete old tests that involved c1 and c2 since those
  317. # reduce to the above except that a value of 0 was used
  318. # for two expressions whereas the above uses 3 different
  319. # values
  320. @slow
  321. def test_piecewise_integrate4_symbolic_conditions():
  322. a = Symbol('a', real=True)
  323. b = Symbol('b', real=True)
  324. x = Symbol('x', real=True)
  325. y = Symbol('y', real=True)
  326. p0 = Piecewise((0, Or(x < a, x > b)), (1, True))
  327. p1 = Piecewise((0, x < a), (0, x > b), (1, True))
  328. p2 = Piecewise((0, x > b), (0, x < a), (1, True))
  329. p3 = Piecewise((0, x < a), (1, x < b), (0, True))
  330. p4 = Piecewise((0, x > b), (1, x > a), (0, True))
  331. p5 = Piecewise((1, And(a < x, x < b)), (0, True))
  332. # check values of a=1, b=3 (and reversed) with values
  333. # of y of 0, 1, 2, 3, 4
  334. lim = Tuple(x, -oo, y)
  335. for p in (p0, p1, p2, p3, p4, p5):
  336. ans = p.integrate(lim)
  337. for i in range(5):
  338. reps = {a:1, b:3, y:i}
  339. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  340. reps = {a: 3, b:1, y:i}
  341. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  342. lim = Tuple(x, y, oo)
  343. for p in (p0, p1, p2, p3, p4, p5):
  344. ans = p.integrate(lim)
  345. for i in range(5):
  346. reps = {a:1, b:3, y:i}
  347. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  348. reps = {a:3, b:1, y:i}
  349. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  350. ans = Piecewise(
  351. (0, x <= Min(a, b)),
  352. (x - Min(a, b), x <= b),
  353. (b - Min(a, b), True))
  354. for i in (p0, p1, p2, p4):
  355. assert i.integrate(x) == ans
  356. assert p3.integrate(x) == Piecewise(
  357. (0, x < a),
  358. (-a + x, x <= Max(a, b)),
  359. (-a + Max(a, b), True))
  360. assert p5.integrate(x) == Piecewise(
  361. (0, x <= a),
  362. (-a + x, x <= Max(a, b)),
  363. (-a + Max(a, b), True))
  364. p1 = Piecewise((0, x < a), (0.5, x > b), (1, True))
  365. p2 = Piecewise((0.5, x > b), (0, x < a), (1, True))
  366. p3 = Piecewise((0, x < a), (1, x < b), (0.5, True))
  367. p4 = Piecewise((0.5, x > b), (1, x > a), (0, True))
  368. p5 = Piecewise((1, And(a < x, x < b)), (0.5, x > b), (0, True))
  369. # check values of a=1, b=3 (and reversed) with values
  370. # of y of 0, 1, 2, 3, 4
  371. lim = Tuple(x, -oo, y)
  372. for p in (p1, p2, p3, p4, p5):
  373. ans = p.integrate(lim)
  374. for i in range(5):
  375. reps = {a:1, b:3, y:i}
  376. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  377. reps = {a: 3, b:1, y:i}
  378. assert ans.subs(reps) == p.subs(reps).integrate(lim.subs(reps))
  379. def test_piecewise_integrate5_independent_conditions():
  380. p = Piecewise((0, Eq(y, 0)), (x*y, True))
  381. assert integrate(p, (x, 1, 3)) == Piecewise((0, Eq(y, 0)), (4*y, True))
  382. def test_piecewise_simplify():
  383. p = Piecewise(((x**2 + 1)/x**2, Eq(x*(1 + x) - x**2, 0)),
  384. ((-1)**x*(-1), True))
  385. assert p.simplify() == \
  386. Piecewise((zoo, Eq(x, 0)), ((-1)**(x + 1), True))
  387. # simplify when there are Eq in conditions
  388. assert Piecewise(
  389. (a, And(Eq(a, 0), Eq(a + b, 0))), (1, True)).simplify(
  390. ) == Piecewise(
  391. (0, And(Eq(a, 0), Eq(b, 0))), (1, True))
  392. assert Piecewise((2*x*factorial(a)/(factorial(y)*factorial(-y + a)),
  393. Eq(y, 0) & Eq(-y + a, 0)), (2*factorial(a)/(factorial(y)*factorial(-y
  394. + a)), Eq(y, 0) & Eq(-y + a, 1)), (0, True)).simplify(
  395. ) == Piecewise(
  396. (2*x, And(Eq(a, 0), Eq(y, 0))),
  397. (2, And(Eq(a, 1), Eq(y, 0))),
  398. (0, True))
  399. args = (2, And(Eq(x, 2), Ge(y, 0))), (x, True)
  400. assert Piecewise(*args).simplify() == Piecewise(*args)
  401. args = (1, Eq(x, 0)), (sin(x)/x, True)
  402. assert Piecewise(*args).simplify() == Piecewise(*args)
  403. assert Piecewise((2 + y, And(Eq(x, 2), Eq(y, 0))), (x, True)
  404. ).simplify() == x
  405. # check that x or f(x) are recognized as being Symbol-like for lhs
  406. args = Tuple((1, Eq(x, 0)), (sin(x) + 1 + x, True))
  407. ans = x + sin(x) + 1
  408. f = Function('f')
  409. assert Piecewise(*args).simplify() == ans
  410. assert Piecewise(*args.subs(x, f(x))).simplify() == ans.subs(x, f(x))
  411. # issue 18634
  412. d = Symbol("d", integer=True)
  413. n = Symbol("n", integer=True)
  414. t = Symbol("t", positive=True)
  415. expr = Piecewise((-d + 2*n, Eq(1/t, 1)), (t**(1 - 4*n)*t**(4*n - 1)*(-d + 2*n), True))
  416. assert expr.simplify() == -d + 2*n
  417. # issue 22747
  418. p = Piecewise((0, (t < -2) & (t < -1) & (t < 0)), ((t/2 + 1)*(t +
  419. 1)*(t + 2), (t < -1) & (t < 0)), ((S.Half - t/2)*(1 - t)*(t + 1),
  420. (t < -2) & (t < -1) & (t < 1)), ((t + 1)*(-t*(t/2 + 1) + (S.Half
  421. - t/2)*(1 - t)), (t < -2) & (t < -1) & (t < 0) & (t < 1)), ((t +
  422. 1)*((S.Half - t/2)*(1 - t) + (t/2 + 1)*(t + 2)), (t < -1) & (t <
  423. 1)), ((t + 1)*(-t*(t/2 + 1) + (S.Half - t/2)*(1 - t)), (t < -1) &
  424. (t < 0) & (t < 1)), (0, (t < -2) & (t < -1)), ((t/2 + 1)*(t +
  425. 1)*(t + 2), t < -1), ((t + 1)*(-t*(t/2 + 1) + (S.Half - t/2)*(t +
  426. 1)), (t < 0) & ((t < -2) | (t < 0))), ((S.Half - t/2)*(1 - t)*(t
  427. + 1), (t < 1) & ((t < -2) | (t < 1))), (0, True)) + Piecewise((0,
  428. (t < -1) & (t < 0) & (t < 1)), ((1 - t)*(t/2 + S.Half)*(t + 1),
  429. (t < 0) & (t < 1)), ((1 - t)*(1 - t/2)*(2 - t), (t < -1) & (t <
  430. 0) & (t < 2)), ((1 - t)*((1 - t)*(t/2 + S.Half) + (1 - t/2)*(2 -
  431. t)), (t < -1) & (t < 0) & (t < 1) & (t < 2)), ((1 - t)*((1 -
  432. t/2)*(2 - t) + (t/2 + S.Half)*(t + 1)), (t < 0) & (t < 2)), ((1 -
  433. t)*((1 - t)*(t/2 + S.Half) + (1 - t/2)*(2 - t)), (t < 0) & (t <
  434. 1) & (t < 2)), (0, (t < -1) & (t < 0)), ((1 - t)*(t/2 +
  435. S.Half)*(t + 1), t < 0), ((1 - t)*(t*(1 - t/2) + (1 - t)*(t/2 +
  436. S.Half)), (t < 1) & ((t < -1) | (t < 1))), ((1 - t)*(1 - t/2)*(2
  437. - t), (t < 2) & ((t < -1) | (t < 2))), (0, True))
  438. assert p.simplify() == Piecewise(
  439. (0, t < -2), ((t + 1)*(t + 2)**2/2, t < -1), (-3*t**3/2
  440. - 5*t**2/2 + 1, t < 0), (3*t**3/2 - 5*t**2/2 + 1, t < 1), ((1 -
  441. t)*(t - 2)**2/2, t < 2), (0, True))
  442. # coverage
  443. nan = Undefined
  444. covered = Piecewise((1, x > 3), (2, x < 2), (3, x > 1))
  445. assert covered.simplify().args == covered.args
  446. assert Piecewise((1, x < 2), (2, x < 1), (3, True)).simplify(
  447. ) == Piecewise((1, x < 2), (3, True))
  448. assert Piecewise((1, x > 2)).simplify() == Piecewise((1, x > 2),
  449. (nan, True))
  450. assert Piecewise((1, (x >= 2) & (x < oo))
  451. ).simplify() == Piecewise((1, (x >= 2) & (x < oo)), (nan, True))
  452. assert Piecewise((1, x < 2), (2, (x > 1) & (x < 3)), (3, True)
  453. ). simplify() == Piecewise((1, x < 2), (2, x < 3), (3, True))
  454. assert Piecewise((1, x < 2), (2, (x <= 3) & (x > 1)), (3, True)
  455. ).simplify() == Piecewise((1, x < 2), (2, x <= 3), (3, True))
  456. assert Piecewise((1, x < 2), (2, (x > 2) & (x < 3)), (3, True)
  457. ).simplify() == Piecewise((1, x < 2), (2, (x > 2) & (x < 3)),
  458. (3, True))
  459. assert Piecewise((1, x < 2), (2, (x >= 1) & (x <= 3)), (3, True)
  460. ).simplify() == Piecewise((1, x < 2), (2, x <= 3), (3, True))
  461. assert Piecewise((1, x < 1), (2, (x >= 2) & (x <= 3)), (3, True)
  462. ).simplify() == Piecewise((1, x < 1), (2, (x >= 2) & (x <= 3)),
  463. (3, True))
  464. def test_piecewise_solve():
  465. abs2 = Piecewise((-x, x <= 0), (x, x > 0))
  466. f = abs2.subs(x, x - 2)
  467. assert solve(f, x) == [2]
  468. assert solve(f - 1, x) == [1, 3]
  469. f = Piecewise(((x - 2)**2, x >= 0), (1, True))
  470. assert solve(f, x) == [2]
  471. g = Piecewise(((x - 5)**5, x >= 4), (f, True))
  472. assert solve(g, x) == [2, 5]
  473. g = Piecewise(((x - 5)**5, x >= 4), (f, x < 4))
  474. assert solve(g, x) == [2, 5]
  475. g = Piecewise(((x - 5)**5, x >= 2), (f, x < 2))
  476. assert solve(g, x) == [5]
  477. g = Piecewise(((x - 5)**5, x >= 2), (f, True))
  478. assert solve(g, x) == [5]
  479. g = Piecewise(((x - 5)**5, x >= 2), (f, True), (10, False))
  480. assert solve(g, x) == [5]
  481. g = Piecewise(((x - 5)**5, x >= 2),
  482. (-x + 2, x - 2 <= 0), (x - 2, x - 2 > 0))
  483. assert solve(g, x) == [5]
  484. # if no symbol is given the piecewise detection must still work
  485. assert solve(Piecewise((x - 2, x > 2), (2 - x, True)) - 3) == [-1, 5]
  486. f = Piecewise(((x - 2)**2, x >= 0), (0, True))
  487. raises(NotImplementedError, lambda: solve(f, x))
  488. def nona(ans):
  489. return list(filter(lambda x: x is not S.NaN, ans))
  490. p = Piecewise((x**2 - 4, x < y), (x - 2, True))
  491. ans = solve(p, x)
  492. assert nona([i.subs(y, -2) for i in ans]) == [2]
  493. assert nona([i.subs(y, 2) for i in ans]) == [-2, 2]
  494. assert nona([i.subs(y, 3) for i in ans]) == [-2, 2]
  495. assert ans == [
  496. Piecewise((-2, y > -2), (S.NaN, True)),
  497. Piecewise((2, y <= 2), (S.NaN, True)),
  498. Piecewise((2, y > 2), (S.NaN, True))]
  499. # issue 6060
  500. absxm3 = Piecewise(
  501. (x - 3, 0 <= x - 3),
  502. (3 - x, 0 > x - 3)
  503. )
  504. assert solve(absxm3 - y, x) == [
  505. Piecewise((-y + 3, -y < 0), (S.NaN, True)),
  506. Piecewise((y + 3, y >= 0), (S.NaN, True))]
  507. p = Symbol('p', positive=True)
  508. assert solve(absxm3 - p, x) == [-p + 3, p + 3]
  509. # issue 6989
  510. f = Function('f')
  511. assert solve(Eq(-f(x), Piecewise((1, x > 0), (0, True))), f(x)) == \
  512. [Piecewise((-1, x > 0), (0, True))]
  513. # issue 8587
  514. f = Piecewise((2*x**2, And(0 < x, x < 1)), (2, True))
  515. assert solve(f - 1) == [1/sqrt(2)]
  516. def test_piecewise_fold():
  517. p = Piecewise((x, x < 1), (1, 1 <= x))
  518. assert piecewise_fold(x*p) == Piecewise((x**2, x < 1), (x, 1 <= x))
  519. assert piecewise_fold(p + p) == Piecewise((2*x, x < 1), (2, 1 <= x))
  520. assert piecewise_fold(Piecewise((1, x < 0), (2, True))
  521. + Piecewise((10, x < 0), (-10, True))) == \
  522. Piecewise((11, x < 0), (-8, True))
  523. p1 = Piecewise((0, x < 0), (x, x <= 1), (0, True))
  524. p2 = Piecewise((0, x < 0), (1 - x, x <= 1), (0, True))
  525. p = 4*p1 + 2*p2
  526. assert integrate(
  527. piecewise_fold(p), (x, -oo, oo)) == integrate(2*x + 2, (x, 0, 1))
  528. assert piecewise_fold(
  529. Piecewise((1, y <= 0), (-Piecewise((2, y >= 0)), True)
  530. )) == Piecewise((1, y <= 0), (-2, y >= 0))
  531. assert piecewise_fold(Piecewise((x, ITE(x > 0, y < 1, y > 1)))
  532. ) == Piecewise((x, ((x <= 0) | (y < 1)) & ((x > 0) | (y > 1))))
  533. a, b = (Piecewise((2, Eq(x, 0)), (0, True)),
  534. Piecewise((x, Eq(-x + y, 0)), (1, Eq(-x + y, 1)), (0, True)))
  535. assert piecewise_fold(Mul(a, b, evaluate=False)
  536. ) == piecewise_fold(Mul(b, a, evaluate=False))
  537. def test_piecewise_fold_piecewise_in_cond():
  538. p1 = Piecewise((cos(x), x < 0), (0, True))
  539. p2 = Piecewise((0, Eq(p1, 0)), (p1 / Abs(p1), True))
  540. assert p2.subs(x, -pi/2) == 0
  541. assert p2.subs(x, 1) == 0
  542. assert p2.subs(x, -pi/4) == 1
  543. p4 = Piecewise((0, Eq(p1, 0)), (1,True))
  544. ans = piecewise_fold(p4)
  545. for i in range(-1, 1):
  546. assert ans.subs(x, i) == p4.subs(x, i)
  547. r1 = 1 < Piecewise((1, x < 1), (3, True))
  548. ans = piecewise_fold(r1)
  549. for i in range(2):
  550. assert ans.subs(x, i) == r1.subs(x, i)
  551. p5 = Piecewise((1, x < 0), (3, True))
  552. p6 = Piecewise((1, x < 1), (3, True))
  553. p7 = Piecewise((1, p5 < p6), (0, True))
  554. ans = piecewise_fold(p7)
  555. for i in range(-1, 2):
  556. assert ans.subs(x, i) == p7.subs(x, i)
  557. def test_piecewise_fold_piecewise_in_cond_2():
  558. p1 = Piecewise((cos(x), x < 0), (0, True))
  559. p2 = Piecewise((0, Eq(p1, 0)), (1 / p1, True))
  560. p3 = Piecewise(
  561. (0, (x >= 0) | Eq(cos(x), 0)),
  562. (1/cos(x), x < 0),
  563. (zoo, True)) # redundant b/c all x are already covered
  564. assert(piecewise_fold(p2) == p3)
  565. def test_piecewise_fold_expand():
  566. p1 = Piecewise((1, Interval(0, 1, False, True).contains(x)), (0, True))
  567. p2 = piecewise_fold(expand((1 - x)*p1))
  568. cond = ((x >= 0) & (x < 1))
  569. assert piecewise_fold(expand((1 - x)*p1), evaluate=False
  570. ) == Piecewise((1 - x, cond), (-x, cond), (1, cond), (0, True), evaluate=False)
  571. assert piecewise_fold(expand((1 - x)*p1), evaluate=None
  572. ) == Piecewise((1 - x, cond), (0, True))
  573. assert p2 == Piecewise((1 - x, cond), (0, True))
  574. assert p2 == expand(piecewise_fold((1 - x)*p1))
  575. def test_piecewise_duplicate():
  576. p = Piecewise((x, x < -10), (x**2, x <= -1), (x, 1 < x))
  577. assert p == Piecewise(*p.args)
  578. def test_doit():
  579. p1 = Piecewise((x, x < 1), (x**2, -1 <= x), (x, 3 < x))
  580. p2 = Piecewise((x, x < 1), (Integral(2 * x), -1 <= x), (x, 3 < x))
  581. assert p2.doit() == p1
  582. assert p2.doit(deep=False) == p2
  583. # issue 17165
  584. p1 = Sum(y**x, (x, -1, oo)).doit()
  585. assert p1.doit() == p1
  586. def test_piecewise_interval():
  587. p1 = Piecewise((x, Interval(0, 1).contains(x)), (0, True))
  588. assert p1.subs(x, -0.5) == 0
  589. assert p1.subs(x, 0.5) == 0.5
  590. assert p1.diff(x) == Piecewise((1, Interval(0, 1).contains(x)), (0, True))
  591. assert integrate(p1, x) == Piecewise(
  592. (0, x <= 0),
  593. (x**2/2, x <= 1),
  594. (S.Half, True))
  595. def test_piecewise_collapse():
  596. assert Piecewise((x, True)) == x
  597. a = x < 1
  598. assert Piecewise((x, a), (x + 1, a)) == Piecewise((x, a))
  599. assert Piecewise((x, a), (x + 1, a.reversed)) == Piecewise((x, a))
  600. b = x < 5
  601. def canonical(i):
  602. if isinstance(i, Piecewise):
  603. return Piecewise(*i.args)
  604. return i
  605. for args in [
  606. ((1, a), (Piecewise((2, a), (3, b)), b)),
  607. ((1, a), (Piecewise((2, a), (3, b.reversed)), b)),
  608. ((1, a), (Piecewise((2, a), (3, b)), b), (4, True)),
  609. ((1, a), (Piecewise((2, a), (3, b), (4, True)), b)),
  610. ((1, a), (Piecewise((2, a), (3, b), (4, True)), b), (5, True))]:
  611. for i in (0, 2, 10):
  612. assert canonical(
  613. Piecewise(*args, evaluate=False).subs(x, i)
  614. ) == canonical(Piecewise(*args).subs(x, i))
  615. r1, r2, r3, r4 = symbols('r1:5')
  616. a = x < r1
  617. b = x < r2
  618. c = x < r3
  619. d = x < r4
  620. assert Piecewise((1, a), (Piecewise(
  621. (2, a), (3, b), (4, c)), b), (5, c)
  622. ) == Piecewise((1, a), (3, b), (5, c))
  623. assert Piecewise((1, a), (Piecewise(
  624. (2, a), (3, b), (4, c), (6, True)), c), (5, d)
  625. ) == Piecewise((1, a), (Piecewise(
  626. (3, b), (4, c)), c), (5, d))
  627. assert Piecewise((1, Or(a, d)), (Piecewise(
  628. (2, d), (3, b), (4, c)), b), (5, c)
  629. ) == Piecewise((1, Or(a, d)), (Piecewise(
  630. (2, d), (3, b)), b), (5, c))
  631. assert Piecewise((1, c), (2, ~c), (3, S.true)
  632. ) == Piecewise((1, c), (2, S.true))
  633. assert Piecewise((1, c), (2, And(~c, b)), (3,True)
  634. ) == Piecewise((1, c), (2, b), (3, True))
  635. assert Piecewise((1, c), (2, Or(~c, b)), (3,True)
  636. ).subs(dict(zip((r1, r2, r3, r4, x), (1, 2, 3, 4, 3.5)))) == 2
  637. assert Piecewise((1, c), (2, ~c)) == Piecewise((1, c), (2, True))
  638. def test_piecewise_lambdify():
  639. p = Piecewise(
  640. (x**2, x < 0),
  641. (x, Interval(0, 1, False, True).contains(x)),
  642. (2 - x, x >= 1),
  643. (0, True)
  644. )
  645. f = lambdify(x, p)
  646. assert f(-2.0) == 4.0
  647. assert f(0.0) == 0.0
  648. assert f(0.5) == 0.5
  649. assert f(2.0) == 0.0
  650. def test_piecewise_series():
  651. from sympy.series.order import O
  652. p1 = Piecewise((sin(x), x < 0), (cos(x), x > 0))
  653. p2 = Piecewise((x + O(x**2), x < 0), (1 + O(x**2), x > 0))
  654. assert p1.nseries(x, n=2) == p2
  655. def test_piecewise_as_leading_term():
  656. p1 = Piecewise((1/x, x > 1), (0, True))
  657. p2 = Piecewise((x, x > 1), (0, True))
  658. p3 = Piecewise((1/x, x > 1), (x, True))
  659. p4 = Piecewise((x, x > 1), (1/x, True))
  660. p5 = Piecewise((1/x, x > 1), (x, True))
  661. p6 = Piecewise((1/x, x < 1), (x, True))
  662. p7 = Piecewise((x, x < 1), (1/x, True))
  663. p8 = Piecewise((x, x > 1), (1/x, True))
  664. assert p1.as_leading_term(x) == 0
  665. assert p2.as_leading_term(x) == 0
  666. assert p3.as_leading_term(x) == x
  667. assert p4.as_leading_term(x) == 1/x
  668. assert p5.as_leading_term(x) == x
  669. assert p6.as_leading_term(x) == 1/x
  670. assert p7.as_leading_term(x) == x
  671. assert p8.as_leading_term(x) == 1/x
  672. def test_piecewise_complex():
  673. p1 = Piecewise((2, x < 0), (1, 0 <= x))
  674. p2 = Piecewise((2*I, x < 0), (I, 0 <= x))
  675. p3 = Piecewise((I*x, x > 1), (1 + I, True))
  676. p4 = Piecewise((-I*conjugate(x), x > 1), (1 - I, True))
  677. assert conjugate(p1) == p1
  678. assert conjugate(p2) == piecewise_fold(-p2)
  679. assert conjugate(p3) == p4
  680. assert p1.is_imaginary is False
  681. assert p1.is_real is True
  682. assert p2.is_imaginary is True
  683. assert p2.is_real is False
  684. assert p3.is_imaginary is None
  685. assert p3.is_real is None
  686. assert p1.as_real_imag() == (p1, 0)
  687. assert p2.as_real_imag() == (0, -I*p2)
  688. def test_conjugate_transpose():
  689. A, B = symbols("A B", commutative=False)
  690. p = Piecewise((A*B**2, x > 0), (A**2*B, True))
  691. assert p.adjoint() == \
  692. Piecewise((adjoint(A*B**2), x > 0), (adjoint(A**2*B), True))
  693. assert p.conjugate() == \
  694. Piecewise((conjugate(A*B**2), x > 0), (conjugate(A**2*B), True))
  695. assert p.transpose() == \
  696. Piecewise((transpose(A*B**2), x > 0), (transpose(A**2*B), True))
  697. def test_piecewise_evaluate():
  698. assert Piecewise((x, True)) == x
  699. assert Piecewise((x, True), evaluate=True) == x
  700. assert Piecewise((1, Eq(1, x))).args == ((1, Eq(x, 1)),)
  701. assert Piecewise((1, Eq(1, x)), evaluate=False).args == (
  702. (1, Eq(1, x)),)
  703. # like the additive and multiplicative identities that
  704. # cannot be kept in Add/Mul, we also do not keep a single True
  705. p = Piecewise((x, True), evaluate=False)
  706. assert p == x
  707. def test_as_expr_set_pairs():
  708. assert Piecewise((x, x > 0), (-x, x <= 0)).as_expr_set_pairs() == \
  709. [(x, Interval(0, oo, True, True)), (-x, Interval(-oo, 0))]
  710. assert Piecewise(((x - 2)**2, x >= 0), (0, True)).as_expr_set_pairs() == \
  711. [((x - 2)**2, Interval(0, oo)), (0, Interval(-oo, 0, True, True))]
  712. def test_S_srepr_is_identity():
  713. p = Piecewise((10, Eq(x, 0)), (12, True))
  714. q = S(srepr(p))
  715. assert p == q
  716. def test_issue_12587():
  717. # sort holes into intervals
  718. p = Piecewise((1, x > 4), (2, Not((x <= 3) & (x > -1))), (3, True))
  719. assert p.integrate((x, -5, 5)) == 23
  720. p = Piecewise((1, x > 1), (2, x < y), (3, True))
  721. lim = x, -3, 3
  722. ans = p.integrate(lim)
  723. for i in range(-1, 3):
  724. assert ans.subs(y, i) == p.subs(y, i).integrate(lim)
  725. def test_issue_11045():
  726. assert integrate(1/(x*sqrt(x**2 - 1)), (x, 1, 2)) == pi/3
  727. # handle And with Or arguments
  728. assert Piecewise((1, And(Or(x < 1, x > 3), x < 2)), (0, True)
  729. ).integrate((x, 0, 3)) == 1
  730. # hidden false
  731. assert Piecewise((1, x > 1), (2, x > x + 1), (3, True)
  732. ).integrate((x, 0, 3)) == 5
  733. # targetcond is Eq
  734. assert Piecewise((1, x > 1), (2, Eq(1, x)), (3, True)
  735. ).integrate((x, 0, 4)) == 6
  736. # And has Relational needing to be solved
  737. assert Piecewise((1, And(2*x > x + 1, x < 2)), (0, True)
  738. ).integrate((x, 0, 3)) == 1
  739. # Or has Relational needing to be solved
  740. assert Piecewise((1, Or(2*x > x + 2, x < 1)), (0, True)
  741. ).integrate((x, 0, 3)) == 2
  742. # ignore hidden false (handled in canonicalization)
  743. assert Piecewise((1, x > 1), (2, x > x + 1), (3, True)
  744. ).integrate((x, 0, 3)) == 5
  745. # watch for hidden True Piecewise
  746. assert Piecewise((2, Eq(1 - x, x*(1/x - 1))), (0, True)
  747. ).integrate((x, 0, 3)) == 6
  748. # overlapping conditions of targetcond are recognized and ignored;
  749. # the condition x > 3 will be pre-empted by the first condition
  750. assert Piecewise((1, Or(x < 1, x > 2)), (2, x > 3), (3, True)
  751. ).integrate((x, 0, 4)) == 6
  752. # convert Ne to Or
  753. assert Piecewise((1, Ne(x, 0)), (2, True)
  754. ).integrate((x, -1, 1)) == 2
  755. # no default but well defined
  756. assert Piecewise((x, (x > 1) & (x < 3)), (1, (x < 4))
  757. ).integrate((x, 1, 4)) == 5
  758. p = Piecewise((x, (x > 1) & (x < 3)), (1, (x < 4)))
  759. nan = Undefined
  760. i = p.integrate((x, 1, y))
  761. assert i == Piecewise(
  762. (y - 1, y < 1),
  763. (Min(3, y)**2/2 - Min(3, y) + Min(4, y) - S.Half,
  764. y <= Min(4, y)),
  765. (nan, True))
  766. assert p.integrate((x, 1, -1)) == i.subs(y, -1)
  767. assert p.integrate((x, 1, 4)) == 5
  768. assert p.integrate((x, 1, 5)) is nan
  769. # handle Not
  770. p = Piecewise((1, x > 1), (2, Not(And(x > 1, x< 3))), (3, True))
  771. assert p.integrate((x, 0, 3)) == 4
  772. # handle updating of int_expr when there is overlap
  773. p = Piecewise(
  774. (1, And(5 > x, x > 1)),
  775. (2, Or(x < 3, x > 7)),
  776. (4, x < 8))
  777. assert p.integrate((x, 0, 10)) == 20
  778. # And with Eq arg handling
  779. assert Piecewise((1, x < 1), (2, And(Eq(x, 3), x > 1))
  780. ).integrate((x, 0, 3)) is S.NaN
  781. assert Piecewise((1, x < 1), (2, And(Eq(x, 3), x > 1)), (3, True)
  782. ).integrate((x, 0, 3)) == 7
  783. assert Piecewise((1, x < 0), (2, And(Eq(x, 3), x < 1)), (3, True)
  784. ).integrate((x, -1, 1)) == 4
  785. # middle condition doesn't matter: it's a zero width interval
  786. assert Piecewise((1, x < 1), (2, Eq(x, 3) & (y < x)), (3, True)
  787. ).integrate((x, 0, 3)) == 7
  788. def test_holes():
  789. nan = Undefined
  790. assert Piecewise((1, x < 2)).integrate(x) == Piecewise(
  791. (x, x < 2), (nan, True))
  792. assert Piecewise((1, And(x > 1, x < 2))).integrate(x) == Piecewise(
  793. (nan, x < 1), (x, x < 2), (nan, True))
  794. assert Piecewise((1, And(x > 1, x < 2))).integrate((x, 0, 3)) is nan
  795. assert Piecewise((1, And(x > 0, x < 4))).integrate((x, 1, 3)) == 2
  796. # this also tests that the integrate method is used on non-Piecwise
  797. # arguments in _eval_integral
  798. A, B = symbols("A B")
  799. a, b = symbols('a b', real=True)
  800. assert Piecewise((A, And(x < 0, a < 1)), (B, Or(x < 1, a > 2))
  801. ).integrate(x) == Piecewise(
  802. (B*x, (a > 2)),
  803. (Piecewise((A*x, x < 0), (B*x, x < 1), (nan, True)), a < 1),
  804. (Piecewise((B*x, x < 1), (nan, True)), True))
  805. def test_issue_11922():
  806. def f(x):
  807. return Piecewise((0, x < -1), (1 - x**2, x < 1), (0, True))
  808. autocorr = lambda k: (
  809. f(x) * f(x + k)).integrate((x, -1, 1))
  810. assert autocorr(1.9) > 0
  811. k = symbols('k')
  812. good_autocorr = lambda k: (
  813. (1 - x**2) * f(x + k)).integrate((x, -1, 1))
  814. a = good_autocorr(k)
  815. assert a.subs(k, 3) == 0
  816. k = symbols('k', positive=True)
  817. a = good_autocorr(k)
  818. assert a.subs(k, 3) == 0
  819. assert Piecewise((0, x < 1), (10, (x >= 1))
  820. ).integrate() == Piecewise((0, x < 1), (10*x - 10, True))
  821. def test_issue_5227():
  822. f = 0.0032513612725229*Piecewise((0, x < -80.8461538461539),
  823. (-0.0160799238820171*x + 1.33215984776403, x < 2),
  824. (Piecewise((0.3, x > 123), (0.7, True)) +
  825. Piecewise((0.4, x > 2), (0.6, True)), x <=
  826. 123), (-0.00817409766454352*x + 2.10541401273885, x <
  827. 380.571428571429), (0, True))
  828. i = integrate(f, (x, -oo, oo))
  829. assert i == Integral(f, (x, -oo, oo)).doit()
  830. assert str(i) == '1.00195081676351'
  831. assert Piecewise((1, x - y < 0), (0, True)
  832. ).integrate(y) == Piecewise((0, y <= x), (-x + y, True))
  833. def test_issue_10137():
  834. a = Symbol('a', real=True)
  835. b = Symbol('b', real=True)
  836. x = Symbol('x', real=True)
  837. y = Symbol('y', real=True)
  838. p0 = Piecewise((0, Or(x < a, x > b)), (1, True))
  839. p1 = Piecewise((0, Or(a > x, b < x)), (1, True))
  840. assert integrate(p0, (x, y, oo)) == integrate(p1, (x, y, oo))
  841. p3 = Piecewise((1, And(0 < x, x < a)), (0, True))
  842. p4 = Piecewise((1, And(a > x, x > 0)), (0, True))
  843. ip3 = integrate(p3, x)
  844. assert ip3 == Piecewise(
  845. (0, x <= 0),
  846. (x, x <= Max(0, a)),
  847. (Max(0, a), True))
  848. ip4 = integrate(p4, x)
  849. assert ip4 == ip3
  850. assert p3.integrate((x, 2, 4)) == Min(4, Max(2, a)) - 2
  851. assert p4.integrate((x, 2, 4)) == Min(4, Max(2, a)) - 2
  852. def test_stackoverflow_43852159():
  853. f = lambda x: Piecewise((1, (x >= -1) & (x <= 1)), (0, True))
  854. Conv = lambda x: integrate(f(x - y)*f(y), (y, -oo, +oo))
  855. cx = Conv(x)
  856. assert cx.subs(x, -1.5) == cx.subs(x, 1.5)
  857. assert cx.subs(x, 3) == 0
  858. assert piecewise_fold(f(x - y)*f(y)) == Piecewise(
  859. (1, (y >= -1) & (y <= 1) & (x - y >= -1) & (x - y <= 1)),
  860. (0, True))
  861. def test_issue_12557():
  862. '''
  863. # 3200 seconds to compute the fourier part of issue
  864. import sympy as sym
  865. x,y,z,t = sym.symbols('x y z t')
  866. k = sym.symbols("k", integer=True)
  867. fourier = sym.fourier_series(sym.cos(k*x)*sym.sqrt(x**2),
  868. (x, -sym.pi, sym.pi))
  869. assert fourier == FourierSeries(
  870. sqrt(x**2)*cos(k*x), (x, -pi, pi), (Piecewise((pi**2,
  871. Eq(k, 0)), (2*(-1)**k/k**2 - 2/k**2, True))/(2*pi),
  872. SeqFormula(Piecewise((pi**2, (Eq(_n, 0) & Eq(k, 0)) | (Eq(_n, 0) &
  873. Eq(_n, k) & Eq(k, 0)) | (Eq(_n, 0) & Eq(k, 0) & Eq(_n, -k)) | (Eq(_n,
  874. 0) & Eq(_n, k) & Eq(k, 0) & Eq(_n, -k))), (pi**2/2, Eq(_n, k) | Eq(_n,
  875. -k) | (Eq(_n, 0) & Eq(_n, k)) | (Eq(_n, k) & Eq(k, 0)) | (Eq(_n, 0) &
  876. Eq(_n, -k)) | (Eq(_n, k) & Eq(_n, -k)) | (Eq(k, 0) & Eq(_n, -k)) |
  877. (Eq(_n, 0) & Eq(_n, k) & Eq(_n, -k)) | (Eq(_n, k) & Eq(k, 0) & Eq(_n,
  878. -k))), ((-1)**k*pi**2*_n**3*sin(pi*_n)/(pi*_n**4 - 2*pi*_n**2*k**2 +
  879. pi*k**4) - (-1)**k*pi**2*_n**3*sin(pi*_n)/(-pi*_n**4 + 2*pi*_n**2*k**2
  880. - pi*k**4) + (-1)**k*pi*_n**2*cos(pi*_n)/(pi*_n**4 - 2*pi*_n**2*k**2 +
  881. pi*k**4) - (-1)**k*pi*_n**2*cos(pi*_n)/(-pi*_n**4 + 2*pi*_n**2*k**2 -
  882. pi*k**4) - (-1)**k*pi**2*_n*k**2*sin(pi*_n)/(pi*_n**4 -
  883. 2*pi*_n**2*k**2 + pi*k**4) +
  884. (-1)**k*pi**2*_n*k**2*sin(pi*_n)/(-pi*_n**4 + 2*pi*_n**2*k**2 -
  885. pi*k**4) + (-1)**k*pi*k**2*cos(pi*_n)/(pi*_n**4 - 2*pi*_n**2*k**2 +
  886. pi*k**4) - (-1)**k*pi*k**2*cos(pi*_n)/(-pi*_n**4 + 2*pi*_n**2*k**2 -
  887. pi*k**4) - (2*_n**2 + 2*k**2)/(_n**4 - 2*_n**2*k**2 + k**4),
  888. True))*cos(_n*x)/pi, (_n, 1, oo)), SeqFormula(0, (_k, 1, oo))))
  889. '''
  890. x = symbols("x", real=True)
  891. k = symbols('k', integer=True, finite=True)
  892. abs2 = lambda x: Piecewise((-x, x <= 0), (x, x > 0))
  893. assert integrate(abs2(x), (x, -pi, pi)) == pi**2
  894. func = cos(k*x)*sqrt(x**2)
  895. assert integrate(func, (x, -pi, pi)) == Piecewise(
  896. (2*(-1)**k/k**2 - 2/k**2, Ne(k, 0)), (pi**2, True))
  897. def test_issue_6900():
  898. from itertools import permutations
  899. t0, t1, T, t = symbols('t0, t1 T t')
  900. f = Piecewise((0, t < t0), (x, And(t0 <= t, t < t1)), (0, t >= t1))
  901. g = f.integrate(t)
  902. assert g == Piecewise(
  903. (0, t <= t0),
  904. (t*x - t0*x, t <= Max(t0, t1)),
  905. (-t0*x + x*Max(t0, t1), True))
  906. for i in permutations(range(2)):
  907. reps = dict(zip((t0,t1), i))
  908. for tt in range(-1,3):
  909. assert (g.xreplace(reps).subs(t,tt) ==
  910. f.xreplace(reps).integrate(t).subs(t,tt))
  911. lim = Tuple(t, t0, T)
  912. g = f.integrate(lim)
  913. ans = Piecewise(
  914. (-t0*x + x*Min(T, Max(t0, t1)), T > t0),
  915. (0, True))
  916. for i in permutations(range(3)):
  917. reps = dict(zip((t0,t1,T), i))
  918. tru = f.xreplace(reps).integrate(lim.xreplace(reps))
  919. assert tru == ans.xreplace(reps)
  920. assert g == ans
  921. def test_issue_10122():
  922. assert solve(abs(x) + abs(x - 1) - 1 > 0, x
  923. ) == Or(And(-oo < x, x < S.Zero), And(S.One < x, x < oo))
  924. def test_issue_4313():
  925. u = Piecewise((0, x <= 0), (1, x >= a), (x/a, True))
  926. e = (u - u.subs(x, y))**2/(x - y)**2
  927. M = Max(0, a)
  928. assert integrate(e, x).expand() == Piecewise(
  929. (Piecewise(
  930. (0, x <= 0),
  931. (-y**2/(a**2*x - a**2*y) + x/a**2 - 2*y*log(-y)/a**2 +
  932. 2*y*log(x - y)/a**2 - y/a**2, x <= M),
  933. (-y**2/(-a**2*y + a**2*M) + 1/(-y + M) -
  934. 1/(x - y) - 2*y*log(-y)/a**2 + 2*y*log(-y +
  935. M)/a**2 - y/a**2 + M/a**2, True)),
  936. ((a <= y) & (y <= 0)) | ((y <= 0) & (y > -oo))),
  937. (Piecewise(
  938. (-1/(x - y), x <= 0),
  939. (-a**2/(a**2*x - a**2*y) + 2*a*y/(a**2*x - a**2*y) -
  940. y**2/(a**2*x - a**2*y) + 2*log(-y)/a - 2*log(x - y)/a +
  941. 2/a + x/a**2 - 2*y*log(-y)/a**2 + 2*y*log(x - y)/a**2 -
  942. y/a**2, x <= M),
  943. (-a**2/(-a**2*y + a**2*M) + 2*a*y/(-a**2*y +
  944. a**2*M) - y**2/(-a**2*y + a**2*M) +
  945. 2*log(-y)/a - 2*log(-y + M)/a + 2/a -
  946. 2*y*log(-y)/a**2 + 2*y*log(-y + M)/a**2 -
  947. y/a**2 + M/a**2, True)),
  948. a <= y),
  949. (Piecewise(
  950. (-y**2/(a**2*x - a**2*y), x <= 0),
  951. (x/a**2 + y/a**2, x <= M),
  952. (a**2/(-a**2*y + a**2*M) -
  953. a**2/(a**2*x - a**2*y) - 2*a*y/(-a**2*y + a**2*M) +
  954. 2*a*y/(a**2*x - a**2*y) + y**2/(-a**2*y + a**2*M) -
  955. y**2/(a**2*x - a**2*y) + y/a**2 + M/a**2, True)),
  956. True))
  957. def test__intervals():
  958. assert Piecewise((x + 2, Eq(x, 3)))._intervals(x) == (True, [])
  959. assert Piecewise(
  960. (1, x > x + 1),
  961. (Piecewise((1, x < x + 1)), 2*x < 2*x + 1),
  962. (1, True))._intervals(x) == (True, [(-oo, oo, 1, 1)])
  963. assert Piecewise((1, Ne(x, I)), (0, True))._intervals(x) == (True,
  964. [(-oo, oo, 1, 0)])
  965. assert Piecewise((-cos(x), sin(x) >= 0), (cos(x), True)
  966. )._intervals(x) == (True,
  967. [(0, pi, -cos(x), 0), (-oo, oo, cos(x), 1)])
  968. # the following tests that duplicates are removed and that non-Eq
  969. # generated zero-width intervals are removed
  970. assert Piecewise((1, Abs(x**(-2)) > 1), (0, True)
  971. )._intervals(x) == (True,
  972. [(-1, 0, 1, 0), (0, 1, 1, 0), (-oo, oo, 0, 1)])
  973. def test_containment():
  974. a, b, c, d, e = [1, 2, 3, 4, 5]
  975. p = (Piecewise((d, x > 1), (e, True))*
  976. Piecewise((a, Abs(x - 1) < 1), (b, Abs(x - 2) < 2), (c, True)))
  977. assert p.integrate(x).diff(x) == Piecewise(
  978. (c*e, x <= 0),
  979. (a*e, x <= 1),
  980. (a*d, x < 2), # this is what we want to get right
  981. (b*d, x < 4),
  982. (c*d, True))
  983. def test_piecewise_with_DiracDelta():
  984. d1 = DiracDelta(x - 1)
  985. assert integrate(d1, (x, -oo, oo)) == 1
  986. assert integrate(d1, (x, 0, 2)) == 1
  987. assert Piecewise((d1, Eq(x, 2)), (0, True)).integrate(x) == 0
  988. assert Piecewise((d1, x < 2), (0, True)).integrate(x) == Piecewise(
  989. (Heaviside(x - 1), x < 2), (1, True))
  990. # TODO raise error if function is discontinuous at limit of
  991. # integration, e.g. integrate(d1, (x, -2, 1)) or Piecewise(
  992. # (d1, Eq(x, 1)
  993. def test_issue_10258():
  994. assert Piecewise((0, x < 1), (1, True)).is_zero is None
  995. assert Piecewise((-1, x < 1), (1, True)).is_zero is False
  996. a = Symbol('a', zero=True)
  997. assert Piecewise((0, x < 1), (a, True)).is_zero
  998. assert Piecewise((1, x < 1), (a, x < 3)).is_zero is None
  999. a = Symbol('a')
  1000. assert Piecewise((0, x < 1), (a, True)).is_zero is None
  1001. assert Piecewise((0, x < 1), (1, True)).is_nonzero is None
  1002. assert Piecewise((1, x < 1), (2, True)).is_nonzero
  1003. assert Piecewise((0, x < 1), (oo, True)).is_finite is None
  1004. assert Piecewise((0, x < 1), (1, True)).is_finite
  1005. b = Basic()
  1006. assert Piecewise((b, x < 1)).is_finite is None
  1007. # 10258
  1008. c = Piecewise((1, x < 0), (2, True)) < 3
  1009. assert c != True
  1010. assert piecewise_fold(c) == True
  1011. def test_issue_10087():
  1012. a, b = Piecewise((x, x > 1), (2, True)), Piecewise((x, x > 3), (3, True))
  1013. m = a*b
  1014. f = piecewise_fold(m)
  1015. for i in (0, 2, 4):
  1016. assert m.subs(x, i) == f.subs(x, i)
  1017. m = a + b
  1018. f = piecewise_fold(m)
  1019. for i in (0, 2, 4):
  1020. assert m.subs(x, i) == f.subs(x, i)
  1021. def test_issue_8919():
  1022. c = symbols('c:5')
  1023. x = symbols("x")
  1024. f1 = Piecewise((c[1], x < 1), (c[2], True))
  1025. f2 = Piecewise((c[3], x < Rational(1, 3)), (c[4], True))
  1026. assert integrate(f1*f2, (x, 0, 2)
  1027. ) == c[1]*c[3]/3 + 2*c[1]*c[4]/3 + c[2]*c[4]
  1028. f1 = Piecewise((0, x < 1), (2, True))
  1029. f2 = Piecewise((3, x < 2), (0, True))
  1030. assert integrate(f1*f2, (x, 0, 3)) == 6
  1031. y = symbols("y", positive=True)
  1032. a, b, c, x, z = symbols("a,b,c,x,z", real=True)
  1033. I = Integral(Piecewise(
  1034. (0, (x >= y) | (x < 0) | (b > c)),
  1035. (a, True)), (x, 0, z))
  1036. ans = I.doit()
  1037. assert ans == Piecewise((0, b > c), (a*Min(y, z) - a*Min(0, z), True))
  1038. for cond in (True, False):
  1039. for yy in range(1, 3):
  1040. for zz in range(-yy, 0, yy):
  1041. reps = [(b > c, cond), (y, yy), (z, zz)]
  1042. assert ans.subs(reps) == I.subs(reps).doit()
  1043. def test_unevaluated_integrals():
  1044. f = Function('f')
  1045. p = Piecewise((1, Eq(f(x) - 1, 0)), (2, x - 10 < 0), (0, True))
  1046. assert p.integrate(x) == Integral(p, x)
  1047. assert p.integrate((x, 0, 5)) == Integral(p, (x, 0, 5))
  1048. # test it by replacing f(x) with x%2 which will not
  1049. # affect the answer: the integrand is essentially 2 over
  1050. # the domain of integration
  1051. assert Integral(p, (x, 0, 5)).subs(f(x), x%2).n() == 10
  1052. # this is a test of using _solve_inequality when
  1053. # solve_univariate_inequality fails
  1054. assert p.integrate(y) == Piecewise(
  1055. (y, Eq(f(x), 1) | ((x < 10) & Eq(f(x), 1))),
  1056. (2*y, (x > -oo) & (x < 10)), (0, True))
  1057. def test_conditions_as_alternate_booleans():
  1058. a, b, c = symbols('a:c')
  1059. assert Piecewise((x, Piecewise((y < 1, x > 0), (y > 1, True)))
  1060. ) == Piecewise((x, ITE(x > 0, y < 1, y > 1)))
  1061. def test_Piecewise_rewrite_as_ITE():
  1062. a, b, c, d = symbols('a:d')
  1063. def _ITE(*args):
  1064. return Piecewise(*args).rewrite(ITE)
  1065. assert _ITE((a, x < 1), (b, x >= 1)) == ITE(x < 1, a, b)
  1066. assert _ITE((a, x < 1), (b, x < oo)) == ITE(x < 1, a, b)
  1067. assert _ITE((a, x < 1), (b, Or(y < 1, x < oo)), (c, y > 0)
  1068. ) == ITE(x < 1, a, b)
  1069. assert _ITE((a, x < 1), (b, True)) == ITE(x < 1, a, b)
  1070. assert _ITE((a, x < 1), (b, x < 2), (c, True)
  1071. ) == ITE(x < 1, a, ITE(x < 2, b, c))
  1072. assert _ITE((a, x < 1), (b, y < 2), (c, True)
  1073. ) == ITE(x < 1, a, ITE(y < 2, b, c))
  1074. assert _ITE((a, x < 1), (b, x < oo), (c, y < 1)
  1075. ) == ITE(x < 1, a, b)
  1076. assert _ITE((a, x < 1), (c, y < 1), (b, x < oo), (d, True)
  1077. ) == ITE(x < 1, a, ITE(y < 1, c, b))
  1078. assert _ITE((a, x < 0), (b, Or(x < oo, y < 1))
  1079. ) == ITE(x < 0, a, b)
  1080. raises(TypeError, lambda: _ITE((x + 1, x < 1), (x, True)))
  1081. # if `a` in the following were replaced with y then the coverage
  1082. # is complete but something other than as_set would need to be
  1083. # used to detect this
  1084. raises(NotImplementedError, lambda: _ITE((x, x < y), (y, x >= a)))
  1085. raises(ValueError, lambda: _ITE((a, x < 2), (b, x > 3)))
  1086. def test_issue_14052():
  1087. assert integrate(abs(sin(x)), (x, 0, 2*pi)) == 4
  1088. def test_issue_14240():
  1089. assert piecewise_fold(
  1090. Piecewise((1, a), (2, b), (4, True)) +
  1091. Piecewise((8, a), (16, True))
  1092. ) == Piecewise((9, a), (18, b), (20, True))
  1093. assert piecewise_fold(
  1094. Piecewise((2, a), (3, b), (5, True)) *
  1095. Piecewise((7, a), (11, True))
  1096. ) == Piecewise((14, a), (33, b), (55, True))
  1097. # these will hang if naive folding is used
  1098. assert piecewise_fold(Add(*[
  1099. Piecewise((i, a), (0, True)) for i in range(40)])
  1100. ) == Piecewise((780, a), (0, True))
  1101. assert piecewise_fold(Mul(*[
  1102. Piecewise((i, a), (0, True)) for i in range(1, 41)])
  1103. ) == Piecewise((factorial(40), a), (0, True))
  1104. def test_issue_14787():
  1105. x = Symbol('x')
  1106. f = Piecewise((x, x < 1), ((S(58) / 7), True))
  1107. assert str(f.evalf()) == "Piecewise((x, x < 1), (8.28571428571429, True))"
  1108. def test_issue_8458():
  1109. x, y = symbols('x y')
  1110. # Original issue
  1111. p1 = Piecewise((0, Eq(x, 0)), (sin(x), True))
  1112. assert p1.simplify() == sin(x)
  1113. # Slightly larger variant
  1114. p2 = Piecewise((x, Eq(x, 0)), (4*x + (y-2)**4, Eq(x, 0) & Eq(x+y, 2)), (sin(x), True))
  1115. assert p2.simplify() == sin(x)
  1116. # Test for problem highlighted during review
  1117. p3 = Piecewise((x+1, Eq(x, -1)), (4*x + (y-2)**4, Eq(x, 0) & Eq(x+y, 2)), (sin(x), True))
  1118. assert p3.simplify() == Piecewise((0, Eq(x, -1)), (sin(x), True))
  1119. def test_issue_16417():
  1120. z = Symbol('z')
  1121. assert unchanged(Piecewise, (1, Or(Eq(im(z), 0), Gt(re(z), 0))), (2, True))
  1122. x = Symbol('x')
  1123. assert unchanged(Piecewise, (S.Pi, re(x) < 0),
  1124. (0, Or(re(x) > 0, Ne(im(x), 0))),
  1125. (S.NaN, True))
  1126. r = Symbol('r', real=True)
  1127. p = Piecewise((S.Pi, re(r) < 0),
  1128. (0, Or(re(r) > 0, Ne(im(r), 0))),
  1129. (S.NaN, True))
  1130. assert p == Piecewise((S.Pi, r < 0),
  1131. (0, r > 0),
  1132. (S.NaN, True), evaluate=False)
  1133. # Does not work since imaginary != 0...
  1134. #i = Symbol('i', imaginary=True)
  1135. #p = Piecewise((S.Pi, re(i) < 0),
  1136. # (0, Or(re(i) > 0, Ne(im(i), 0))),
  1137. # (S.NaN, True))
  1138. #assert p == Piecewise((0, Ne(im(i), 0)),
  1139. # (S.NaN, True), evaluate=False)
  1140. i = I*r
  1141. p = Piecewise((S.Pi, re(i) < 0),
  1142. (0, Or(re(i) > 0, Ne(im(i), 0))),
  1143. (S.NaN, True))
  1144. assert p == Piecewise((0, Ne(im(i), 0)),
  1145. (S.NaN, True), evaluate=False)
  1146. assert p == Piecewise((0, Ne(r, 0)),
  1147. (S.NaN, True), evaluate=False)
  1148. def test_eval_rewrite_as_KroneckerDelta():
  1149. x, y, z, n, t, m = symbols('x y z n t m')
  1150. K = KroneckerDelta
  1151. f = lambda p: expand(p.rewrite(K))
  1152. p1 = Piecewise((0, Eq(x, y)), (1, True))
  1153. assert f(p1) == 1 - K(x, y)
  1154. p2 = Piecewise((x, Eq(y,0)), (z, Eq(t,0)), (n, True))
  1155. assert f(p2) == n*K(0, t)*K(0, y) - n*K(0, t) - n*K(0, y) + n + \
  1156. x*K(0, y) - z*K(0, t)*K(0, y) + z*K(0, t)
  1157. p3 = Piecewise((1, Ne(x, y)), (0, True))
  1158. assert f(p3) == 1 - K(x, y)
  1159. p4 = Piecewise((1, Eq(x, 3)), (4, True), (5, True))
  1160. assert f(p4) == 4 - 3*K(3, x)
  1161. p5 = Piecewise((3, Ne(x, 2)), (4, Eq(y, 2)), (5, True))
  1162. assert f(p5) == -K(2, x)*K(2, y) + 2*K(2, x) + 3
  1163. p6 = Piecewise((0, Ne(x, 1) & Ne(y, 4)), (1, True))
  1164. assert f(p6) == -K(1, x)*K(4, y) + K(1, x) + K(4, y)
  1165. p7 = Piecewise((2, Eq(y, 3) & Ne(x, 2)), (1, True))
  1166. assert f(p7) == -K(2, x)*K(3, y) + K(3, y) + 1
  1167. p8 = Piecewise((4, Eq(x, 3) & Ne(y, 2)), (1, True))
  1168. assert f(p8) == -3*K(2, y)*K(3, x) + 3*K(3, x) + 1
  1169. p9 = Piecewise((6, Eq(x, 4) & Eq(y, 1)), (1, True))
  1170. assert f(p9) == 5 * K(1, y) * K(4, x) + 1
  1171. p10 = Piecewise((4, Ne(x, -4) | Ne(y, 1)), (1, True))
  1172. assert f(p10) == -3 * K(-4, x) * K(1, y) + 4
  1173. p11 = Piecewise((1, Eq(y, 2) | Ne(x, -3)), (2, True))
  1174. assert f(p11) == -K(-3, x)*K(2, y) + K(-3, x) + 1
  1175. p12 = Piecewise((-1, Eq(x, 1) | Ne(y, 3)), (1, True))
  1176. assert f(p12) == -2*K(1, x)*K(3, y) + 2*K(3, y) - 1
  1177. p13 = Piecewise((3, Eq(x, 2) | Eq(y, 4)), (1, True))
  1178. assert f(p13) == -2*K(2, x)*K(4, y) + 2*K(2, x) + 2*K(4, y) + 1
  1179. p14 = Piecewise((1, Ne(x, 0) | Ne(y, 1)), (3, True))
  1180. assert f(p14) == 2 * K(0, x) * K(1, y) + 1
  1181. p15 = Piecewise((2, Eq(x, 3) | Ne(y, 2)), (3, Eq(x, 4) & Eq(y, 5)), (1, True))
  1182. assert f(p15) == -2*K(2, y)*K(3, x)*K(4, x)*K(5, y) + K(2, y)*K(3, x) + \
  1183. 2*K(2, y)*K(4, x)*K(5, y) - K(2, y) + 2
  1184. p16 = Piecewise((0, Ne(m, n)), (1, True))*Piecewise((0, Ne(n, t)), (1, True))\
  1185. *Piecewise((0, Ne(n, x)), (1, True)) - Piecewise((0, Ne(t, x)), (1, True))
  1186. assert f(p16) == K(m, n)*K(n, t)*K(n, x) - K(t, x)
  1187. p17 = Piecewise((0, Ne(t, x) & (Ne(m, n) | Ne(n, t) | Ne(n, x))),
  1188. (1, Ne(t, x)), (-1, Ne(m, n) | Ne(n, t) | Ne(n, x)), (0, True))
  1189. assert f(p17) == K(m, n)*K(n, t)*K(n, x) - K(t, x)
  1190. p18 = Piecewise((-4, Eq(y, 1) | (Eq(x, -5) & Eq(x, z))), (4, True))
  1191. assert f(p18) == 8*K(-5, x)*K(1, y)*K(x, z) - 8*K(-5, x)*K(x, z) - 8*K(1, y) + 4
  1192. p19 = Piecewise((0, x > 2), (1, True))
  1193. assert f(p19) == p19
  1194. p20 = Piecewise((0, And(x < 2, x > -5)), (1, True))
  1195. assert f(p20) == p20
  1196. p21 = Piecewise((0, Or(x > 1, x < 0)), (1, True))
  1197. assert f(p21) == p21
  1198. p22 = Piecewise((0, ~((Eq(y, -1) | Ne(x, 0)) & (Ne(x, 1) | Ne(y, -1)))), (1, True))
  1199. assert f(p22) == K(-1, y)*K(0, x) - K(-1, y)*K(1, x) - K(0, x) + 1
  1200. @slow
  1201. def test_identical_conds_issue():
  1202. from sympy.stats import Uniform, density
  1203. u1 = Uniform('u1', 0, 1)
  1204. u2 = Uniform('u2', 0, 1)
  1205. # Result is quite big, so not really important here (and should ideally be
  1206. # simpler). Should not give an exception though.
  1207. density(u1 + u2)
  1208. def test_issue_7370():
  1209. f = Piecewise((1, x <= 2400))
  1210. v = integrate(f, (x, 0, Float("252.4", 30)))
  1211. assert str(v) == '252.400000000000000000000000000'
  1212. def test_issue_14933():
  1213. x = Symbol('x')
  1214. y = Symbol('y')
  1215. inp = MatrixSymbol('inp', 1, 1)
  1216. rep_dict = {y: inp[0, 0], x: inp[0, 0]}
  1217. p = Piecewise((1, ITE(y > 0, x < 0, True)))
  1218. assert p.xreplace(rep_dict) == Piecewise((1, ITE(inp[0, 0] > 0, inp[0, 0] < 0, True)))
  1219. def test_issue_16715():
  1220. raises(NotImplementedError, lambda: Piecewise((x, x<0), (0, y>1)).as_expr_set_pairs())
  1221. def test_issue_20360():
  1222. t, tau = symbols("t tau", real=True)
  1223. n = symbols("n", integer=True)
  1224. lam = pi * (n - S.Half)
  1225. eq = integrate(exp(lam * tau), (tau, 0, t))
  1226. assert eq.simplify() == (2*exp(pi*t*(2*n - 1)/2) - 2)/(pi*(2*n - 1))
  1227. def test_piecewise_eval():
  1228. # XXX these tests might need modification if this
  1229. # simplification is moved out of eval and into
  1230. # boolalg or Piecewise simplification functions
  1231. f = lambda x: x.args[0].cond
  1232. # unsimplified
  1233. assert f(Piecewise((x, (x > -oo) & (x < 3)))
  1234. ) == ((x > -oo) & (x < 3))
  1235. assert f(Piecewise((x, (x > -oo) & (x < oo)))
  1236. ) == ((x > -oo) & (x < oo))
  1237. assert f(Piecewise((x, (x > -3) & (x < 3)))
  1238. ) == ((x > -3) & (x < 3))
  1239. assert f(Piecewise((x, (x > -3) & (x < oo)))
  1240. ) == ((x > -3) & (x < oo))
  1241. assert f(Piecewise((x, (x <= 3) & (x > -oo)))
  1242. ) == ((x <= 3) & (x > -oo))
  1243. assert f(Piecewise((x, (x <= 3) & (x > -3)))
  1244. ) == ((x <= 3) & (x > -3))
  1245. assert f(Piecewise((x, (x >= -3) & (x < 3)))
  1246. ) == ((x >= -3) & (x < 3))
  1247. assert f(Piecewise((x, (x >= -3) & (x < oo)))
  1248. ) == ((x >= -3) & (x < oo))
  1249. assert f(Piecewise((x, (x >= -3) & (x <= 3)))
  1250. ) == ((x >= -3) & (x <= 3))
  1251. # could simplify by keeping only the first
  1252. # arg of result
  1253. assert f(Piecewise((x, (x <= oo) & (x > -oo)))
  1254. ) == (x > -oo) & (x <= oo)
  1255. assert f(Piecewise((x, (x <= oo) & (x > -3)))
  1256. ) == (x > -3) & (x <= oo)
  1257. assert f(Piecewise((x, (x >= -oo) & (x < 3)))
  1258. ) == (x < 3) & (x >= -oo)
  1259. assert f(Piecewise((x, (x >= -oo) & (x < oo)))
  1260. ) == (x < oo) & (x >= -oo)
  1261. assert f(Piecewise((x, (x >= -oo) & (x <= 3)))
  1262. ) == (x <= 3) & (x >= -oo)
  1263. assert f(Piecewise((x, (x >= -oo) & (x <= oo)))
  1264. ) == (x <= oo) & (x >= -oo) # but cannot be True unless x is real
  1265. assert f(Piecewise((x, (x >= -3) & (x <= oo)))
  1266. ) == (x >= -3) & (x <= oo)
  1267. assert f(Piecewise((x, (Abs(arg(a)) <= 1) | (Abs(arg(a)) < 1)))
  1268. ) == (Abs(arg(a)) <= 1) | (Abs(arg(a)) < 1)
  1269. def test_issue_22533():
  1270. x = Symbol('x', real=True)
  1271. f = Piecewise((-1 / x, x <= 0), (1 / x, True))
  1272. assert integrate(f, x) == Piecewise((-log(x), x <= 0), (log(x), True))