0

(x, y, z) 値のグリッドがあり、グリッドの外側にある (x,y) ポイントが与えられたときに z 値を概算できる関数が必要です。

Akima パッケージ (コード ブロック 3) を使用して問題を解決しようとしましたが、interp 関数を、グリッドを超えて外挿するために必要な 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 ##

Akimaパッケージを使用して質問を解決しようとする私の試み

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 を使用。

4

1 に答える 1

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() は、linear=TRUE の場合に interp.old() を呼び出し、linear=FALSE の場合に interp.new() を呼び出すラッパーです。interp.new() 関数が失敗したようです。

ncp パラメータの使用は推奨されていないことに注意してください。マニュアルから:

ncp - 非推奨。パラメーター linear を使用します。現在、interp.old() でのみ使用されます。意味は、各データ ポイントでの偏導関数の計算に使用される追加のポイントの数です。ncp は、0 (偏導関数は使用されません)、または少なくとも 2 であるがデータ ポイントの数より小さい (および 25 より小さい) 必要があります。

于 2015-03-31T15:01:46.397 に答える