使用Apache Commons Math插值函数

时间:2016-04-09 22:19:04

标签: java interpolation apache-commons-math

我正在尝试实现一些Interpolation函数来绘制一些值,其中X值= Date.seconds,Y值= double。

我一直在研究使用Apache Commons Math lib来实现这一点,我发现了一种方法,我认为我可以使用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的第i个元素,数组为{{ 1}}和X

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

1 个答案:

答案 0 :(得分:10)

interpolate方法需要对的数组(此处称为xy)并返回一个尽可能符合这些值的函数(psf)。 / p>

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

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

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

示例:

badly drawn example of a spline interpolation

绿点是已知的值对。这些由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