在java中推断

我已经能够使用LinearInterpolator()。interpolate(x1,y1)来使用Apache Math的插值。 不幸的是,我无法找到推断的方法。

如何在java中进行线性外推?

x1 = [1,2,3,4,5];

y1 = [2,4,8,16,32];

我想知道任何x2的值,而不仅仅是x1范围内的值。

如果我尝试提取值6,如果{@code v}超出*样条函数的域(小于最小结点或大于最大结点),则得到:OutOfRangeException。

编辑:这是我的简单插值函数。 我想要一个选项来启用外推,就像在MathLab(interp2)中一样。 使用x1和y1数组作为该函数的输入我得到Apache的OutOfRangeException,因为值6不包含在x1数组中。

public static List interpolateLinear(double[] x1, double[] y1, Double[] x2) { List resultList; final PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); resultList = Arrays.stream(x2).map(aDouble -> function.value(aDouble)).collect(Collectors.toList()); return resultList; } 

编辑2:不得不在PolynomialSplineFunction对象的.value方法上稍微阅读以使其正确,但它会去(所有功劳归功于用户Joni )谢谢man:

 public static double[] interpolateLinear(double[] x1, double[] y1, double[] x2) { final PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); final PolynomialFunction[] splines = function.getPolynomials(); final PolynomialFunction firstFunction = splines[0]; final PolynomialFunction lastFunction = splines[splines.length - 1]; final double[] knots = function.getKnots(); final double firstKnot = knots[0]; final double lastKnot = knots[knots.length - 1]; double[] resultList = Arrays.stream(x2).map(aDouble -> { if (aDouble > lastKnot) { return lastFunction.value(aDouble - knots[knots.length - 2]); } else if (aDouble < firstKnot) return firstFunction.value(aDouble - knots[0]); return function.value(aDouble); }).toArray(); return resultList; } 

您可以从插值器中获取第一个和最后一个多项式样条曲线,并使用它们进行外推。

 PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1); PolynomialFunction[] splines = function.getPolynomials(); PolynomialFunction first = splines[0]; PolynomialFunction last = splines[splines.length-1]; // use first and last to extrapolate 

你不会从6获得64。 你应该从线性外推中得到48。 这表明外推必然会给你错误的答案。