Як я можу прилаштувати сплайн до даних, що містять значення та 1/2 похідні?


14

У мене є набір даних, який містить, скажімо, деякі вимірювання положення, швидкості та прискорення. Усі походять із одного і того ж «бігу». Я міг би побудувати лінійну систему і помістити поліном на всі ці вимірювання.

Але чи можу я те ж саме зробити зі сплайнами? Який "R" спосіб зробити це?

Ось кілька модельованих даних, які я хотів би вмістити:

f <- function(x) 2+x-0.5*x^2+rnorm(length(x), mean=0, sd=0.1)
df <- function(x) 1-x+rnorm(length(x), mean=0, sd=0.3)
ddf <- function(x) -1+rnorm(length(x), mean=0, sd=0.6)

x_f <- runif(5, 0, 5)
x_df <- runif(8, 3, 8)
x_ddf <- runif(10, 4, 9)

data <- data.frame(type=rep('f'), x=x_f, y=f(x_f))
data <- rbind(data, data.frame(type=rep('df'), x=x_df, y=df(x_df)))
data <- rbind(data, data.frame(type=rep('ddf'), x=x_ddf, y=ddf(x_ddf)))

library(ggplot2)
ggplot(data, aes(x, y, color=type)) + geom_point()


library(splines)
m <- lm(data$y ~ bs(data$x, degree=6)) # but I want to fit on f, df, ddf. possible?

введіть тут опис зображення


Я не знаю відповіді на ваше запитання, але чи splinefunможна обчислити похідні, і, мабуть, ви могли б використовувати це як вихідну точку для пристосування даних за допомогою деяких зворотних методів? Мені цікаво дізнатися рішення цього.
Девід Лебоуер

1
Цю проблему вирішив Моріс Кокс у своїй роботі 1972 року. Я не знаю, чи підтримує це R, але пошуковий термін - «Ермітські сплайни».
користувач14717

@DavidLeBauer Це те, що я зараз роблю. Я формалізував оптимізаційну задачу, яка відповідає ряду пунктів, таким чином, щоб сплайн та його похідні наближали дані. Але більш прямим методом було б чудово.
Дані

3
Цілком стандартний підхід - через фільтрацію Кальмана. Стан (непомітний) містить точні похідні, і спостереження є галасливими версіями. Наприклад, модель для кубічного сплайна приблизно говорить про те, що похідна другого порядку - білий шум (безперервний час), але також може бути використана модель вищого порядку. Вам доведеться описати шум вимірювання залежно від порядку отримання для поточного спостереження. Три варіації шуму (за оцінкою) можуть бути достатніми при першому підході.
Ів

2
що таке похибка вимірювання на похідних? це набагато вище позиції? також у вашому сюжеті, чому точки вирівнювання не вирівнюються? що x вісь?
Аксакал

Відповіді:


9

Ми розповімо, як сплайн можна використовувати за допомогою методів Kalman Filtering (KF) у зв'язку з державно-космічною моделлю (SSM). Те, що деякі моделі сплайну можуть бути представлені SSM та обчислені з KF, було виявлено К. Ф. Анслі та Р. Конном у 1980-1990 роках. Оціночна функція та її похідні - це очікування держави, що обумовлюються спостереженнями. Ці оцінки обчислюються за допомогою згладжування з фіксованим інтервалом , звичайної задачі при використанні SSM.

Для простоти припустімо, що спостереження проводяться в рази t1<t2<<tn і що число спостереження k при tk включає лише одну похідну з порядком dk в {0,1,2} . Частина спостереження моделі записує як

