【问题标题】:Interpolate function using Apache Commons Math使用 Apache Commons Math 插值函数
【发布时间】:2016-04-10 15:59:18
【问题描述】:

我正在尝试实现一些插值函数来绘制 X 值 = Date.seconds 和 Y 值 = double 的一些值。

我一直在研究使用 Apache Commons Math 库来实现这一点,我发现了一种我认为可以使用 here 的方法

我试图理解的方法:

public double linearInterp(double[] x, double[] y, double xi) {
   // return linear interpolation of (x,y) on xi
   LinearInterpolator li = new LinearInterpolator();
   PolynomialSplineFunction psf = li.interpolate(x, y);
   double yi = psf.value(xi);
   return yi;
}

我不明白我应该从哪里获得 xi 值?

什么是 xi 我为 xi 传递给这个方法的值是什么,我是否应该循环遍历我的 X 值数组并使用 X 和 @987654331 的数组传入 X 的第 i 个元素@?

当我想绘制这些新数据时,我是否使用返回的yi 以及传入的xi 来绘制?

【问题讨论】:

标签: java interpolation apache-commons-math


【解决方案1】:

interpolate 方法需要成对的数组(这里称为 xy)并返回一个函数 (psf) 尽可能适合这些值。

然后使用此函数对给定 xi 值的 yi 值进行插值(通常不包含在用于定义函数的 x/y 数组中)。

因此,您有包含定义函数的 x 和 y 值对,并使用此函数来插入缺失值。

请参阅 Apache Commons 上的 userguide(第 4.4 章:插值)。


例子:

绿点是已知值对。这些由xy 值数组定义。

调用interpolate 时,返回的PolynomialSplineFunction 返回使用已知值对逼近的函数。函数的形状由使用的UnivariateInterpolator 类型定义。在问题示例中,使用了LinearInterpolator。该图显示了样条插值器返回的函数。

红点表示插值函数上具有未知 y 值的值(在问题示例中,这将是 x 值为 xi 的值)。

如果您需要计算多个额外的值,请使用这样的函数

public double[] linearInterp(double[] x, double[] y, double[] xi) {
   LinearInterpolator li = new LinearInterpolator(); // or other interpolator
   PolynomialSplineFunction psf = li.interpolate(x, y);

   double[] yi = new double[xi.length];
   for (int i = 0; i < xi.length; i++) {
       yi[i] = psf.value(xi[i]);
   }
   return yi;
}

计算示例:

public class Interpolate {

    public static void main(String[] args) {
        double[] x = { 0, 50, 100 };
        double[] y = { 0, 50, 200 };

        LinearInterpolator interp = new LinearInterpolator();
        PolynomialSplineFunction f = interp.interpolate(x, y);

        System.out.println("Piecewise functions:");
        Arrays.stream(f.getPolynomials()).forEach(System.out::println);

        double value = f.value(70);
        System.out.println("y for xi = 70: " + value);
    }
}

给出三个已知值对:

(0, 0)
(50, 50)
(100, 200)

一个值未知:

(70, ?)

LinearInterpolator 对给定值进行插值并生成一个具有两个分段线性多项式的函数:

y = x             (for x values < 50)
y = 50 + 3 * x    (for x-values >= 50)

插值xi(这里:70)的值为

y = 50 + 3 * (70 - 50) = 110

【讨论】:

  • 读了之后我的理解好多了,谢谢。我将如何选择要使用的xi 值,假设我想使用集合中未找到的值,是否有选择合适的xi 的方法,我是否使用相同的xi 来插入整个数据放?我猜是的,然后更改 xi 并再次运行这些集合以获得不同的结果?
  • @Johntk 我是否使用相同的 xi 来插入整个数据集? - 实际上是相反的:你使用数据集来插入 xi。我将添加一个小例子。
  • @Johntk 我添加了更多解释,希望对您有所帮助。
  • 感谢您花时间写这个答案,我明白它现在是如何工作的,在我的例子中,xi 是一个date,传递一个新的date 将是我的@ 987654350@ 或传入多个日期将是我的xi[i],然后我将使用数据集插入xi[i] 当我尝试使用您提供的方法进行推断时遇到了OutOfRangeException,但是我链接的推断方法在最初的问题有效,但由于使用dates 而不是坐标,我无法获得良好的结果,我需要发布一个我认为的新问题。再次感谢您的帮助。
  • 对不起,我应该说OutOfRangeException 是由于我传入了超出数据集范围的值,您提供给我的函数没有问题。
猜你喜欢
  • 2014-08-06
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多