Bu komut dosyası da aynı şeyi yapacaktır (artı biraz daha fazla).
kod
function myInterpolation(x, y, value) {
if(value > Math.max.apply(Math, x) || value < Math.min.apply(Math, x)) {
throw "value can't be interpolated !!";
return;
}
var check = 0, index;
for(var i = 0, iLen = x.length; i < iLen; i++) {
if(x[i][0] == value) {
return y[i][0];
} else {
if(x[i][0] < value && ((x[i][0] - check) < (value - check))) {
check = x[i][0];
index = i;
}
}
}
var xValue, yValue, xDiff, yDiff, xInt;
yValue = y[index][0];
xDiff = x[index+1][0] - check;
yDiff = y[index+1][0] - yValue;
xInt = value - check;
return (xInt * (yDiff / xDiff)) + yValue;
}
Açıklaması
Komut dosyasının başında küçük bir hata işleme vardır. Bundan sonra, giriş değerine kıyasla ilk en düşük girişi bulur. Bulduktan sonra, biraz matematik yapar ve sonucu sunar.
Not
Seçilen değer 20'ye eşitse, komut dosyası formülün verildiği yerdeki 150 değerini döndürür #DIV/0
.
Ekran görüntüsü
formül
Tüm değerleri hesaba katmak için aşağıdaki formülü kullanın
=IF(
ISNA(
MATCH(C2,A2:A7,0)),
FORECAST(
$C$2,
OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),
OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)),
INDEX(
B2:B7,
MATCH(C2,A2:A7,0)
,0)
)
copy / paste
=IF(ISNA(MATCH(C2, A2:A7, 0)), FORECAST($C$2,OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)), INDEX(B2:B7, MATCH(C2, A2:A7, 0), 0))
Misal
Komut dosyasını Araçlar> Komut Dosyası düzenleyicisi altına ekleyin ve kaydet düğmesine basın (kimlik doğrulaması gerekmez).
Sizin için bir örnek dosya oluşturdum: Google E-Tablolar'daki bir aralıktaki verileri enterpolasyona alma