Oszacuj gradient nieokreślonej powierzchni

Chcę oszacować gradient (nachylenie i aspekt) elementuniezdefiniowany powierzchnia (tj. funkcja jest nieznana). Aby przetestować moje metody, oto dane testowe:

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)

Konwertuję wszystko na raster i wykorzystuję fabułęrasterVis::vectorplot. Wszystko wygląda dobrze. Pole wektorowe wskazuje kierunek największej wielkości zmiany, a cieniowanie jest podobne do mojego wykresu konturowego ...

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)

Potrzebuję jednak macierzy wartości nachylenia. Jak rozumiem vectorplot, używa on funkcji 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))

jednak nachylenie wydaje się naprawdę wysokie ... (90 stopni byłoby pionowe, prawda ?!)

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

a jeśli wykreślę nachylenie i aspekt, nie zgadzają się z grafiką wektorową.

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

Moje myśli:

Vectorplot musi wygładzać nachylenie, ale jak?Jestem tego całkiem pewienraster::terrain używa metody okna wędrującego do obliczenia nachylenia. Być może okno jest za małe ... czy można je rozszerzyć?Czy chodzę o tym w niewłaściwy sposób? Jak inaczej mogę oszacować nachylenie niezdefiniowanej powierzchni?

questionAnswers(2)

yourAnswerToTheQuestion