Lineare Interpolation mit zwei Arrays

at0m

Mitglied
Hallo zusammen,

ich möchte eine lineare Interpolation für zwei Arrays, mit einer unterschiedlichen Länge durchführen.

Beispiel:
array1 hat 17 double-Werte, array2 hat 49 double-Werte. Nun möchte ich ein array3 erzeugen, welches ebenfalls 49 double-Werte enthält, die aus array1 interpoliert wurden.

Die allgemeine, mathematische Formel für die lineare Interpolation lautet ja wie folgt:

y=y1+((y2-y1)/(x2-x1))*(x-x1)

wenn x1/y1 der erste, x2/y2 der zweite und x/y der zu interpolierende Punkt ist, wobei x frei gewählt wurde. Das leuchtet auch ein aber wie interpoliere ich, wenn ich keine Koordinaten, sondern eindimensionale Arrays habe? Stehe da etwas auf dem Schlauch.

Kann mir jemand mit einem Tipp auf die Sprünge helfen?
 
Also ich würde mal sagen deine x sind zunächst mal tatsächlich die Indizes des Arrays und die y sind die Werte darin. Und jetzt stellst du dir das ganze mal als Graph aufgemalt dar. der Wertebereich geht ja dann von 0 .... 17. Du möchtest aber dass er von 0 ... 49 geht. D.h. du musst den Wertebereich ein bisschen dehnen d.h. mit einem Faktor multiplizieren und zwar so dass aus 17 eben 49 wir, also Faktor 49/17 = 2.882. Der punkt der vorher bei 0 war bleibt dort. Der Wert der vorher bei 1 war gehört jetzt zu 2.882 usw. Mit diesem Wissen rechnest du dir jetzt nach deiner obigen Interpolationsformel sämtliche Werte für alle ganzzahligen Werte von x von 1... 48 aus (0 bleibt ja wie er war, 49 auch) und schon hast du den Inhalt des neuen Arrays. Ich hoffe das war einigermassen verständlich und du verstehst was ich meine. Man müsste das mal an einem einfachen Beispiel per Hand durchrechnen !!
 
Ich weiss ja nicht ob meine Beschreibung verständlich war. Deshalb das ganze mal eben in Java formuliert 🙂🙂:

Code:
public class LineareInterpolation {

    private double[] array = null;

    public LineareInterpolation(double[] array) {
        this.array = new double[array.length];
        for (int i = 0; i < array.length; i++) {
            this.array[i] = array[i];
        }
    }

    public double[] interpol(int newDimension) {
        double[] newArray = new double[newDimension];
        double faktor = (double) (newDimension-1.0) / (double) (this.array.length-1);

        //speichere kleinsten Wert
        newArray[0] = this.array[0];

        int k = 1;
        for (int i=1; i < this.array.length; i++) {
            // y=y1+((y2-y1)/(x2-x1))*(x-x1)
            while (k <= (i) * faktor) {
                newArray[k] = this.array[i - 1] + ((this.array[i] - this.array[i - 1]) / (faktor)) * (k - (i - 1) * faktor);
                k++;
            }
        }
        return newArray;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        double[] anArray = {38.0, 41.1, 46.1, 55.4, 81.9};

        LineareInterpolation myInterpol = new LineareInterpolation(anArray);
        double[] interpoliertesArray = myInterpol.interpol(13);
        System.out.println("\nErgebnis: ");
        for (int i = 0; i < interpoliertesArray.length; i++) {
            System.out.print(" (" + i + "," + interpoliertesArray[i] + ")");
        }

    }

}

Mitsamt Testprogramm das ein double(5) auf double(13) interpoliert.
Ein bisschen schwierig ist evtl. die Zeile wo newArray[k] berechnet wird weil da ein Term schon vereinfacht ist und einfach "faktor" übrigbleibt !
 
Hallo Sogomn und JStein52,

herzlichen Dank für die ausführlichen Antworten!
Tatsächlich. Durch die Erläuterung das das Beispiel leuchtet es ein! Ich bedanke mich vielmals! 🙂
 

Neue Themen


Zurück
Oben