Re: motion-path and spline-arc-length
- To: mathgroup at smc.vnet.net
 - Subject: [mg29277] Re: motion-path and spline-arc-length
 - From: "Carl K. Woll" <carlw at u.washington.edu>
 - Date: Sat, 9 Jun 2001 03:09:05 -0400 (EDT)
 - Organization: University of Washington
 - References: <9fq1iu$qam$1@smc.vnet.net>
 - Sender: owner-wri-mathgroup at wolfram.com
 
Pier,
Recently, David Park asked essentially the same question, and you can see
their solution on the thread Inverse Interpolating Functions. As an
alternative to their approach, I am proposing a completely different
solution (which naturally I like better).
The basic idea is to turn your question into a differential equation.
Mathematica's NDSolve function numerically solves differential equations,
and returns InterpolatingFunctions, which is just what the doctor ordered.
In your example we have the following problem:
Given y-f[x[y]]==0, what is x?
Simply differentiate with respect to the dependent variable, which in this
case is y, yielding
1-f'[x[y]]x'[y]==0.
This is a differential equation for the function x[y], so we can use
NDSolve. The only thing missing is an initial condition. Of course, if the
inverse of the function f is multivalued, there will be multiple possible
initial conditions. So, we need to supply an initial condition. A function
which takes these ideas and puts them together follows:
NInverse[f_, {x0_, y0_}, {y_, min_, max_}, opts___?OptionQ] :=
  NDSolve[{1 - f'[x[y]]x'[y] == 0, x[y0] == x0}, x, {y, min, max}, opts]
In the above function, f should be a pure function, although this is not
absolutely necessary. The point {x0,y0} is the initial condition, and the
function f should satisfy f[x0]==y0. The "dependent variable" y will range
from min to max. The options should be those expected by NDSolve. Obviously,
a little bit more work can be done to make the function a bit more bullet
proof. Typically, NDSolve will yield an accuracy (precision) of 6 decimal
places, so if more accuracy is desired, a more accurate PrecisionGoal and
AccuracyGoal can be given as options to the function NInverse.
As a trivial example, suppose one wanted to invert the equation y=x^2. In
this case f is #^2&. So, we would use NInverse as follows:
In[52]:=
NInverse[#^2 &, {2, 4}, {y, 1, 9}]
Out[52]=
{{x -> InterpolatingFunction[{{1., 9.}}, <>]}}
In[53]:=
Plot[%[[1,1,2]][t]-Sqrt[t],{t,1,9},PlotRange->All]
I have deleted the Plot output, but it shows that the difference between the
solution and Sqrt[t] is smaller than 3 10^-5. If more precision were
desired, then one could try:
In[54]:=
NInverse[#^2 &, {2, 4}, {y, 1, 9}, AccuracyGoal -> 10,
    PrecisionGoal -> 10]
Out[54]=
{{x -> InterpolatingFunction[{{1., 9.}}, <>]}}
In[55]:=
Plot[%[[1,1,2]][t]-Sqrt[t],{t,1,9},PlotRange->All]
Here the difference is less than 5 10^-9. NInverse will work fine with
InterpolatingFunctions. For example, if one sets
f=FunctionInterpolation[x^2,{x,1,4}];
and tries
In[62]:=
NInverse[f,{2,4},{y,1,9},AccuracyGoal->10,PrecisionGoal->10]
Out[62]=
{{x -> InterpolatingFunction[{{1., 9.}}, <>]}}
You get back the same InterpolatingFunction as before.
As a side note, a package that I wrote and posted a while ago defining a
function called ImplicitSolve will take any set of N equations in N+1
unknowns, and return interpolating functions for N of the unknowns in terms
of the final unknown. The function NInverse is just a simplified version of
ImplicitSolve.
Carl Woll
Physics Dept
U of Washington
"Pier" <piviere at libero.it> wrote in message
news:9fq1iu$qam$1 at smc.vnet.net...
> Hi
>     I'm developping an animation software ...
> I've a spline (3rd degree) say Sp(t)
> well i would like to know if i can find a function that calculates
> the parameter t, given the distance travelled s=Sp(t).
> Something related to Arc-length.
>
> Thank in advance to all help me.    Bye, Pier
>
>