2016-04-09 13 views
3

私はいくつかの補間関数を実装して、X値= Date.secondsとY値= doubleの値をプロットしようとしています。Apache Commonsを使用した補間関数

I'vは、これを達成するために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は私がX値の私の配列をループになっ及びXYの配列とXのi番目の要素を渡しています、XIのためにこのメソッドに渡すんどのような値とは何ですか?

私はこの新しいデータをプロットするときに、返されたyiと、xiで渡されたプロットを使用しますか?

+0

あなたはすなわち、補間関数自体をプロットhttps://en.wikipedia.org/wiki/File:Interpolation_example_linear.svgのような画像を作成しますかまたはX/Yポイントのセットを使用してhttps://en.wikipedia.org/wiki/File:Interpolation_example_polynomial.svg?または元のデータセットにないX値のY値を取得してプロットしたいですか? –

+0

補間関数自体をプロットしたい、私は 'highchart.js'を使ってデータをプロットしています。私の究極の目標は、X/Yポイントのセットを使用して将来のポイントをプロットする外挿関数を持つことです。多分このような何かを使用して:https://stackoverflow.com/questions/32076041/extrapolation-in-java 私は補間関数を持っていると私は信じるように導かれた、私はその関数を外挿することができます。 – Johntk

答えて

9

interpolate方法は(ここでxyとも呼ばれる)の対の配列を期待し、できる限りこれらの値をフィット関数(psf)を返します。

この関数は、与えられたxi値(通常は関数の定義に使用されるx/y配列に含まれていない)のyi値を補間するために使用されます。

したがって、関数を定義するx値とy値のペアがあり、この関数を使用して欠損値を補間します。

Apache Commons(第4.4章:補間)のuserguideを参照してください。


例:

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)

一値が未知である:

LinearInterpolatorが所定の値を補間し、生成

(70?) 2つの区分的線形多項式を有する関数:

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

(ここ:70)補間xiの値がある

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

私はそれを読んだ後、ずっとよく理解しています、ありがとう。どのように 'xi'値を使用するかは、セットに含まれていない値を使用したいと仮定して、適切な' xi'を選択するメソッドがあります。同じ 'xi'を使ってデータ全体を補間しますか?セット?私は「はい」と推測していて、「xi」を変更して、別の結果を得るためにセットを再度実行しますか? – Johntk

+0

@Johntk _do私は、データセット全体を補間するために同じxiを使用しますか?_実際にはもう一つの方法です:データセットを使用して 'xi'を補間します。私は少しの例を追加します。 –

+0

@Johntk私はもっと説明を加えました、これが助けてくれることを願っています。 –

関連する問題