Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.soft-sys.math.mathematica > #3768

Re: Keeping it real

From Heike Gramberg <heike.gramberg@gmail.com>
Newsgroups comp.soft-sys.math.mathematica
Subject Re: Keeping it real
Date 2011-07-16 09:50 +0000
Organization Steven M. Christensen and Associates, Inc and MathTensor, Inc.
Message-ID <ivrmtb$887$1@smc.vnet.net> (permalink)
References <201107150120.VAA23674@smc.vnet.net>

Show all headers | View raw


If you use Refine with appropriate Assumptions, you get a slightly better result:

Block[{a, c0, d0},
 Block[{$Assumptions = 0 < a < d0 && 0 < a < d0 + c0 z, pos},
  int = Expand@
    Refine[2*a*
      Integrate[((-d0/z^2)/(c0 + d0/z))/
        Sqrt[-a^2 + z^2 (c0 + d0/z)^2], z]]
  ]]

output:

-2 I Log[-((2 d0 (-I a + Sqrt[-a^2 + (d0 + c0 z)^2]))/(
    d0 + c0 z))] + (
 2 a Log[(2 d0 ((-a^2 + d0 (d0 + c0 z))/Sqrt[-a^2 + d0^2] +
      Sqrt[-a^2 + (d0 + c0 z)^2]))/z])/Sqrt[-a^2 + d0^2]

Note that the second Log-term is now real (provided the parameters satisfy the assumptions made). The first
Log-term can be simplified a bit further by using ComplexExpand. Since I want to leave the second Log as it
is, I just extract the first Log and apply ComplexExpand:

result = Block[{a, c0, d0, int},
  Block[{$Assumptions = 0 < a < d0 && 0 < a < d0 + c0 z, pos},
   int = Expand@
     Refine[2*a*
       Integrate[((-d0/z^2)/(c0 + d0/z))/
         Sqrt[-a^2 + z^2 (c0 + d0/z)^2], z]];
   pos = Position[int, -2 I Log[___]][[1]];
   ReplacePart[int,
    pos -> Expand@Simplify@ComplexExpand[Extract[int, pos]]]]
  ]

Output:

2 Arg[I a - Sqrt[-a^2 + (d0 + c0 z)^2]] - 2 I Log[2 d0] + (
 2 a Log[(2 d0 ((-a^2 + d0 (d0 + c0 z))/Sqrt[-a^2 + d0^2] +
      Sqrt[-a^2 + (d0 + c0 z)^2]))/z])/Sqrt[-a^2 + d0^2]

Which is real except for the constant term -2 I Log[2 d0]. Since an indefinite integral is unique up
to an arbitrary constant, you can add 2 I Log[2 d0] to get a real solution.


Heike.



On 15 Jul 2011, at 02:20, amannuc wrote:

> I am facing perhaps the "age-old" question of limiting the indefinite
> integrals that Mathematica returns. In particular, I am trying to
> avoid complex numbers. I have tried using "Assumptions" in the Integrate
> command to no avail.
>
> The specific integral is:
>
> SetAttributes[{c0, d0}, {Constant}] (* Probably redundant. See Block
> function *)
> Simplify[Block[{a, c0, d0},
>  2.0 * a *
>   Integrate[
> ((-d0/z^2)/(c0 + d0/z))/Sqrt[-a^2 + z^2 (c0 + d0/z)^2],
>    z,
> Assumptions -> {z \[Element] Reals, a \[Element] Reals,
>      c0 \[Element] Reals, d0 \[Element] Reals}]]]
>
>
>
> Admirably, Mathematica returns an answer, although with complex
> numbers. I verified the answer is correct by taking its derivative.
> The returned answer is:
> (0. - 2. I) Log[-((2 d0 (-I a + Sqrt[-a^2 + (d0 + c0 z)^2]))/(
>    d0 + c0 z))] + ((0. + 2. I) a Log[(
>   2 d0 ((I (-a^2 + d0 (d0 + c0 z)))/Sqrt[a^2 - d0^2] +
>      Sqrt[-a^2 + (d0 + c0 z)^2]))/z])/Sqrt[a^2 - d0^2]
>
> Note all the "I"s. This is a fairly simple answer returned. I doubt
> that is the only solution. When I evaluate it for cases of interest, I get
> complex numbers, which can't be right in my particular case which is
> based on a physical problem.
>
>
> Thanks for any insights.
>
> --
> Tony Mannucci
>

Back to comp.soft-sys.math.mathematica | Previous | Next | Find similar | Unroll thread


Thread

Re: Keeping it real Heike Gramberg <heike.gramberg@gmail.com> - 2011-07-16 09:50 +0000

csiph-web