(O1)y(tk)=f[dk](tk)+ε(tk)
деf(t) позначає непоміченусправжнюфункцію, аε(tk) - помилка Гаусса при дисперсіяH(tk) залежно від порядку отриманняdk. Рівняння переходу (безперервний час) приймає загальну форму де - вектор, що не спостерігається, і - гауссовий білий шум з коваріацією , вважається незалежним від спостережного шуму r.vs . Для того щоб описати сплайн, ми розглянемо стан, отриманий шляхом складання перших похідних, тобто . Перехід є
(T1)ddtα(t)=Aα(t)+η(t)
α(t)η(t)Qε(tk)mα(t):=[f(t),f[1](t),,f[m1](t)]
[f[1](t)f[2](t)f[m1](t)f[m](t)]=[010001100][f(t)f[1](t)f[m2](t)f[m1](t)]+[000η(t)]
і тоді ми отримуємо поліноміальний сплайн з порядком (і ступеня ). У той час як відповідає звичайному кубічному сплайну,2м2м-1 = Z ( t k ) α ( t k 2m2m1m=2>1. Щоб дотримуватися класичного формалізму SSM, ми можемо переписати (O1) як де спостереження матриця вибирає потрібну похідну і дисперсія з вибирається в залежності від . Тож де , та . Аналогічно
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
Z(tk)α(tk)H(tk)ε(tk)dkZ(tk)=Zdk+1Z1:=[1,0,,0]Z2:=[0,1,0]Z3:=[0,0,1,0,]H(tk)=Hdk+1 H 1 H 2 H 3для трьох варіацій , та . H1H2H3

Хоча перехід відбувається в безперервному часі, КФ насправді є стандартним дискретним часом . Дійсно, ми на практиці зосередимось на часу де ми спостерігаємо, або де ми хочемо оцінити похідні. Ми можемо взяти множину як об'єднання цих двох множин разів і припустити, що спостереження при може бути відсутнім: це дозволяє оцінити похідних у будь-який момент незалежно від існування спостереження. Залишається отримати дискретний SSM.t{tk}tkmtk

Ми будемо використовувати індекси для дискретних разів, записуючи для тощо. Дискретний час SSM приймає форму де матриці і походять від (T1) та (O2), тоді як дисперсія задана умови, щоαkα(tk)

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=Var(ηk)εkHk=Hdk+1ykне відсутня. Використовуючи деяку алгебру, ми можемо знайти матрицю переходу для дискретного SSM де для . Аналогічно матриці коваріації для SSM дискретного часу може бути задано як
Tk=exp{δkA}=[1δk11!δk22!δkm1(m1)!01δk11!δk11!01],

δk:=tk+1tkk<nQk=Var(ηk)
Qk=ση2[δk2mij+1(mi)!(mj)!(2mij+1)]i,j
ij1 де показники і знаходяться між і .ij1m

Тепер, щоб перенести обчислення в R, нам потрібен пакет, присвячений KF та прийняття змінних за часом моделей; пакет CRAN KFAS здається хорошим варіантом. Ми можемо записати R функції для обчислення матриць та з вектора разів , щоб кодувати SSM (DT). У позначеннях, використовуваних пакетом, матриця надходить для множення шуму у рівнянні переходу (DT): ми вважаємо його тут ідентичним . Також зауважте, що тут слід використовувати дифузну початкову коваріацію.TkQktkRkηkIm

EDIT , як спочатку написано було неправильно. Виправлено (також в коді R та зображенні).Q

К. Ф. Анслі та Р. Кон (1986) "Про еквівалентність двох стохастичних підходів до згладжування сплайну" Дж. Еппл. Імовірно. , 23, с. 391–405

Р. Кон і К. Ф. Анслі (1987) "Новий алгоритм згладжування сплайну на основі згладжування стохастичного процесу" SIAM J. Sci. і Стат. Обчислення. , 8 (1), стор 33–48

Й. Гельське (2017). "KFAS: Експоненціальні моделі простору сімейного стану в R" J. Stat. М’який. , 78 (10), стор 1-39

згладжування похідними

smoothWithDer <- function(t, y, d, m = 3,
                          Hstar = c(3, 0.2, 0.1)^2, sigma2eta = 1.0^2) {

    ## define the SSM matrices, depending on 'delta_k' or on 'd_k'
    Tfun <- function(delta) {
        mat <-  matrix(0, nrow = m, ncol = m)
        for (i in 0:(m-1)) {
            mat[col(mat) == row(mat) + i] <- delta^i / gamma(i + 1)
        }
        mat
    }
    Qfun <- function(delta) {
        im <- (m - 1):0
        x <- delta^im / gamma(im + 1)
        mat <- outer(X = x, Y = x, FUN = "*")
        im2 <- outer(im, im, FUN = "+")
        sigma2eta * mat * delta / (im2 + 1) 
    }
    Zfun <-  function(d) {
        Z <- matrix(0.0, nrow = 1, ncol = m)
        Z[1, d + 1] <- 1.0
        Z
    }
    Hfun <- function(d) ifelse(d >= 0, Hstar[d + 1], 0.0)
    Rfun <- function() diag(x = 1.0, nrow = m)

    ## define arrays by stacking the SSM matrices. We need one more
    ## 'delta' at the end of the series
    n <- length(t)
    delta <-  diff(t)
    delta <- c(delta, mean(delta))

    Ta <- Qa <- array(0.0, dim = c(m, m, n))
    Za <- array(0.0, dim = c(1, m, n))
    Ha <- array(0.0, dim = c(1, 1, n))
    Ra <-  array(0.0, dim = c(m, m, n))

    for (k in 1:n) {
        Ta[ , , k] <- Tfun(delta[k])
        Qa[ , , k] <- Qfun(delta[k])
        Za[ , , k] <- Zfun(d[k])
        Ha[ , , k] <- Hfun(d[k])
        Ra[ , , k] <- Rfun()
    }

    require(KFAS)
    ## define the SSM and perform Kalman Filtering and smoothing
    mod <- SSModel(y ~ SSMcustom(Z = Za, T = Ta, R = Ra, Q = Qa, n = n,
                                 P1 = matrix(0, nrow = m, ncol = m),
                                 P1inf = diag(1.0, nrow = m), 
                                 state_names = paste0("d", 0:(m-1))) - 1)
    out <- KFS(mod, smoothing = "state")
    list(t = t, filtered = out$att, smoothed = out$alphahat)

}

## An example function as in OP
f <- function(t, d = rep(0, length = length(t))) {
    f <- rep(NA, length(t))
    if (any(ind <- (d == 0))) f[ind] <- 2.0 + t[ind] - 0.5 * t[ind]^2
    if (any(ind <- (d == 1))) f[ind] <- 1.0 - t[ind]
    if (any(ind <- (d == 2))) f[ind] <- -1.0
    f
}

set.seed(123)
n <-  100
t <- seq(from = 0, to = 10, length = n)
Hstar <- c(3, 0.4, 0.2)^2
sigma2eta <- 1.0

fTrue <- cbind(d0 = f(t), d1 = f(t, d = 1), d2 = f(t, d = 2))

## ============================================================================
## use a derivative index of -1 to indicate non-observed values, where
## 'y' will be NA
##
## [RUN #0]  no derivative  m = 2 (cubic spline)
## ============================================================================
d0 <- sample(c(-1, 0), size = n, replace = TRUE, prob = c(0.7, 0.3))
ft0 <-  f(t, d0)
## add noise picking the right sd
y0 <- ft0 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d0 + 2])
res0 <- smoothWithDer(t, y0, d0, m = 2, Hstar = Hstar)

