Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a function $f: \mathbb{R}^4 \to \mathbb{R}^2$, and I would like to plot the region $f([0,1]^4)$. Writing $f_1(s,t,u,v)$ and $f_2(s,t,u,v)$ for each coordinate of the output I tried using Mathematica's parametric plotter:

ParametricPlot[{f1[s,t,u,v], f2[s,t,u,v]} , {s,0,1}, {t,0,1}, {u,0,1}, {v,0,1}]

This failed because Mathematica seems to only support parametric plotting in (at most) two parameters. Does anyone know of a work around?

For the sake of having a working example, an abbreviated example of my functions is:

f1[s_,t_,u_,v_]:=(s+1/s)(t+1/t)Cos[\[Pi] u/4]Cos[\[Pi] v/4];
f2[s_,t_,u_,v_]:=(s+1/s)(t-1/t)Cos[\[Pi] u/4]Sin[\[Pi] v/4];
share|improve this question
    
Related: 13378 –  Michael E2 Mar 13 at 19:56

3 Answers 3

I think this should work:

f1[s_,t_,u_,v_]:=(s+1/s)(t+1/t)Cos[\[Pi] u/4]Cos[\[Pi] v/4];
f2[s_,t_,u_,v_]:=(s+1/s)(t-1/t)Cos[\[Pi] u/4]Sin[\[Pi] v/4];

data=Partition[Flatten[
    Table[{f1[s,t,u,v],f2[s,t,u,v]},{s,0.1,1,0.05},{t,0.1,1,0.05},{u,0,1,0.05},{v,0,1,0.05}]
],2];
Dimensions@data

ListPlot@data
SmoothDensityHistogram@data

List Plot SmoothDensity Histogram

share|improve this answer
    
Thanks that works great! –  Bob Jun 4 '13 at 11:18

The functions are

f1[s_, t_, u_, v_] := (s + 1/s) (t + 1/t) Cos[Pi u/4] Cos[Pi v/4]
f2[s_, t_, u_, v_] := (s + 1/s) (t - 1/t) Cos[Pi u/4] Sin[Pi v/4]

One obvious feature is that the term (s + 1/s) Cos[Pi u/4] is common to both functions, so changing s and u will just scale the region defined by t and v. The range of values for the term (s + 1/s) Cos[Pi u/4] is:

(s + 1/s) Cos[Pi u/4] /. s | u -> Interval[{0, 1}]
Interval[{1/Sqrt[2], Infinity}]

Let's call that term z and define:

g1[z_, t_, v_] := z (t + 1/t) Cos[Pi v/4]
g2[z_, t_, v_] := z (t - 1/t) Sin[Pi v/4]

Now we can plot the region defined by t and v with a few values of z:

ParametricPlot[
 Table[{g1[z, t, v], g2[z, t, v]}, {z, {1/Sqrt[2], 2, 4}}]
 , {t, 0, 1}, {v, 0, 1}, Evaluated -> True, Axes -> False, 
 Mesh -> None, PlotPoints -> 50]

enter image description here

The outermost region is the one with z = 1/Sqrt[2], so we can just set that as a fixed value and plot the region as:

ParametricPlot[{g1[1/Sqrt[2], t, v], g2[1/Sqrt[2], t, v]}, {t, 0, 1}, {v, 0, 1}, 
 Axes -> False, AxesOrigin -> {0, 0}]

enter image description here

share|improve this answer
    
a big +1 for using some common sense. (I was too lazy to do it:) –  Ajasja Jun 4 '13 at 14:33

As an alternative, you could plot it parametrically in 2 of the variables and use a slider to control the other two variables. For example

f1[s_, t_, u_, v_] := (s + 1/s) (t + 1/t) Cos[\[Pi] u/4] Cos[\[Pi] v/4];
f2[s_, t_, u_, v_] := (s + 1/s) (t \[Minus] 1/t) Cos[\[Pi] u/4] Sin[\[Pi] v/4];
Manipulate[
   ParametricPlot[{f1[s, t, u, v], f2[s, t, u, v]}, {u, 0, 1}, {v, 0, 1}, 
   ImageSize -> {400, 400}], {s, 0.001, 1}, {t, 0.001, 1}]

Or, somewhat easier to control is to place the two manually controlled vairables in a 2D controller (here the s and t variables are replaced by the two dimensions of the slider).

Manipulate[ParametricPlot[{f1[s[[1]], s[[2]], u, v], f2[s[[1]], s[[2]], u, v]},
   {u, 0, 1}, {v, 0, 1}, ImageSize -> {400, 400}], {s, {0.001, 0.001}, {1, 1}}]

enter image description here

Or, you could control the u,v manually and have the plot be over the {s,t}.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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