3
$\begingroup$

I've found a few threads addressing this, but they all seem to have pretty clunky answers, and it's hard to believe there's not a more elegant solution in Mathematica:

Remove annoying Conjugate

a problem about simplifing conjugate

The first thread is very clunky and I'm having trouble implementing it in a standalone function, and the 2nd solution isn't working for me, as far as I can tell.

Here's the simplest I can reduce my problem to. Let's say I have a term:

bop = Sqrt[x-2]

And I want to find the complex conjugate (CC) of it, and let's assume x is Real. I think MMa runs into problems because, depending on the value of x, the form of the CC will be pretty different. For example, if x>2, then bop is real, and the CC is just bop.

On the other hand, if x<2, then the value in the Sqrt is negative, you'd have to pull an imaginary i out of the Sqrt, and flip its sign.

Alright, so now I'm giving it all the information it should need to give me the unambiguous answer:

Assuming[x \[Element] Reals && x < 2, FullSimplify@Conjugate@bop]

Yet, this still gives me:

Conjugate[Sqrt[-2 + x]]

I'm sure I'm just missing something, but what is it? Any advice is appreciated, thank you.

edit: Alright, I solved my contrived example, by doing this:

Assuming[x \[Element] Reals && x < 2, 
 Simplify@Conjugate@ComplexExpand@bop]

-I Sqrt[2 - x]

Which is good. The Simplify[] step is actually kind of vital because without it, it's comes out as a mess, even for something that simple.

Here is my actual application, which is still doing something funky. I have this term of a matrix:

t22 = 0.5 (0. + 
    0.5 E^((0. + 5.14215 I) Sqrt[-2 + energy]) (1 - Sqrt[-2 + energy]/
       Sqrt[energy])) (1 - Sqrt[energy]/Sqrt[-2 + energy]) + 
 0.5 (0. + 
    0.5 E^((0. - 5.14215 I) Sqrt[-2 + energy]) (1 + Sqrt[-2 + energy]/
       Sqrt[energy])) (1 + Sqrt[energy]/Sqrt[-2 + energy])

Which is very ugly, unfortunately. The important things to notice are, first, it is complex, and second, there are 3 regimes of interest: energy <= 0, 0 < energy <= 2, and energy >=2.

I don't mind taking care of those three cases separately, so let's look at the simpler case of energy >= 2.

My goal is to find $|t_{22}|^2=t_{22}^*t_{22}$, which should then be a real number.

The first hurdle is getting $t_{22}^*$. Using Refine doesn't work:

Refine[Conjugate[t22], energy > 2]

gives

Conjugate[
 0.5 (0. + 
     0.5 E^((0. + 5.14215 I) Sqrt[-2 + energy]) (1 - 
        Sqrt[(-2 + energy)/energy])) (1 - Sqrt[
     energy/(-2 + energy)]) + 
  0.5 (0. + 
     0.5 E^((0. - 5.14215 I) Sqrt[-2 + energy]) (1 + 
        Sqrt[(-2 + energy)/energy])) (1 + Sqrt[energy/(-2 + energy)])]

