Currently, Mathematica treats function which has branch cuts; $\log(z)$,$\sqrt[n]{z}$, etc, by taking its principal value. This may cause a problem in Contour integration when the path of integration walks over the branch cut. This may be fixed by a wise implementation of the Integrate function. But it is still a problem in my case. That is I want to visualize how curves in a complex plane are transformed by complex functions. For example, when a point in a complex plane moves around an origin twice, I want to see the point projected by $\sqrt(z)$ move around an origin once. But Mathematica's Sqrt makes the projected point jumps discontinuously when a point walk across the branch cut as seen in the attached picture.
I think this problem can be resolved by making every complex calculation to avoid taking modulo $2\pi$ to the phase of a complex value until the last moment. So the internal representation of complex values should be polar form and there must be a wise mechanism to decide when to do modulo $2\pi$ operation to its phase.
What do you think about this idea? Is there a way to visualize the "natural path" of a projected point by complex functions that have branch cuts?
EDIT Thanks to Dominic and J. M. will be back soon, I finally achieved what I want. Thank both of you!
BranchRootsMod[exp_] := Module[
{p, f, e, k, t},
If[Head[exp] === List,
t = BranchRootsMod /@ exp;
,
p = Position[exp, _^_Rational];
If[Length[p] > 0,
f = First[p];
If[Length[f] == 0,
e = exp;
k = e /. _^r_Rational :> 1/r;
t =
Table[root[First[e], 1/k]*Exp[I ( 2 \[Pi] i)/k], {i, 0, k - 1}];
,
e = Extract[exp, f];
k = e /. _^r_Rational :> 1/r;
t =
Table[ReplacePart[exp,
f -> root[First[e], 1/k]*Exp[I ( 2 \[Pi] i)/k]], {i, 0,
k - 1}];
];
,
t = exp;
];
];
t
];
BranchRoots[exp_] :=
Module[{e = (FixedPoint[BranchRootsMod, exp] /. root -> Power)},
If[Head[e] === List, Flatten[e], e]];
ProjectedTrajectory[exp_, var_, traj_, range_] :=
Module[{w, t, trajd, wd, func, sol},
func = Simplify[First[GroebnerBasis[{w == exp}, {var, w}]]];
t = range[[1]];
trajd = D[traj, t];
wd = w'[
t] == ((-(D[func, var]/D[func, w]) trajd) /. {w -> w[t],
var -> traj});
sol = First[
NDSolve[{wd,
w[range[[2]]] == exp /. (var :> (traj /. t -> range[[2]]))},
w, {t, range[[2]], range[[3]]}]];
w /. sol
]
tmax = 12 \[Pi];
exp = (x^(1/3) + x^(1/2) - 0.5)^(1/3);
traj = ProjectedTrajectory[exp, x, Exp[I t], {t, 0, 2*tmax}];
list = Table[Through[{Re, Im}@traj[t]], {t, 0, tmax, tmax/ 100}];
Manipulate[
Module[{pts},
pts = Through[{Re, Im}@#] & /@ BranchRoots[exp] /. x -> Exp[I t];
Graphics[
{
{Blue, Circle[#, 0.1]} & /@ pts,
{Orange, PointSize[0.02], Point[Through[{Re, Im}@traj[t]]]},
{Orange, Line@list[[;; Floor[100*t/tmax]]]}
},
PlotRange -> {{-3, 3}, {-3, 3}}
]],
{t, 0, tmax}
]