[R] stats:: spline's method could not be monoH.FC
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon May 4 17:08:44 CEST 2020
>>>>> Martin Maechler
>>>>> on Mon, 4 May 2020 16:25:02 +0200 writes:
>>>>> Abby Spurdle
>>>>> on Sun, 3 May 2020 16:15:17 +1200 writes:
>>> and just today a colleague asked me about spline interpolation
>>> with general 2nd derivative boundary conditions
>>> s''(x_1) = s2_1, s''(x_n) = s2_2
> actually I was wrong... I *read* it as the above, but what he
> really wanted was what the wikipedia page class "clamped"
> boundary conditions, i.e., for the *first* derivative
> s'(x_1) = s1_1, s'(x_n) = s1_2
>> It should possible via cubic Hermite splines.
> and indeed that is available via cubic Hermite splines available
> in R via stats package's splinefunH()
> {which I wrote when implementing "monoH.FC"}
>> A nontrivial design decision in my package was the computation of
>> slopes at the endpoints.
>> (Something which I got wrong, twice...)
> The "wikiversity" has a very nice small math lecture on this
> https://en.wikiversity.org/wiki/Cubic_Spline_Interpolation
> which derives *both* cases (first and 2nd derivative boundary conditions),
> the only draw back to quickly do it with ('base R') is that I
> need to "translate" that (2nd derivative values $M_i$) parametrization
> into either the one used into the (a,b,c,y)-parametrizat of the
> default spline() / splinefun() methods or the Hilbert spline
> form for splinefunH(x[],y[],m[]).
> Martin
Well, I should have looked a bit further, first : at least the case for
s''(x_1) = s2_1, s''(x_n) = s2_2
seems trivially "hidden" in the C code in
R's src/library/stats/src/splines.c i.e.
https://svn.r-project.org/R/trunk/src/library/stats/src/splines.c
at the end of natural_spline() we should set c[1] and c[n] to non-zero.
...
and actually I think in spline_eval() for extrapolation (to the
left? and right), there's currently also an assumption that c[1]
and c[n] are zero.
So as a matter of fact I would ask for patches there (both in C
and in R calling C ... maybe too much for 30 minutes ;-)
Best,
Martin
>> My guess is that I could write a function in about 60 to 90 minutes,
>> including all the testing and calculus.
>> However, I need to note two things:
>> (1) Cubic Hermite splines do not have a continuous second derivative.
> well, many don't if you allow any slopes at node. However, if
> you only set 2 boundary conditions *instead* of the natural
> spline ones f''(x_1) = f''(x_1) = 0,
> you can still remain in C_2 (i.e. continuous 2nd derivative).
> (And that's also what the above wikiversity lecture provides).
>> (2) Specifying the second derivatives (at the endpoints) would prevent
>> the user from specifying the first derivatives (aka the slopes).
>> Could you please confirm if the function would still be of interest...?
> Well, as I know spent enough time reading and thinking, I'd
> really like to add method = "clamped" to splinefun() and also
> the other one where fix the 2nd derivatives (to arbitrary values
> instead of zero).
> So if you already have the R code leading up to one of the 2
> "parametrizations" we use in spline() / splinefun(), I'd be
> grateful, if you have the time.
> Martin
More information about the R-help
mailing list