fixed in 10.1 (windows)


For a parameter $t\in (0,1)$

$Assumptions = t ∈ Reals && t > 0 && t < 1

I define an obviously positive function $f(x)=\left| \Re \left(\frac{\exp(ix)}{1-t\exp(ix)}\right)\right|$

f[x_] = Abs[Re[Exp[I*x]/(1 - t*Exp[I*x])]]

Mathematica 9.0.1.0 calculates the integral

Integrate[f[x], {x, 0, 2 π}]

as $-2 \pi /t$ which is negative. What is the problem?

  • 2
    This definitely looks like a bug that should be reported. In version 8.0.4 the integral stays unevaluated, which is better than giving a wrong result... – Jens Nov 17 '14 at 16:45
  • 1
    Forgot to mention that in v10 the result is the same as in v9. – Szabolcs Nov 17 '14 at 18:29
  • 1
    Reported as a bug. – Daniel Lichtblau Nov 19 '14 at 17:20
  • What is it that much hard for MMA developers to fix this bug between version 9 and 10? They could at the least put a message to warn about the bug. – MOON Dec 28 '14 at 4:46
up vote 13 down vote accepted

As you notniced, the result is not correct. This is not uncommon with definite integrals, as the system needs to detect any special behaviour inbetween the integration bounds, which is hard. For this reason it's a good idea to verify such integrals numerically.

We can get the correct result like this (please evaluate in a fresh kernel without $Assumptions).

First, for numerical verification:

F[t_?NumericQ] := NIntegrate[ Abs@Re[Exp[I*x]/(1 - t*Exp[I*x])], {x, 0, 2Pi} ]

Plot[F[t], {t, -5, 5}, MaxRecursion -> 2]

Mathematica graphics

We see that it has a different behaviour for $-1 < t < 1$ than for $|t| > 1$. That's because the integrand, without the Abs, changes sign in $[0, 2\pi]$ when $|t| < 1$:

Manipulate[
 Plot[Re[Exp[I*x]/(1 - t*Exp[I*x])], {x, 0, 2 Pi}, PlotRange -> All],
 {t, -2, 2}
]

Mathematica graphics

Mathematica managed to get the correct result this way:

fun = Re[Exp[I*x]/(1 - t*Exp[I*x])] // ComplexExpand // Simplify
(* (-t + Cos[x])/(1 + t^2 - 2 t Cos[x]) *)

Integrate[Abs[fun], {x, 0, 2 Pi}, Assumptions -> 0 < t < 1]
(* (π - ArcCos[t] + I ArcCosh[t] + 
 2 ArcTan[(-1 + t)/Sqrt[1 - t^2]] - 
 2 ArcTan[((1 + t) Tan[ArcCos[t]/2])/(-1 + t)])/t *)

res = FullSimplify[%, 0 < t < 1]
(* ((3 π)/2 + I ArcCosh[t] + ArcSin[t] + 
 4 ArcTan[(-1 + t)/Sqrt[1 - t^2]])/t *)

Then verify numerically:

Table[res - F[t], {t, 0, 1, .1}] // Chop

{Indeterminate, -5.7728*10^-7, -1.70775*10^-7, -1.8055*10^-6, -8.52578*10^-8, 
 7.67182*10^-8, -5.98418*10^-7, -1.16494*10^-6, -7.9843*10^-7, 
 4.67139*10^-7, Indeterminate}

It agrees with the numerical calculation up to a small numerical error.

Alternatively, we might try to find where fun == 0 and manually piece the integral together from two parts where fun > 0 and fun < 0. Then we don't need to rely on Integrate being able to handle this simplified Abs[fun]. I can show how on request.

  • Yes, please show it to us, +1. – user9660 Nov 17 '14 at 21:07
  • Thanks for your help. I find it strange that the simple explicit calculation of the real part changes the result. Moreover, the "pseudo-complex" expresseion $i$ ArcCosh$(t)$ (which is in fact real for an appropriate definition of ArcCosh) is strange. – Jochen Wengenroth Nov 18 '14 at 8:39
  • 1
    @JochenWengenroth I managed to get a simpler expression (2/t) (Pi - 2 ArcCos[t]) by doing it half-manually. – Szabolcs Nov 18 '14 at 15:24
  • @Szabolcs Excellent! – Jochen Wengenroth Nov 19 '14 at 7:49

