# [SciPy-User] Interpolate: Derivatives of parametric splines

Raimund Andersen anderse@gmx...
Thu Nov 12 07:44:56 CST 2009

```Hello Zachary Pincus,

The first derivative at pi/2 should be 0 ( cos(pi/2) ).
What I get from interpolate.spalde(0.25, tckp) is

7.44935679e+00 and -3.47491248e-01.

Now, how do I get to 0? Why those different 'x' values at all?
It should be always 1.57079633e+00, no?

-------- Original-Nachricht --------
> Datum: Thu, 12 Nov 2009 08:19:58 -0500
> Von: Zachary Pincus <zachary.pincus@yale.edu>
> An: SciPy Users List <scipy-user@scipy.org>
> Betreff: Re: [SciPy-User] Interpolate: Derivatives of parametric splines

> parametric spline [x(p), y(p)] given as dx/dp and dy/dp, not the dx/dy
> that you are perhaps expecting?
>
>
> On Nov 12, 2009, at 6:35 AM, anderse@gmx.de wrote:
>
> > Hi,
> >
> > I'd like to get the derivatives of parametric splines.
> > Looking at the tutorial
> (http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html
> > )
> > I get a spline like this:
> >
> >>>> x = np.arange(0, 2*np.pi + np.pi / 4, 2 * np.pi / 8)
> >>>> y = np.sin(x)
> >>>> tck = interpolate.splrep(x, y, s = 0, k = 5)
> >>>> xnew = np.arange(0, 2 * np.pi, np.pi / 50)
> >>>> ynew = interpolate.splev(xnew, tck, der = 0)
> >
> > now, the derivatives can be determined like this:
> >
> >>>> yder = interpolate.splev(xnew, tck, der = 1)
> >>>> yder2 = interpolate.splev(xnew, tck, der = 2)
> >
> >>>> plt.plot(x, y, 'x', xnew, ynew, xnew, yder, xnew, yder2)
> >
> > The first derivative is about null at pi / 2,
> > the second one at pi, as they should be:
> >
> >>>> interpolate.spalde(np.pi, tck)
> > array([  0.00000000e+00,  -1.00064770e+00,  -1.73418916e-17,
> >         1.00726743e+00,  -2.65046223e-16,  -1.01680119e+00])
> >
> >>>> interpolate.spalde(np.pi / 2, tck)
> > array([ 1.        , -0.00199181, -0.99629386,  0.02365328,
> > 0.90756527,
> >       -0.1387468 ])
> >
> > Of course, the x-range is the same, no matter of der=#.
> >
> > Now the parametric version:
> >
> >>>> tckp, u = interpolate.splprep([x, y], s=0, k=5)
> >>>> u
> > array([ 0.        ,  0.13941767,  0.25      ,  0.36058233,
> > 0.5       ,
> >        0.63941767,  0.75      ,  0.86058233,  1.        ])
> >
> > so pi is at 0.5, pi/2 is at 0.25.
> >
> > And this is what I get at these 'x' values:
> >
> >>>> interpolate.spalde(0.5, tckp)
> > [array([  3.14159265e+00,   5.14754151e+00,   1.10395807e-13,
> >         1.69542498e+02,  -4.03851332e-11,  -2.01255417e+04]),
> > array([  7.73894012e-16,  -5.38240284e+00,  -1.31811639e-13,
> >         7.74093936e+01,   5.58012792e-11,   1.89849315e+04])]
> >
> >>>> interpolate.spalde(0.25, tckp)
> > [array([  1.57079633e+00,   7.44935679e+00,  -7.65674781e-02,
> >        -1.85343925e+02,   7.51370411e+01,   2.46939899e+04]),
> > array([  1.00000000e+00,  -3.47491248e-01,  -5.16420728e+01,
> >         2.05418849e+02,   3.66866738e+03,  -5.71113127e+04])]
> >
> > The first array states the x-values, the second one the y-values,
> > respectively, AFAIK.
> > This makes sense without derivatives, and I get a plot using
> >
> >>>> unew = np.arange(0, 1.01, 0.01)
> >>>> out = interpolate.splev(unew, tckp, der = 0)
> >>>> plt.plot(out[0], out[1])
> >
> > which looks like the one above, but what about the derivatives?
> >
> >>>> der1 = interpolate.splev(unew, tckp, der = 1)
> >>>> der2 = interpolate.splev(unew, tckp, der = 2)
> >>>> plt.plot(der1[0], der1[1], der2[0], der2[1])
> >
> > dont make sense to me at all.
> >
> >
> > Raimund
> >
> > --
> > GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
> > Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
> > _______________________________________________
> > SciPy-User mailing list
> > SciPy-User@scipy.org
> > http://mail.scipy.org/mailman/listinfo/scipy-user
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user

--
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
```