RE: RE: how to extract parameter values
- To: mathgroup at smc.vnet.net
- Subject: [mg37348] RE: [mg37316] RE: [mg37310] how to extract parameter values
- From: "DrBob" <drbob at bigfoot.com>
- Date: Thu, 24 Oct 2002 02:56:15 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
Here's a method that's not blindingly fast, but still interesting:
a = {0.5, 0.25, 0.3}; b = {0.125, 0.35, 0.03};
{tmin, tmax} = {0, 2*Pi};
f[t_] := a . {Sin[t], Sin[2*t], Sin[3*t]};
g[t_] := b . {Cos[t], Cos[2*t], Cos[3*t]}
h[t_, {x_, y_}] = (f[t] - x)^2 + (g[t] - y)^2;
j[t_, {x_, y_}] = Simplify[ D[h[t, {x, y}], t]];
i[t_, {x_, y_}] := guess=2*t - guess /. FindRoot[h[t,{x, y}], {t,
guess},Jacobian -> {{j[t, {x, y}]}}]
Timing[plot = ParametricPlot[{f[t], g[t]}, {t, tmin, tmax}];
list = Cases[plot, {x_, y_}, Infinity]; guess = tmin;
tvals = (i[t, #1] & ) /@ list; ]
ListPlot[tvals]
{0.281 Second, Null}
This is slightly faster, though probably not worth the extra effort:
nextGuess := guess.{1, -3, 3} (* quadratic extrapolation from previous
guesses *)
i[t_, {x_, y_}] := (guess = Join[Rest@guess, {t}] /.
FindRoot[h[t, {x, y}], {t, nextGuess}, Jacobian -> {{j[t, {x,
y}]}}])
Timing[plot = ParametricPlot[{f[t], g[t]}, {t, tmin, tmax}];
list = Cases[plot, {x_, y_}, Infinity];
guess = tmin{1, 1, 1};
tvals2 = Last@i[t, #] & /@ list;
]
{0.266 Second, Null}
DrBob
-----Original Message-----
From: Wolf, Hartmut [mailto:Hartmut.Wolf at t-systems.com]
To: mathgroup at smc.vnet.net
Subject: [mg37348] [mg37316] RE: [mg37310] how to extract parameter values
>-----Original Message-----
>From: Jan Mangaldan [mailto:jajem at yahoo.com]
To: mathgroup at smc.vnet.net
>Sent: Tuesday, October 22, 2002 10:49 AM
>To: mathgroup at smc.vnet.net
>Subject: [mg37348] [mg37316] [mg37310] how to extract parameter values
>
>
>I'd like to know how I can extract the parameter
>values used by ParametricPlot in plotting a curve,
>e.g. if ParametricPlot used points corresponding to
>parameter values 2, 4, 6, etc... I need a way to get
>the list {2, 4, 6, ...}.
>
>One solution I know is this:
>
>list={};
>ParametricPlot[(AppendTo[list,t]; {f[t]
>g[t]}),{t,tmin,tmax}];
>
>The problem with this is that I get an error that
>ParametricPlot cannot compile the function, and that
>the plotting time is considerably slowed down.
>especially if I have a high PlotPoints setting.
>
>Any ideas?
>
> Jan Mangaldan (~_~)
Jan,
please observe:
In[1]:= a = {0.5, 0.25, 0.3}; b = {0.125, 0.35, 0.03};
In[2]:=
f[t_] := a . {Sin[t], Sin[2*t], Sin[3*t]};
g[t_] := b . {Cos[t], Cos[2*t], Cos[3*t]}
In[4]:= {tmin, tmax} = {0, 2*Pi};
In[5]:=
list = {}; s = {f[t], g[t]};
Timing[ParametricPlot[list = {list, t}; s,
{t, tmin, tmax}]]
ParametricPlot::"ppcom": "Function \!\(\(\(list = \(\({list, t}\)\)\)\)
;
s\) \
cannot be compiled; plotting will proceed with the uncompiled function."
Out[6]= {0.231 Second, - Graphics -}
In[7]:= tt = Flatten[list];
Length[tt]
ss = -Apply[Subtract, Partition[tt, 2, 1], {1}];
Out[8]= 271
In[10]:= ListPlot[tt]
In[11]:= ListPlot[ss, PlotJoined -> True, PlotRange -> All]
In[12]:= Timing[ParametricPlot[{f[t], g[t]}, {t, tmin, tmax}]]
Out[12]= {0.25 Second, - Graphics -}
You see the uncompiled version, including registering of the t-samples
is
faster than the "compiled version"?
In[13]:=
Timing[ParametricPlot[Evaluate[{f[t], g[t]}], {t, tmin, tmax}]]
Out[13]= {0.04 Second, - Graphics -}
In[14]:=
list = {}; s = Compile[t,{f[t], g[t]}];
Timing[ParametricPlot[list = {list, t}; s[t],
{t, tmin, tmax}];]
Out[15]= {0.32 Second, Null}
In[16]:=
list = {}; s = Compile[t,Evaluate[{f[t], g[t]}]];
Timing[ParametricPlot[list = {list, t}; s[t],
{t, tmin, tmax}];]
Out[17]= {0.1 Second, Null}
--
Hartmut Wolf