Re: Redefine Arg to return a value from 0 to 2 pi
- To: mathgroup at smc.vnet.net
- Subject: [mg80477] Re: Redefine Arg to return a value from 0 to 2 pi
- From: chuck009 <dmilioto at comcast.com>
- Date: Thu, 23 Aug 2007 01:10:40 -0400 (EDT)
> I've always got the impression from this list that
> it's not
> necessarily a good idea to mess around with built-in
> commands.
That looks very interesting Mark. No, I mean the Molecular Cardiology. It's like the time I was rebuilding my engine on my 84' pickup. I got all the parts and asked the guy, "you sure these will all fit?". He said, "if you know what you're doing they will" :).
I did get it to work by using the Hold and ReleaseHold constructs. The code below re-defines Arg twice, once from 0 to 2pi and then from 2pi to 4pi and then integrates these changes into Log and Sqrt. I then use these new definitions to generate the Riemann surface for Sqrt[z] directly without resorting to the usual methods to generate these surfaces. Anyone interested, use a fresh Kernel and note how the value of Sqrt[-1-i] changes from the lower surface to the upper surface when the switch is made.
N[Sqrt[-1 - I]]
Plot3D[Im[Sqrt[x + I*y]], {x, -1, 1}, {y, -1, 1}]
Unprotect[Arg];
Unprotect[Log];
Unprotect[Sqrt];
Arg[z_Complex] := Module[{z0 = z}, If[Im[z0] < 0,
ArcTan[Re[z0], Im[z0]] + 2*Pi, ArcTan[Re[z0], Im[z0]]]];
Log[z_Complex] := Log[Abs[z]] + I*Arg[z];
Sqrt[z_Complex] := Exp[(1/2)*(Log[Abs[z]] + I*Arg[z])];
Protect[Sqrt];
Protect[Log];
Protect[Arg];
N[Sqrt[-1 - I]]
p1 = Plot3D[ReleaseHold[Im[Hold[Sqrt[x + I*y]]]], {x, -1, 1},
{y, -1, 1}]
Unprotect[Arg];
Unprotect[Log];
Unprotect[Sqrt];
Arg[z_Complex] := Module[{z0 = z}, If[Im[z0] > 0,
ArcTan[Re[z0], Im[z0]] + 2*Pi,
ArcTan[Re[z0], Im[z]] + 4*Pi]];
Log[z_Complex] := Log[Abs[z]] + I*Arg[z];
Sqrt[z_Complex] := Exp[(1/2)*(Log[Abs[z]] + I*Arg[z])];
Protect[Sqrt];
Protect[Log];
Protect[Arg];
p2 = Plot3D[ReleaseHold[Im[Hold[Sqrt[x + I*y]]]], {x, -1, 1},
{y, -1, 1}]
Show[{p1, p2}, PlotRange -> All]