Just a workaround.

In[4]:= Clear["Global`*"]

In[5]:= f[x_, t_] := Abs[Re[Exp[I*x]/(1 - t*Exp[I*x])]]

In[6]:= Timing[
 resAn[t_] = 
  Integrate[f[x, EulerGamma], {x, 0, 2*Pi}] /. EulerGamma -> t]

Out[6]= {23.104, -((2*(ArcCos[t] + 
        2*ArcTan[((1 + t)*Tan[ArcCos[t]/2])/(-1 + t)]))/t)}

In[7]:= resNum[t_] := NIntegrate[f[x, t], {x, 0, 2*Pi}]

In[8]:= (resNum[#1] - resAn[#1] & ) /@ RandomReal[{0, 1}, 10]

Out[8]= {-2.700923671383748*^-7, 2.0563655223071464*^-7, \
-5.813341690696916*^-6, 
   1.2717096442571574*^-6, 2.194853188086654*^-8, \
3.578415519456257*^-7, 
   -7.5046305703097*^-7, -2.2693759706982064*^-6, \
1.3046701408114814*^-7, 
   6.545158557358377*^-7}

Update

Proceeding a little further and in view of Szalbocs' last comment I managed to get a simplified answer as follows

In[117]:= Timing[
 Integrate[
  Abs[Re[Exp[I*x]/(1 - t*Exp[I*x])]] /. t -> EulerGamma, {x, 0, 2*Pi}]]

Out[117]= {19.15692280000000025097506295423954725266`7.302925662369298, 
   -((2*(ArcCos[EulerGamma] + 
        2*ArcTan[((1 + EulerGamma)*Tan[ArcCos[EulerGamma]/2])/(-1 + 
             EulerGamma)]))/EulerGamma)}

In[131]:= FullSimplify[
 TrigToExp[-((2*(ArcCos[EulerGamma] + 
         2*ArcTan[((1 + EulerGamma)*Tan[ArcCos[EulerGamma]/2])/(-1 + 
              EulerGamma)]))/EulerGamma)]]
(FullSimplify[#1, 0 < u < Pi/2] & )[% /. EulerGamma -> Cos[u]]
FullSimplify[% /. u -> ArcCos[EulerGamma]] /. EulerGamma -> t

Out[131]= (Pi + 
   2*ArcCot[(2*EulerGamma*Sqrt[1 - EulerGamma^2])/(-1 + 
        2*EulerGamma^2)])/EulerGamma

Out[132]= (Pi + 2*ArcCot[Tan[2*u]])*Sec[u]

Out[133]= (4*ArcSin[t])/t
  • What is the moral of the replacement t-> EulerGamma? – Jochen Wengenroth Nov 19 '14 at 7:52
  • N@EulerGamma -> 0.577216 and 0<t<1 as it mentioned in the begining of the post. – dimitris Nov 19 '14 at 8:55
  • Of course I do not consider this method as a panacea for each and every simular situation. As I said it is just a workaround. Nothing more, nothing less. At least, it provides a solution:-)! Obviously, Szalbocs analysis is more rigorous. – dimitris Nov 19 '14 at 9:01

fixed in 10.1 (windows).

Now integral remains unevaluated.

Mathematica graphics


Mathematica graphics

code:

$Assumptions = t \[Element] Reals && t > 0 && t < 1
f[x_] = Abs[Re[Exp[I*x]/(1 - t*Exp[I*x])]]
Integrate[f[x], {x, 0, 2 \[Pi]}]

Your Answer

 
discard

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.