我正在使用Google表来记录我的用水量,并想通过使用线性插值来了解我在给定期间使用了多少。我真的很想使用类似于预测的函数,但是不要使用整个范围插值,而只需在上方和下方使用最近的点即可。
我很想尝试自己编码(做了很多VBA),但不知道从哪里开始从哪里开始。有人对我有一个起点吗?
我要进行的过程是:
Interpolate(x, data_y, data_x)
// Check value is within range of known values (could expand function to use closet two values and extrapolate...)
(is X within XMin and XMax)
// Find closet X value below (X1), corresponding Y1
// Find closet X value above (X2), corresponding Y2
Return Y = Y1+(X-X1)*((Y2-Y1)/(X2-X1))
function interpolation(x_range, y_range, x_value) {
var xValue, yValue, xDiff, yDiff, xInt, index, check = 0;
if(x_value > Math.max.apply(Math, x_range) || x_value < Math.min.apply(Math, x_range)) {
throw "value can't be interpolated !!";
return;
}
for(var i = 0, iLen = x_range.length; i < iLen-1; i++) {
if((x_range[i][0] <= x_value && x_range[i+1][0]> x_value) || (x_range[i][0] >= x_value && x_range[i+1][0] < x_value)){
yValue = y_range[i][0];
xDiff = x_range[i+1][0] - x_range[i][0];
yDiff = y_range[i+1][0] - yValue;
xInt = x_value - x_range[i][0];
return (xInt * (yDiff / xDiff)) + yValue;
}
}
return y_range[x_range.length-1][0];
}
使用Xlookup函数在当天左右插入两个数据点。
在a中的日期:
- e2
=xlookup(D2,A:A,B:B,NA(),-1)
-用法 - f2
=xlookup(D2,A:A,B:B,NA(),1)
-
之后用法 - G2
=xlookup(D2,A:A,A:A,,-1)
-日期 - H2
=xlookup(D2,A:A,A:A,,1)
-日期
之后 -
=E2+(F2-E2)*((D2-G2)/max(1,H2-G2))
插值值(最大防止划分为零)
然后将其合并为一个公式以避免额外的列:
=xlookup(D2,A:A,B:B,NA(),-1)+(xlookup(D2,A:A,B:B,NA(),1)-xlookup(D2,A:A,B:B,NA(),-1))*((D2-xlookup(D2,A:A,A:A,,-1))/max(1,xlookup(D2,A:A,A:A,,1)-xlookup(D2,A:A,A:A,,-1)))