## ============================================================================
## [RUN #1] Only first order derivative: we can take m = 2 (cubic spline)
## ============================================================================
d1 <- sample(c(-1, 0:1), size = n, replace = TRUE, prob = c(0.7, 0.15, 0.15))
ft1 <-  f(t, d1)
y1 <- ft1 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d1 + 2])
res1 <- smoothWithDer(t, y1, d1, m = 2, Hstar = Hstar)

## ============================================================================
## [RUN #2] First and second order derivative: we can take m = 3
## (quintic spline)
## ============================================================================
d2 <- sample(c(-1, 0:2), size = n, replace = TRUE, prob = c(0.7, 0.1, 0.1, 0.1))
ft2 <-  f(t, d2)
y2 <- ft2 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d2 + 2])
res2 <- smoothWithDer(t, y2, d2, m = 3, Hstar = Hstar)

## plots : a ggplot with facets would be better here.
for (run in 0:2) {
    resrun <- get(paste0("res", run))
    drun <- get(paste0("d", run))
    yrun <- get(paste0("y", run))
    matplot(t, resrun$smoothed, pch = 16, cex = 0.7, ylab = "", xlab = "")
    matlines(t, fTrue, lwd = 2, lty = 1)
    for (dv in 0:2) {
        points(t[drun == dv], yrun[drun == dv], cex = 1.2, pch = 22, lwd = 2,
               bg = "white", col = dv + 1)
    }
    title(main = sprintf("run %d. Dots = smooothed, lines = true, square = obs", run))
    legend("bottomleft", col = 1:3, legend = c("d0", "d1", "d2"), lty = 1)
}

Спасибі за вашу відповідь. Мене це дуже цікавить. В даний час ви не дозволяєте використовувати значення fта його похідні певним чином t. Як можливо використовувати всю інформацію? Знову мерси за вашу відповідь.
Дані

Я читаю, що все, що нижче T1, полягає у використанні декількох похідних в одній і тій же процедурі висновку. Ів все-таки може підтвердити.
eric_kernfeld

Дійсно, ви можете використовувати скажіть похідні для одного : спостереження - це вектор, а має рядки підбирають потрібні похідні. Я впевнений, що звичайний працює з KFAS , але, використовуючи NA, можливо, також буде час, що змінюється . t k y k Z k o k o > 1 ook>1tkykZkoko>1o
Ів

