2015-03-31 3 views
0

У меня есть сетка значений (x, y, z), и я хочу функцию, которая может аппроксимировать значения z, когда она задана (x, y), которые лежат за пределами сетки.Экстраполяция за сеткой данных

Я попытался решить вопрос, используя пакет Akima (кодовый блок 3), но я не могу заставить интерпретационную функцию работать с параметром linear = FALSE, который требуется для экстраполяции за пределы сетки.

данных:

# Grid data 
x <- seq(0,1,length.out=6) 
y <- seq(0,1,length.out=6) 
z <- outer(x,y,function(x,y){sqrt(x^2+y^3)}) 

данных Визуализация (не существенные для вопроса):

## Visualize the data - Not important for question ## 
    jet.colors <- colorRampPalette(c("Royal Blue", "Lime Green")) 
    nbcol <- 100 
    color <- jet.colors(nbcol) 
    nrz <- nrow(z) 
    ncz <- ncol(z) 
    zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz] 
    facetcol <- cut(zfacet, nbcol) 
    pmat <- persp(x, y, z, d = 1,r = 4, 
       ticktype="detailed", 
       col = color[facetcol], 
       main = "Title", 
       xlab="x value", 
       ylab = "y value", 
       zlab= "z value", 
       scale=FALSE, 
       expand=0.6, 
       theta=-40, 
       phi=25) 
## End visualization ## 

Моя попытка решить вопрос, используя Акима пакет

library(akima) 

# Vectorize the grid: 
zz <- as.vector(z) 
# create all combinations of x and y 
xy <- expand.grid(x,y) 

# What we want: 
sqrt(0.7^2 + 0.7^3) # c(0.7, 0.7) = 0.9126883 
sqrt(0.7^2 + 1.2^3) # c(0.7, 1.2) = 1.489295 

# We get a result for the first point inside the grid, 
# but not for the second one outside the grid. 
# This is expected behaviour when linear=TRUE: 
interp(xy[,1], xy[,2], zz, xo = c(0.7), yo= c(0.7, 1.2), linear=TRUE) 
# = (0.929506, NA) 

# When LINEAR = FALSE we get z= 0, 0!! 
interp(xy[,1], xy[,2], zz, xo = c(0.7), yo= c(0.7, 1.2), linear=FALSE, extrap = TRUE) 
# = (0, 0) 

# Dropping extrap=TRUE we see that both are actually NA in this case 
interp(xy[,1], xy[,2], zz, xo = c(0.7), yo= c(0.7, 1.2), linear=FALSE) 
# = (NA, NA) 
# What is going on? 

Использование R 3.1.3 и akima_0.5-11.

+0

1.2 выходит за пределы x и y. –

+0

jep, вот почему я хочу экстраполировать. Из моего понимания человека Akima, используя extrap = TRUE, должно быть возможно получить значения за пределами сетки? – zaphoid

+0

Из руководства: extrap - логический флаг: следует ли экстраполяцию использовать вне выпуклой оболочки, определяемой точками данных? – zaphoid

ответ

1

Получил результат с помощью interp.old() непосредственно:

interp.old(xy[,1], xy[,2], zz, xo = c(0.7), yo= c(0.7, 1.2), ncp=2, extrap=TRUE) 
# = (0.9211469, 1.472434) 

Я не уверен, если это ошибка в функции интерполяции(). interp() - это оболочка, которая вызывает interp.old(), если linear = TRUE и interp.new(), если linear = FALSE. Функция interp.new(), похоже, терпит неудачу.

Обратите внимание, что использование параметра ncp устарело. Из руководства:

ncp - устаревший, используйте параметр linear. Теперь используется только interp.old(). значение было: количество дополнительных точек, которые будут использоваться при вычислении частных производных в каждой точке данных. ncp должно быть либо 0 (частные производные не используются), либо не менее 2, но меньше числа точек данных (и меньше 25)

Смежные вопросы