2016-04-09 13 views
3

Ich versuche, einige Interpolationsfunktionen zu implementieren, um einige Werte zu zeichnen, wobei der X-Wert = Date.seconds und der Y-Wert = double.Interpolieren Funktion mit Apache Commons Math

I'v erforscht die Apache Commons Math lib verwenden, dies zu erreichen, und ich habe eine Methode, die ich denke, fand ich in der Lage könnte here

Die Methode Ich versuche zu verstehen, zu nutzen:

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; 
} 

Ich verstehe nicht, wo ich den xi Wert bekommen soll?

Was ist xi, welchen Wert ich in diesem Verfahren für xi passieren, bin ich durch meine Anordnung von X Werte Schleife soll und übergeben das i-te Element von X mit der Anordnung von X und Y?

Und wenn ich diese neuen Daten plotten möchte verwende ich die zurückgegebenen yi zusammen mit dem übergebenen xi zu plotten?

+0

Haben Sie die Interpolationsfunktion selbst, dh erstellen Bilder wie https://en.wikipedia.org/wiki/File:Interpolation_example_linear.svg darstellen möchten oder https://en.wikipedia.org/wiki/File:Interpolation_example_polynomial.svg mit einer Reihe von X/Y-Punkten? Oder möchten Sie die Y-Werte für X-Werte erhalten, die nicht in Ihrem ursprünglichen Datensatz enthalten sind, und diese grafisch darstellen? –

+0

Ich möchte die Interpolationsfunktion selbst plotten, ich verwende 'highchart.js', um die Daten zu plotten. Mein oberstes Ziel ist es, eine Extrapolationsfunktion zu haben, um Punkte in der Zukunft zu zeichnen, indem ich meine Menge von X/Y-Punkten verwende. vielleicht mit etwas wie folgt: https://StackOverflow.com/Questions/32076041/Extrapolation-in-Java Aber ich wurde dazu gebracht zu glauben, wenn ich eine Interpolationsfunktion habe, kann ich diese Funktion zu extrapolieren. – Johntk

Antwort

9

interpolate Die Methode erwartet Arrays von Paaren (hier genannt x und y) und gibt eine Funktion (psf), die diese Werte so gut wie möglich paßt.

Diese Funktion wird dann verwendet, um den yi-Wert eines gegebenen xi-Wertes zu interpolieren (der normalerweise nicht im x/y-Feld enthalten ist, das zur Definition der Funktion verwendet wird).

Sie haben also Paare mit x- und y-Werten, die eine Funktion definieren und diese Funktion verwenden, um fehlende Werte zu interpolieren.

Siehe die userguide auf Apache Commons (Kapitel 4.4: Interpolation).


Beispiel:

badly drawn example of a spline interpolation

Die grünen Punkte sind Wertepaare bekannt. Diese sind durch die Wertefelder x und y definiert.

Beim Aufruf interpolate gibt der zurückgegebene PolynomialSplineFunction die Funktion zurück, die mit den bekannten Wertepaaren angenähert wird. Die Form der Funktion wird durch den Typ UnivariateInterpolator definiert, der verwendet wird. Im Beispiel wird eine LinearInterpolator verwendet. Die Zeichnung zeigt die von einem Spline-Interpolator zurückgegebene Funktion. Der rote Punkt symbolisiert einen Wert mit einem unbekannten y-Wert auf der interpolierten Funktion (dies wäre der Wert mit einem x-Wert von xi im Frage-Beispiel).

Wenn brauchen Sie mehr als einen zusätzlichen Wert zu berechnen, verwenden Sie eine Funktion wie diese

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; 
} 

Ein Rechenbeispiel:

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); 
    } 
} 

Drei bekannte Wertepaare angegeben:

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

Ein Wert unbekannt ist:

(? 70)

Die LinearInterpolator die angegebenen Werte interpoliert und erzeugt ein Funktion mit zwei stückweisen, linearen Polynomen:

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

Der Wert der interpoliert xi (hier: 70)

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

Ich habe ein viel besseres Verständnis nach dem Lesen, danke. Wie würde ich einen 'xi'-Wert verwenden, vorausgesetzt, ich möchte einen Wert verwenden, der nicht in der Menge gefunden wurde, gibt es eine Methode zur Auswahl einer geeigneten' xi', verwende ich die gleiche 'xi', um die gesamten Daten zu interpolieren einstellen? Ich rate ja und ändere dann 'xi' und laufe nochmals durch die Sets, um ein anderes Ergebnis zu erhalten. – Johntk

+0

@Johntk _do Ich benutze das gleiche xi, um den gesamten Datensatz zu interpolieren? _ - Es ist eigentlich umgekehrt: Sie verwenden den Datensatz, um 'xi' zu interpolieren. Ich füge ein kleines Beispiel hinzu. –

+0

@Johntk Ich fügte mehr Erklärung hinzu, hoffe, dass dies hilft. –