@Yves я вас правильно розумію: Якщо у мене є перша і друга похідна в точці t_k, то z_k виглядає наступним чином : matrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T). Отже, загалом це буде куб розміру "найвища похідна" * "ступінь сплайну" * "# часових кроків"
Дані

Так @dani, майже: кількість рядків для всіх матриць дорівнює тобто у прикладі. Це найвищий похідний порядок плюс один. Також ступінь сплайну , а не . У вашому прикладі, оскільки ви не спостерігаєте похідну порядку (саму функцію), вона повинна бути встановлена в спостереженнях, і ви можете також скинути перший рядок. Однак я підозрюю, що в даному конкретному випадку проблема невлаштованої SSM може не спостерігатися . max k { d k +1}32м-1м0Zkmaxk{dk+1}32m1m0NA
Ів

5

Ви можете добре вражати стандартну процедуру найменших квадратів, за умови, що маєте розумне уявлення про відносні розміри випадкових помилок, зроблених для кожної похідної. Немає обмежень у кількості вимірювань, які ви робите для кожного значення - ви можете одночасно вимірювати різні похідні на кожному. Єдине обмеження у використанні звичайних найменших квадратів (OLS) є звичайним: ви вважаєте, що вимірювання не залежать.x

Основну думку можна найбільш чітко висловити, абстрагуючи проблему. Ваша модель використовує набір функцій (наприклад, будь-яка основа сплайну) як основа для прогнозування значень невідомої функції у точках Це означає, що ви прагнете оцінити коефіцієнти для яких кожна з лінійних комбінацій прийнятно наближає Назвемо цей (векторний) простір лінійних комбінаційpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F.

Особливість цієї проблеми полягає в тому, що ви не обов'язково дотримуєтесьyi. Натомість існує визначений набір лінійних функціоналів пов'язаних з даними. Нагадаємо, що функціонал - це "функція функції:" кожен призначає число будь-якій функції Модель передбачає, щоL i L i L i [f]f F LiLiLi[f]fF.

(1)yi=Li[f]+σiεi

де задані функціонали, є відомими масштабними факторами, а є незалежними і однаково розподіленими випадковими змінними.Liσi>0 ε iεi

Два додаткові припущення роблять OLS застосовними та статистично значимими:

  1. Загальний розподіл має кінцеву дисперсію.εi

  2. Кожен - лінійний функціонал. Функціональний лінійний, коли для будь-яких елементів та відповідних чиселLiL f j F α j , L [ j α j f j ] = j α j L [ f j ]LfjFαj,

    L[jαjfj]=jαjL[fj].

(2) дозволяє модель виражатись більш чітко як(1)

yi=β1Li[f1]++βpLi[fp]+σiεi.

Вся суть цього скорочення полягає в тому, що оскільки ви призначили всі функціонали всі базові функції а стандартні відхилення значення це всі числа - -це лише звичайні "змінні" або "особливості" проблеми регресії - і - просто (відносні) ваги. Таким чином, в оптимальному розумінні теореми Гаусса-Маркова OLS - це чудова процедура.Li,fj,σi,Li[fj] σ iσi

Функції, що беруть участь у питанні, такі:

  • Оцініть у заданій точці Це те, що ми зазвичай робимо. Це лінійно, тому що, за визначенням, лінійні комбінації функцій оцінюються по точці.fx: L[f]=f(x).

  • Оцініть похідну у заданій точці Це лінійно, оскільки диференціація лінійна.fx: L[f]=f(x).

  • Оцініть другу похідну у заданій точціfx: L[f]=f(x).


Гаразд, наскільки добре працює такий підхід? Як завжди, ми будемо вивчати залишки порівнюючи встановлені значення із спостережуваними значеннями. Оскільки положення, швидкості та прискорення є різними одиницями, їх слід будувати на окремих осях.y^iyiy^i

Малюнок

У верхньому рядку використовуються криві для графіку та його перших двох похідних. Відповідні точки даних розміщені на кривих: спостережувані значення зліва, спостережувані похідні посередині та спостережувані другі похідні праворуч.y^

У нижньому рядку розміщуються відповідні залишки. Як завжди, ми шукаємо відсутність будь-яких помітних взаємозв'язків: сподіваємось, що залишкові значення (їх y-координати) змінюються випадковим чином зліва направо, демонструючи незалежність і немає тенденцій.

