Skip to main content

Is there a simple way to get the Conjugate of a complex term, provided all information is available?


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!




Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Adding a thick curve to a regionplot

Suppose we have the following simple RegionPlot: f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}] Now I'm trying to change the curve defined by $y=g[x]$ into a thick black curve, while leaving all other boundaries in the plot unchanged. I've tried adding the region $y=g[x]$ and playing with the plotstyle, which didn't work, and I've tried BoundaryStyle, which changed all the boundaries in the plot. Now I'm kinda out of ideas... Any help would be appreciated! Answer With f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 You can use Epilog to add the thick line: RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}, PlotPoints -> 50, Epilog -> (Plot[g[x], {x, 0, 2}, PlotStyle -> {Black, Thick}][[1]]), PlotStyle -> {Directive[Yellow, Opacity[0.4]], Directive[Pink, Opacity[0.4]],