我已经能够通过LinearInterpolator()。interpolate(x1,y1)使用Apache Math的插值。不幸的是,我找不到推论的方法。
如何在Java中进行线性外推?
x1 = [1,2,3,4,5];
y1 = [2、4、8、16、32];
我想知道任何x2的值,而不仅仅是x1范围内的值。
如果我尝试提取6的值,则会得到:OutOfRangeException,如果{@code v}在
*样条函数(小于最小结点或大于
最大结点)。
编辑:这是我简单的插值函数。我想要一个选项来启用外推,就像在MathLab(interp2)中一样。使用x1和y1数组作为该函数的输入,我得到Apache的OutOfRangeException,因为x1数组中不包含值6。
public static List<Double> interpolateLinear(double[] x1, double[] y1, Double[] x2) {
List<Double> resultList;
final PolynomialSplineFunction function = new LinearInterpolator().interpolate(x1, y1);
resultList = Arrays.stream(x2).map(aDouble -> function.value(aDouble)).collect(Collectors.toList());
return resultList;
}
Edit2:不得不阅读PolynomialSplineFunction对象的.value方法以使其正确,但一切顺利(所有功劳归功于Joni用户),谢谢:
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。哪个显示extrapolation is bound to give you wrong answers.
关于java - 用Java外推,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32076041/