1
$\begingroup$

Suppose I have the following definition:

$$ x=\cosh \mu\cos\theta, \quad y=\sinh\mu\sin\theta $$

I want to change the coordinates $(x,y)$ to $(\mu,\theta)$, suppose $x\in(-1,1), y\in(-1,1)$.

Here is how I do with a single point:

x1 = 1; y1 = -1;
sols = NSolve[{
    Cosh[μ] Cos[θ] == x1
  , Sinh[μ] Sin[θ] == y1 && 0 < θ < 2 Pi && μ > 0
  }, {μ, θ}
];

{μ, θ} /. sols[[1]]

Now I want to change a couple of coordinates at the same time and return a table of the desired coordinates:

talbe = Flatten[Table[{x, y}, {x, -1, 1, 0.3}, {y, -1, 1, 0.3}], 1];

How can I achieve this?

Edit:

the NSolve method is slow when the point grows, is there any faster method? Besides, NSolve sometimes failed to get the solution.

$\endgroup$
4
$\begingroup$

Your coordinates are elliptic cylindrical coordinates coordinates at a fixed value of $z$ and with $a = 1$. Mathematica has built-in knowledge of these coordinates, and you can use CoordinateTransformData to convert between any two coordinate systems that Mathematica knows about. In your case, you want

a = 1; z = 0; 
{μ, θ} = Drop[CoordinateTransform["Cartesian" -> {{"EllipticCylindrical", a}}, {x, y, z}], -1]

(* {ArcCosh[Sqrt[1 + x^2 + y^2 + Sqrt[-4 x^2 + (1 + x^2 + y^2)^2]]/Sqrt[2]], 
    ArcTan[x Sqrt[-2 + Sqrt[2] Sqrt[1 + x^2 + y^2 + Sqrt[-4 x^2 + (1 + x^2 +  y^2)^2]]] Sqrt[2 + Sqrt[2] Sqrt[1 + x^2 + y^2 + Sqrt[-4 x^2 + (1 + x^2 + y^2)^2]]], Sqrt[2] y Sqrt[1 + x^2 + y^2 + Sqrt[-4 x^2 + (1 + x^2 + y^2)^2]]]} *)

This turns out to be a closed-form expression, which probably implies that you could have derived it yourself. But it's probably better, and definitely easier, to rely on the prowess of the good people at Wolfram instead. Note the use of the two-argument form of ArcTan in the result for θ, which implies that you would have to be careful about quadrant issues if you were to write this yourself.

To apply this to a list of variables, define a function μθ[{x_, y_}] that calls CoordinateTransformation:

μθ[{x_, y_}] = Drop[CoordinateTransform["Cartesian" -> {{"EllipticCylindrical", 1}}, {x, y, 0}], -1]
table = Flatten[Table[{x, y}, {x, -1, 1, 1.0}, {y, -1, 1, 1.0}], 1]
μθ /@ table

(* {{-1., -1.}, {-1., 0.}, {-1., 1.}, {0., -1.}, {0., 0.}, {0., 1.}, 
    {1., -1.}, {1., 0.}, {1., 1.}} *) 

(* {{1.06128, -2.23704}, {0., 3.14159}, {1.06128, 2.23704}, {0.881374, -1.5708}, 
    {0., Indeterminate}, {0.881374, 1.5708}, {1.06128, -0.904557}, {0., 0.}, 
    {1.06128, 0.904557}} *)

Note that since elliptic cylindrical coordinates are ill-defined for $y = 0$ and $|x| \leq 1$, applying this transformation to the point {0,0} leads to a result of Indeterminate.

More information concerning the coordinate systems programmed into Mathematica can be found at the documentation page for CoordinateChartData.

$\endgroup$
0
$\begingroup$

Define a function as follows:

sols[x1_, y1_] := 
 First[NSolve[{Cosh[μ] Cos[θ] == x1, 
    Sinh[μ] Sin[θ] == y1 && 
     0 < θ < 2 Pi && μ > 0}, {μ, θ}]]

Check for known values

sols[1, -1]

(* {μ -> 1.06128, θ -> 5.37863} *)

Then create a table

Table[{x1, y1, sols[x1, y1]}, {x1, 1, 5}, {y1, -5, -1}]
$\endgroup$
  • $\begingroup$ BTW I would really like to know how I can change the [Theta] into the actual Theta symbol in the post. I searched but could not find it. Any help is appreciated. $\endgroup$ – Lotus May 24 '17 at 14:26
  • $\begingroup$ See the accepted answer, you need to install something. mathematica.stackexchange.com/questions/27289/… $\endgroup$ – an offer can't refuse May 24 '17 at 14:34
  • $\begingroup$ buzhidao: Excellent. Thanks a ton for this. $\endgroup$ – Lotus May 24 '17 at 14:47
  • $\begingroup$ Since the function sols uses a numerical technique (NSolve), the function's arguments should be restricted to numeric values: sols[x1_?NumericQ, y1_?NumericQ] := ... $\endgroup$ – Bob Hanlon May 24 '17 at 15: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.