У меня есть набор измеренных значений, которые я хотел бы интерполировать в R
с помощью кубических сплайнов. Поскольку это всего лишь кусочные полиномы, я впоследствии хотел бы интегрировать функцию интерполяции алгебраически. Поэтому мне нужны коэффициенты. Есть ли способ получить их?
Похоже, что вызов splines::interpSpline(foo, bar)$coef
не возвращает действительные полиномиальные коэффициенты.
Получите полиномиальные коэффициенты из интерполяционных сплайнов в R
Ответы (1)
Результат splines::interpSpline(x,y)$coef
дает полиномиальные коэффициенты части между x(i) и x(i+1) в терминах степеней (x-x(i)), а не степеней x. Это имеет смысл, потому что результирующие коэффициенты имеют разумный размер и их легче интерпретировать: например, каждый постоянный член представляет собой просто y(i), квадратичный коэффициент дает вогнутость в точке x(i) и так далее.
Например, этот вывод
> x <- c(1,3,6,9)
> y <- c(3,1,4,1)
> splines::interpSpline(x,y)$coef
[,1] [,2] [,3] [,4]
[1,] 3 -1.54054054 0.0000000 0.13513514
[2,] 1 0.08108108 0.8108108 -0.16816817
[3,] 4 0.40540541 -0.7027027 0.07807808
[4,] 1 -1.70270270 0.0000000 0.00000000
Значит это
- на интервале [1,3] многочлен равен
3 - 1.54054054*(x-1) + 0.13513514*(x-1)^3
- на интервале [3,6] многочлен равен
1 + 0.08108108*(x-3) + 0.8108108*(x-3)^2 - 0.16816817*(x-3)^3
- на интервале [6,9] многочлен равен
4 + 0.40540541*(x-6) - 0.7027027*(x-6)^2 + 0.07807808*(x-6)^3
Я не вижу особого смысла в последней строке, которая описывает линейное продолжение сплайна за пределами x=9, правой конечной точки данных.
Интегрировать их не сложнее, чем интегрировать степени x, но, конечно, нужно выбирать константы интегрирования, если цель состоит в том, чтобы получить непрерывную первообразную. Выбор вида многочленов облегчает работу с константами интегрирования. Предполагая, что мы выбираем первообразную со значением 0 в левой конечной точке, остальное выглядит следующим образом:
- на отрезке [1,3] первообразная равна
3*(x-1) - 1.54054054*(x-1)^2/2 + 0.13513514*(x-1)^4/4
- на отрезке [3,6] первообразная равна
C1 + 1*(x-3) + 0.08108108*(x-3)^2/2 + 0.8108108*(x-3)^3/3 - 0.16816817*(x-3)^4/4
. Здесь C1 — значение предыдущей первообразной при x=3. - на интервале [6,9] первообразная равна
C2 + 4*(x-6) + 0.40540541*(x-6)^2/2 - 0.7027027*(x-6)^3/3 + 0.07807808*(x-6)^4/4
. Здесь C2 — значение предыдущей первообразной при x=6.