我已经能够通过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/

10-10 22:21