У значення даних були отримано так само , як в питанні (після установки випадкового числа насіння до 17 , використовуючи для відтворюваності). Я досліджував підходи, використовуючи проміжки B-сплайна породжені функцією , як і в питанні, для ступенів від 1 до 6. Цей показник показує результати для ступеня 2, що є найнижчим ступенем (тобто найпростішою моделлю) проявляючи низький рівень AIC та гарну залишкову поведінку, а також модель, яку позначає ANOVA всіх шести (вкладених) моделей.n=23set.seed(17)FRbs

Підходить

y^=27.48993+2.54078f1+2.97679f2

де і - базисні функції B-сплайна, створені .f1f2bs

Залишки ведуть себе добре. Підходить добре. Більше того, цей підхід знайшов правильну модель: дані справді були створені з квадратичної функції (ступінь 2). Крім того, стандартні відхилення залишків приблизно розмірів: 0,11, 0,20 та 0,61 порівняно з 0,1, 0,3 та 0,6, що використовуються для створення початкових помилок. Це досить дивно, враховуючи, що ці криві, очевидно, екстраполюють спостереження (які не виходять за рамки ) і використовують такий невеликий набір даних ( ).x=5n=23

Нарешті, залишки для пристосувань для сплайнів вищого ступеня якісно однакові; вони вносять лише незначні вдосконалення за рахунок використання менш правдоподібних моделей. При досить високих градусах вони починають бурхливо коливатися при малих значеннях між спостережуваними значеннями. Щоб проілюструвати цю (погану) поведінку, ось такий ступінь 9:x

Малюнок 2

Нарешті, ось приклад, де було зроблено багаторазові спостереження за різними лінійними функціоналами основи. Код для створення цих спостережень був змінений з цього у запитанні до

mult <- 2
x_f <- rep(runif(5, 0, 5), mult)       # Two observations per point
x_df <- rep(runif(8, 3, 8), mult)      # Two derivatives per point
x_ddf <- c(x_df, rep(runif(10, 4, 9))  # Derivative and acceleration per point

Малюнок 3


RКод для проведення цих розрахунків є досить загальним. Зокрема, він використовує числову диференціацію для пошуку похідних, щоб не залежати від типу використовуваного сплайна. Він обробляє різні значення шляхом зважування спостережень пропорційно Він автоматично конструює та вміщує набір моделей у циклі. Лінійні функціонали та стандартні відхилення жорстко кодуються. Існує три з кожного, вибраних відповідно до значення змінної в наборі даних.σi1/σi2.Liσitype

Як приклад того, як можна використовувати набори, кода друкує резюме, список їх АПК та ANOVA їх усіх.

#
# Estimate spline derivatives at points of `x`.
#
d <- function(x, s, order=1) {
  h <- diff(range(x, na.rm=TRUE))
  dh <- h * 1e-4
  lags <- seq(-order, order, length.out=order+1) * dh/2
  b <- choose(order, 0:order) * (-1)^(order:0)
  y <- b %*% matrix(predict(s, c(outer(lags, x, `+`))), nrow=length(lags))
  y <- matrix(y / (dh^order), nrow=length(x))
}
#
# Fit and plot models by degree.
#
data$order <- c(f=0, df=1, ddf=2)[data$type]
k <- max(data$order)
x <- data$x
w <- (c(0.1, 0.3, 0.6)^(-2))[data$order+1] # As specified in the question

fits <- lapply(1:6, function(deg) {
  #
  # Construct a model matrix.
  #
  s <- bs(x, degree=deg, intercept=TRUE)
  X.l <- lapply(seq.int(k+1)-1, function(i) {
    X <- subset(data, order==i)
    Y <- as.data.frame(d(X$x, s, order=i))
    cbind(X, Y)
  })
  X <- do.call("rbind", X.l)
  #
  # Fit WLS models.
  #
  f <- as.formula(paste("y ~ -1 +", paste0("V", 0:deg+1, collapse="+")))
  fit <- lm(f, X, weights=w)
  msr <- tapply(residuals(fit), data$order, function(r) {
    k <- length(r) - 1 - deg
    ifelse(k >= 1, sum(r^2) / k, 1)
  })
  #
  # Compute predicted values along the graphs.
  #
  X.new <- data.frame(x = seq(min(X$x), max(X$x), length.out=101))
  X.new$y.hat <- predict(s, X.new$x) %*% coefficients(fit)
  X.new$Dy.hat <- d(X.new$x, s, 1) %*% coefficients(fit)
  X.new$DDy.hat <- d(X.new$x, s, 2) %*% coefficients(fit)
  X$Residual <- residuals(fit)
  #
  # Return the model.
  #
  fit$msr <- msr
  fit
})
lapply(fits, function(f) sqrt(f$msr))
lapply(fits, summary)
lapply(fits, AIC)
do.call("anova", fits)

1

Перш за все, я хочу подякувати вам за те, що ви поставили це питання. Це дійсно цікаве питання. Я люблю сплайни та класні речі, які ви можете зробити з ними. І це дало мені привід зробити деякі дослідження. :-)

