2016-04-09 138 views
3

我想實現一些插值函數來繪製X值= Date.seconds和Y值= double的某些值。使用Apache Commons插值函數數學

心中已經被使用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的值?

什麼是喜我通過什麼樣的價值到這個方法十一,我會通過我的X值的陣列應該循環和傳遞的XXY數組的第i個元素?

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

+0

你要繪製的插補功能本身,即像https://en.wikipedia.org/wiki/File:Interpolation_example_linear.svg創建圖像或https://en.wikipedia.org/wiki/File:Interpolation_example_polynomial.svg使用一組X/Y點?或者您是否想要獲取不在原始數據集中的X值的Y值(並且繪製這些值)? –

+0

我想繪製插值函數本身,我使用'highchart.js'來繪製數據。我的最終目標是通過使用我的一組X/Y點來具有未來繪製點的外推函數。也許使用這樣的東西:https://stackoverflow.com/questions/32076041/extrapolation-in-java 但我一直相信,如果我有一個插值函數,我可以使用該函數來推斷。 – Johntk

回答

9

interpolate方法預計對(這裏稱爲xy)的陣列,並返回儘可能最好地符合這些值的函數(psf)。

此函數用於內插給定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 
+0

閱讀完後我有了更好的理解,謝謝。假如我想使用一個沒有在集合中找到的值,我該如何選擇一個'xi'值來使用,是否有一種選擇合適的'xi'的方法,我是否使用相同的'xi'來插入整個數據組?我猜是的,然後改變'xi'並再次運行以獲得不同的結果? – Johntk

+0

@Johntk _do我使用相同的xi來插入整個數據集?_ - 實際上是相反的:您使用數據集來插入'xi'。我會添加一個小例子。 –

+0

@Johntk我加了更多的解釋,希望這有助於。 –