Dieses Skript macht dasselbe (plus ein bisschen mehr).
Code
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;
}
Erklärt
Am Anfang des Skripts gibt es eine kleine Fehlerbehandlung. Danach wird der erste niedrigste Eintrag im Vergleich zum Eingabewert gefunden. Sobald es gefunden wurde, wird es einige Berechnungen durchführen und das Ergebnis präsentieren.
Hinweis
Wenn der ausgewählte Wert gleich 20 ist, gibt das Skript 150 zurück, wenn die Formel ergibt #DIV/0
.
Bildschirmfoto
Formel
Verwenden Sie die folgende Formel, um alle Werte zu berücksichtigen
=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))
Beispiel
Fügen Sie das Skript unter Extras> Skripteditor hinzu und klicken Sie auf die Schaltfläche Speichern (keine Authentifizierung erforderlich).
Ich habe eine Beispieldatei für Sie erstellt: So interpolieren Sie Daten in einem Bereich in Google Sheets
Ich habe einen Weg gefunden, es zu tun - es gibt vielleicht einen besseren Weg, aber das habe ich mir ausgedacht:
Angenommen, die Daten befinden sich in A1: B10 und $ C $ 1 enthält den zu suchenden Schlüssel:
Im Detail:
FORECAST führt eine lineare Interpolation durch, nimmt jedoch eine gerade Linie an. Wir müssen also die beiden Werte finden, die den gesuchten Wert einschließen.
Also verwenden wir MATCH, um die erste Zahl zu finden, die gleich oder höher ist als die, nach der wir suchen.
FORECAST erwartet einen Datenbereich, daher verwenden wir OFFSET, um einen Verweis auf einen Datenbereich zu erstellen. MATCH ist einindiziert, daher müssen wir zuerst einen subtrahieren. Wir schaffen einen Bereich, der eins breit und zwei hoch ist. Dieser Wert schließt garantiert $ C $ 1, unseren Suchwert, ein.
quelle
x=20
führt zu#DIV/0
.Dies ist eine kleine Modifikation des Skripts von Jacob Jan Tuinstra , die es ermöglicht, entweder ein Array oder einen Wert als drittes Argument zu verwenden, sodass die interpolierte Funktion an vielen Stellen gleichzeitig berechnet werden kann. Der einzige Unterschied besteht darin, dass am Anfang einige Zeilen hinzugefügt werden. Dies ist eine schnelle Möglichkeit, so ziemlich jede benutzerdefinierte Funktion in eine benutzerdefinierte Funktion umzuwandeln, die ein Array akzeptiert.
quelle