Оценить градиент неопределенной поверхности

Я хочу оценить градиент (наклон и аспект)не определено поверхность (то есть функция неизвестна). Чтобы проверить мои методы, вот тестовые данные:

require(raster); require(rasterVis)            
set.seed(123)
x <- runif(100, min = 0, max = 1)
y <- runif(100, min = 0, max = 1)
e <- 0.5 * rnorm(100)
test <- expand.grid(sort(x),sort(y))
names(test)<-c('X','Y')
z1 <- (5 * test$X^3 + sin(3*pi*test$Y))
realy <- matrix(z1, 100, 100, byrow = F)
# And a few plots for demonstration #
persp(sort(x), sort(y), realy, 
      xlab = 'X', ylab = "Y", zlab = 'Z',
      main = 'Real function (3d)', theta = 30, 
      phi = 30, ticktype = "simple", cex=1.4)
      contour(sort(x), sort(y), realy, 
      xlab = 'X', ylab = "Y",
      main = 'Real function (contours)', cex=1.4)

Я конвертирую все в растр и строюrasterVis::vectorplot, Все выглядит хорошо. Векторное поле указывает направление наибольшей величины изменения, и затенение похоже на мой контурный график ...

test.rast <- raster(t(realy), xmn = 0, xmx = 1, 
                    ymn = 0, ymx = 1, crs = CRS("+proj"))
vectorplot(test.rast, par.settings=RdBuTheme, narrow = 100, reverse = T)

Однако мне нужна матрица значений наклона. Как я понимаю vectorplot, он использует функцию raster :: terrain:

terr.mast <- list("slope" = matrix(nrow = 100, 
                                   ncol = 100, 
                                   terrain(test.rast, 
                                           opt = "slope", 
                                           unit = "degrees",
                                           reverse = TRUE, 
                                           neighbors = 8)@data@values, 
                                    byrow = T),
                  "aspect" = matrix(nrow = 100, 
                                    ncol = 100, 
                                    terrain(test.rast, 
                                            opt = "aspect", 
                                            unit = "degrees",
                                            reverse = TRUE, 
                                            neighbors = 8)@data@values, 
                                     byrow = T))

тем не менее, уклон кажется очень высоким ... (90 градусов было бы вертикально, верно ?!)

terr.mast$slope[2:6,2:6] 
#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 87.96546 87.96546 87.96546 87.96550 87.96551
#[2,] 84.68628 84.68628 84.68627 84.68702 84.68709
#[3,] 84.41349 84.41350 84.41349 84.41436 84.41444
#[4,] 84.71757 84.71757 84.71756 84.71830 84.71837
#[5,] 79.48740 79.48741 79.48735 79.49315 79.49367

и если я нарисую наклон и аспект, они, кажется, не согласуются с графикой векторного графика.

plot(terrain(test.rast, opt = c("slope", "aspect"), unit = "degrees", 
     reverse = TRUE, neighbors = 8))

Мои мысли:

Vectorplot должен быть сглаживать наклон, но как?Я уверен, чтоraster::terrain использует метод ровничного окна для расчета наклона. Возможно, окно слишком маленькое ... это можно расширить?Я поступаю об этом неуместно? Как еще можно оценить наклон неопределенной поверхности?

Ответы на вопрос(2)

Ваш ответ на вопрос