当前位置: 首页 > 面试题库 >

用Java外推

谷梁建中
2023-03-14
问题内容

我已经能够使用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。这表明外推必然会给您错误的答案。



 类似资料:
  • 问题内容: 我需要使用标题检查是否打开了一个外部窗口(另一个Java程序,但不受我正在使用的程序控制),如果打开了,则根据Java中的用户命令将其最大化或最小化(我只知道窗口的标题,什么也不知道)。Google只说我可以用来获取窗口句柄并使用该句柄对其进行操作,但是我找不到如何执行此操作。 我可以在此处找到有关如何使用JNI的参考: 在JavaSwing中,如何获取对窗口的Win32窗口句柄(hw

  • 问题内容: 我试图制作一个调用外部程序的应用程序,我必须传递两个参数。它没有任何错误。用c ++编写的program.exe可以拍照并修改txt文件的内容。Java程序可以运行,但是什么也没做 这是我的示例代码 问题答案: 从这里可耻地借来的

  • 我正试图开发一个web应用程序,我想知道是否有一种方法可以在不编写大量代码的情况下利用外键。 我的培训。java status_trainee.java 错误:由:org.hibernate.annotationexception:uaicontacts.model.trainees.status_traineeid上的@onetoone或@manytoone引用了未知实体:String引起 谢谢

  • 如何解决此异常: 我读到这个错误与库/jdk有关,但我找不到解决它的好方法。我需要你的帮助。非常感谢。

  • 我正在我的一个项目中使用JTabbedPane,我正在尝试改变应用程序的外观。当我设置windows外观(以及任何其他外观)时,所有按钮、检查按钮等都将改变为它们应该的外观,但选项卡仍然看起来像默认的swing选项卡。下面是它的一个示例: 按钮和复选框看起来像windows组件,但选项卡看起来像默认的Swing。如果有用的话,我将使用JTabbedPane的一个子类,它在一个单独的类文件中定义。我

  • 问题内容: 我的程序从文件中读取一行。此行包含逗号分隔的文本,例如: 我希望拆分的结果是这样的: 如果使用,我将得到: 换句话说:子字符串中的逗号不是分隔符。该如何处理? 问题答案: 你可以尝试以下正则表达式: 这将分割字符串,,后跟偶数双引号。换句话说,它用双引号引起来的逗号分隔。如果你在字符串中使用了引号,则此方法将起作用。 说明: 你甚至可以在代码中使用正则表达式使用修饰符来键入此类内容。修