However, it works if I stick a Simplify in there (I kind of thought that's what Refine was doing though?):

t22conj=Refine[Simplify@Conjugate[t22], energy > 2]

gives:

(E^((0. + 5.14215 I) Sqrt[-2 + energy]) (-0.5 + 0.5 energy + 
   0.5 Sqrt[(-2 + energy) energy] + 
   E^((0. - 10.2843 I) Sqrt[-2 + energy]) (0.5 - 0.5 energy + 
      0.5 Sqrt[(-2 + energy) energy])))/Sqrt[(-2 + energy) energy]

Alright, now I want to find $|t_{22}|^2$. Just trying it simply leaves imaginary parts in the answer:

T = Refine[(t22conj*t22), energy > 2]

1/Sqrt[(-2+energy) energy] E^((0. +5.14215 I) Sqrt[-2+energy]) (0.5 (0. +0.5 E^((0. +5.14215 I) Sqrt[-2+energy]) (1-Sqrt[(-2+energy)/energy])) (1-Sqrt[energy/(-2+energy)])+0.5 (0. +0.5 E^((0. -5.14215 I) Sqrt[-2+energy]) (1+Sqrt[(-2+energy)/energy])) (1+Sqrt[energy/(-2+energy)])) (-0.5+0.5 energy+0.5 Sqrt[(-2+energy) energy]+E^((0. -10.2843 I) Sqrt[-2+energy]) (0.5 -0.5 energy+0.5 Sqrt[(-2+energy) energy]))

If I evaluate this at an actual value in the assumed range, the imaginary part is indeed small:

T /. energy -> 2.6 

1.3564 - 1.11022*10^-16 I

However, I'd really like a general form where I don't have to plug in a value and then take the real part (because it should already be only real). I assume this has to do with numerical precision, and that in theory something times its conjugate is real, but here, if you're even slightly off, an imaginary part will remain.

Is there any way to make this work?

thank you!

$\endgroup$
  • $\begingroup$ Simplify[Conjugate[Sqrt[x - 2]], x >= 2] works. $\endgroup$ – march Jan 27 '16 at 0:55
  • $\begingroup$ @march, I assume you were highlighting the alternate case? I'll edit my post to reflect that, but my question is regarding when x<2, where it's doing something I don't expect. $\endgroup$ – YungHummmma Jan 27 '16 at 0:57
  • $\begingroup$ Or I wasn't reading carefully enough. :/ $\endgroup$ – march Jan 27 '16 at 1:03
  • 1
    $\begingroup$ FullSimplify[Conjugate[t22] t22, energy > 2] works okay $\endgroup$ – Simon Woods Jan 27 '16 at 21:04
  • $\begingroup$ @SimonWoods, awesome, it does! Now I have one more annoying question... why does it not work (i.e., leave in obvious Conjugate[]'s) if I do the same thing, but for energy<2 && energy>0 together? Even a Refine after that with the same assumptions doesn't simplify it. Thank you! $\endgroup$ – YungHummmma Jan 27 '16 at 21:12
2
$\begingroup$

NOTE: the answer below refers to a somewhat different version of the OP's question.


Refine seems to be your friend here:

bop = Sqrt[x - 2];
Refine[Conjugate@bop, x < 2]

(* Out: -I Sqrt[2 - x] *)

Notice that, by implicating $x$ in an inequality, the system automatically includes the assumption that it must therefore be real, so only the inequality condition is necessary.


This is one more case that highlights that the user's and the system's concepts of "simpler" may not coincide (see also the discussion in my answer to Advice for Mathematica as Mathematician's Aid).

Simplify and its friends try to minimize the complexity of an expression, as measured mostly (but not uniquely) by the LeafCount of the expression. It so happens that in your case the LeafCount of your desired form is higher than that of the original Conjugate expression:

LeafCount[-I Sqrt[2 - x]]             (* Out: 13 *)
LeafCount[Conjugate[Sqrt[-2 + x]]]    (* Out:  8 *)

You can make sense of this somewhat unexpected result by looking at the FullForm of these expressions:

FullForm[-I Sqrt[2 - x]]
(* Out: Times[Complex[0, -1], Power[Plus[2, Times[-1, x]], Rational[1, 2]]] *)

FullForm[Conjugate[Sqrt[-2 + x]]]
(* Out: Conjugate[Power[Plus[-2, x], Rational[1, 2]]] *)

So, even though Refine is explicitly attempted by Simplify (as stated in the details of the documentation to Refine), its result is discarded in this case because the system deems it "more complex", and Simplify returns the unmodified input as the best form it can come up with!

$\endgroup$
  • $\begingroup$ Thanks, this is great. What is Refine doing that Simplify doesn't? It's bizarre to me that I have to use ComplexExpand. $\endgroup$ – YungHummmma Jan 27 '16 at 19:46
  • $\begingroup$ @YungHummmma That is an excellent question. I think that it actually has to do with how the system measures expression complexity, rather than with any special Refine magic; I have updated my answer with more details. $\endgroup$ – MarcoB Jan 27 '16 at 20:08
  • $\begingroup$ Thanks, that's very interesting. I always enjoy seeing how the machinery of MMa works. I've updated my post to reflect my actual application, where refine isn't working... I'd appreciate any feedback, thank you. $\endgroup$ – YungHummmma Jan 27 '16 at 20:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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