# Problem with Integrate with Piecewise and PrincipalValue

Bug introduced in 8.0.4 or earlier and persisting through 11.3

In the course of developing an alternative solution for question 127301,

With,

$Version (* "11.0.0 for Microsoft Windows (64-bit) (July 28, 2016)" *)  I attempted to perform the integral, um = -(2/3) - 2/(3 (-1 + u)) - (2 u)/3 + u^2/3; up = -(10/3) - 2/(3 (-1 + u)) + (8 u)/3 - u^2/3; sv = Piecewise[{{um, u <= 1}, {up, u > 1}}]; Integrate[sv, {u, 0, 2}, PrincipalValue -> True]  but received the error message, Integrate: Integral of ... does not converge on {0,2}. Separating the term, -(2/(3 (-1 + u))), does not help. sv1 = Piecewise[{{um + 2/(3 (-1 + u)), u <= 1}, {up + 2/(3 (-1 + u)), u > 1}}]; Integrate[sv1 - 2/(3 (-1 + u)), {u, 0, 2}, PrincipalValue -> True]  yielding the same error message. Yet, Integrate[sv1, {u, 0, 2}] - Integrate[2/(3 (-1 + u)), {u, 0, 2}, PrincipalValue -> True] (* -1 *)  does work. (The second integral equals 0, incidentally.) Is this a bug, or am I missing something? Thanks. (Note that 10.4.1 produces the same results.) Addendum: Workaround Slightly shifting the Piecewise boundary at u = 1 so that the singular point lies within one or the other segment gives an accurate result. For instance, redefining sv as sv = Piecewise[{{um, u <= 1 + 10^-10}, {up, u > 1 + 10^-10}}];  allows sv to be integrated by Integrate. Integrate[sv, {u, 0, 2}, PrincipalValue -> True] // FullSimplify (* -(4500000000000000000044999999999/4500000000000000000000000000000) *)  which is 1. to 20 significant figures. That this occurs is consistent with the suggestion by MichaelE2 that Integrate integrates each segment of Piecewise independently and, therefore, cannot handle singularities at the boundary between two segments. Nonetheless, I believe that it should be able to. Failing that, the documentation should describe this limitation. • w/ v10.1 they just return unevaluated, no error message. – george2079 Sep 28 '16 at 21:40 • @george2079 Thanks for the additional information. Also, your comment remained me to add my own $Version information. – bbgodfrey Sep 28 '16 at 21:58
• My guess is that PiecewiseExpand is applied to the integrand, the integral of the resulting Piecewise function is broken up according to the pieces, and the principal value of each piece is computed. And the integrals of the pieces diverge. FWIW, GenerateConditions -> False gives the right answer plus half the contribution of the pole at u == 1. – Michael E2 Sep 29 '16 at 1:58
• @MichaelE2 Your guess seems credible, especially because I now see that moving the boundary to 1.001 (for instance) gives a reasonable result. But Integrate should recognize a singularity at the boundary between two pieces of Piecewise and with PrincipalValue -> True attempt to match it with a singularity at the other side of the boundary (obtained using Series, perhaps). If it cannot, the documentation should say so. – bbgodfrey Sep 29 '16 at 2:21
• Re@Integrate[sv, {u, 0, 2}, PrincipalValue -> True, GenerateConditions -> False] seems nearly satisfactory to me, given the pole makes a predictably purely imaginary contribution; but maybe my standards for symbolic integration are low. :) – Michael E2 Sep 29 '16 at 2:29

I think this is a bug, because if we transform the Piecewise function into a combination of UnitStep (which is mathematically equivalent to the original function of course), Integrate integrates without difficulty:

um = -(2/3) - 2/(3 (-1 + u)) - (2 u)/3 + u^2/3;
up = -(10/3) - 2/(3 (-1 + u)) + (8 u)/3 - u^2/3;
sv = SimplifyPWToUnitStep@Piecewise[{{um, u <= 1}, {up, u > 1}}];
Integrate[sv, {u, 0, 2}, PrincipalValue -> True]
(* -1 *)


Tested on v9.0.1 and v11.2.

• Excellent explanation and workaround. Thanks. I see that Simplify has a large family of sub-functions. Are they documented anywhere? – bbgodfrey Sep 29 '16 at 12:11
• @bbgodfrey As far as I know, they're all undocumented… I learned the usage of SimplifyPWToUnitStep by (accidentally) reading this answer. – xzczd Sep 29 '16 at 12:21

Another way. Integrate from both sides to small r near the singularity and let r go to zero.

um = -(2/3) - 2/(3 (-1 + u)) - (2 u)/3 + u^2/3;
up = -(10/3) - 2/(3 (-1 + u)) + (8 u)/3 - u^2/3;
sv[u_] = Piecewise[{{um, u <= 1}, {up, u > 1}}];

int = Integrate[sv[u], {u, 0, 1 - r}, Assumptions -> 0 < r < 1] +
Integrate[sv[u], {u, 1 + r, 2}, Assumptions -> 0 < r < 1]

(*   1/9 (-8 + 9 r - r^3 - 6 Log[r]) +
1/9 (-1 + 9 r - 9 r^2 + r^3 + 6 Log[r])   *)

Limit[int, r -> 0, Direction -> -1]

(*   -1   *)