BLUF: Коротка відповідь - ні. Я не знаю жодної функціональності в R, яка зробить це для вас автоматично. Довга відповідь ... набагато складніше. Той факт, що похідні та значення функцій не відібрані в одне і те ж місце, ускладнює це. А той факт, що у вас немає значення функції біля правого кінця інтервалу, може зробити неможливим.

Почнемо з кубічного сплайну. За даними точками та відповідними другими похідними , кубічний сплайн, що проходить через них, становить:(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
де Досить просто перевірити, що , , і . Це гарантує, що сплайн та його друга похідна є безперервними. Однак на даний момент у нас немає суцільної першої похідної. Для того, щоб змусити першу похідну бути безперервною, нам потрібно таке обмеження:
hj=xj+1xjA=xj+1xhjB=1AC=16(A3A)hj2D=16(B3B)hj2
Sj(xj)=yjSj(xj+1)=yj+1Sj(xj)=zjSj(xj+1)=zj+1
(1)6hj1yj1(6hj1+6hj)yj+6hjyj+1=hj1zj1+2(hj1+hj)zj+hjzj+1
При класичному налаштуванні кубічного сплайна ви припускаєте, що у вас є точки і використовуєте рівняння (разом з двома додатковими обмеженнями границь) для вирішення для . Після того, як ви знаєте , сплайн повністю вказаний, і ви можете використовувати його для інтерполяції в будь-якій довільній точці. Як додатковий бонус, рівняння перетворюється на тридіагональну матрицю, яку можна вирішити за лінійним часом!(xj,yj)(1)zjzj(1)

Гаразд, тепер припустимо, що замість того, щоб знати , ви знаєте . Чи можете ви використовувати рівняння для вирішення для ? З точки зору чистої алгебри, це здається можливим. Є рівнянь і невідомих, так ... чому б і ні? Але виявляється, ви не можете; матриця буде сингулярною. І це не повинно стати несподіванкою. Яким чином ви могли інтерполювати значення функцій, що даються ПЕРЕЩО другими похідними? Принаймні, вам знадобиться початкове значення, як і диференціальне рівняння.yjzj(1)yjNN

Що з вашою ситуацією? Деякі з ваших точок мають значення функцій, а деякі - з похідними. На даний момент давайте ігноруємо перші похідні (вони начебто безлад для вирішення на основі кубічного сплайну). Формально нехай - це набір точок із значеннями функцій, а - набір точок з другими похідними. У нас ще є рівнянь з невідомими. Просто деякі з невідомих є а деякі - . Виявляється, ви отримаєте рішення, якщо 0, 1 або 2 І або(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I. Іншими словами, одна з перших трьох точок повинна бути значенням функції І одна з трьох останніх точок повинна бути значенням функції. Крім цього обмеження, ви можете вкинути скільки завгодно похідних.

Як щодо тих перших похідних? Звичайно, можна включити перші похідні у свій сплайн. Але, як я вже казав, він стає набагато м'яснішим. Перша похідна сплайну задається: Звичайно, нас по-справжньому цікавить похідна в вузлах, тому ми можемо трохи спростити цю функцію, оцінивши її в : Ви можете додати ці обмеження на матрицю, з рівняння

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)і отриманий сплайн матиме вказані перші похідні. Крім того, це допоможе в задачі сингулярної матриці. Ви отримаєте рішення, якщо в усіх трьох та останніх трьох точках EITHER має значення функції або першу похідну.

Тож я все це вклав у якийсь код і ось ось що я отримав:

Шпон пішов жахливо неправильно

Як бачите, результати не великі. Це тому, що це звичайний сплайн, який повинен шанувати ВСІ дані. Оскільки дані є стохастичними, нам дійсно потрібно використовувати сплайс регресії. Це тема для іншої публікації. Але якщо ви працюєте з математикою, ви в кінцевому підсумку оптимізуєте квадратичну цільову функцію з урахуванням лінійних обмежень рівності - і є рішення закритої форми!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.