簡體   English   中英

使用Apache Commons Math插值函數

[英]Interpolate function using Apache Commons Math

我正在嘗試實現一些插值函數來繪制一些值,其中X值= Date.seconds,Y值= double。

我一直在研究使用Apache Commons Math lib來實現這個目標,我發現了一個我認為我可以在這里使用的方法

我試圖理解的方法:

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值?

什么是我傳璽什么價值這個方法十一,我在通過我的陣列應該循環X值和傳遞的第i個元素X與陣列XY

當我想繪制這個新數據時,我是否使用返回的yi以及傳入的xi來繪制?

interpolate方法需要對的數組(此處稱為xy )並返回一個盡可能符合這些值的函數( psf )。

然后,該函數用於內插給定xi值的yi值(通常不包含在用於定義函數的x / y數組中)。

因此,您有包含定義函數的x值和y值的對,並使用此函數來插入缺失值。

userguide在Apache下議院(第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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM