Interpolieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Hallo,
ich kenne mich noch nicht sehr gut aus in Python und nachdem man ein Problem gelöst hat kommt schon das nächste. Deshalb hoffe ich das mir hier im Forum vielleicht wieder jemand helfen kann:
Also ich habe eine Liste:
liste = [(10, 5), (25, 3), (80, 4)]
wobei der erste Wert des jeweiligen Tupels den Zeitschritt angibt und der zweite den Wert zu diesem Zeitschritt.
Nun brauche ich die Werte zu Zeitpunkten die den gleichen Abstand voneinader haben. Also neueListe = [(10, ?), (20, ?), (30, ?) usw]. Vorgabe für diese Liste ist die Gesamtzeit und in welchen gleichen Abständen die Werte angegeben werden. Also beim oberen Beispiel: 30 10 (Bis 30 mit Abstand 10)
Dazwischen soll linear interpoliert werden. Leider habe ich keine Ahnung wie das gehen könnte. Wahrscheinlich braucht man irgendeine Library, Package oder sowas. (Zu meiner Schande weiß ich nicht wie man das in Python nennt - > was von meinem krassen Unwissen zeugt).
Nachdem mir hier im Forum schon einmal sehr gut geholfen wurde, hoffe ich das mir jemand helfen kann.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Also irgendwelche "Packages" o.ä. brauchst du hier nicht, nur etwas grundlegende Mathematik.

Mir ist noch nicht klar, was die 1. Liste mit der 2. Liste genau zu tun hat,
aa die Punkte aus der 1. Liste nicht alle auf einer Geraden liegen.

Was du brauchst, ist der Term einer linearen Funktion, die sich aus den Werten in der 1. Liste ergeben sollten, damit du mittels dieser Funktion die benötigten Werte für die 2. Liste berechnen kannst - das ist ja im Grunde nicht mehr als eine Wertetabelle.

Mir scheint das weniger ein Python-Problem zu sein, sondern bzw. auch ein mathematisches Problem (für dich jedenfalls):
Wie würdest du die gestellte Aufgabe denn "per Hand" (und ggf. Taschenrechner) lösen? Kannst du das? Dann bekommst du es in Python auch hin.
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Hallo,
also nochmal zu den Listen:
In der ersten Liste ist zu bestimmten Zeitpunkten (1. Wert des Tupels) jeweils ein bestimmter Wert angegeben (2. Wert im Tupel). Jetzt sollen die Werte zu anderen Zeitpunkten, die im gleichen Abstand liegen (1. Tupel aus 2. Liste) errechnet werden.
Vom Prinzip sit mir das schon etwas klar, nur an der Umsetzung in Python haperts, aber vielleicht kann mir da ja jemand helfen. Ich beschreibe mal wie ichs von Hand machen würde:
1. Neue Zeitschritte festlegen. (Gesamtzeit/gleichen Abstand; z.B. 1000/10)
2. Neue Liste damit erstellen (wie???)
3. Vom Hand würde ich jetzt jeweils zwischen den alten Werten Geradengleichungen aufstellen.
4. Die neuen Zeitpunkte würde ich als x in die Gleichungen setzen und bekomme dann die neuen Werte.
Für Zeitpunkte vor dem ersten Zeitpunkt aus Liste 1 nehme ich den Wert aus Liste 1.
Aber wie soll das jetzt in Python gehen?
Ich hab echt keinen blassen Schimmer! :?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ganz verstanden habe ich es immer noch nicht. Aber stellst Du Dir so etwas vor?

Code: Alles auswählen

LIST = [(10, 5), (25, 3), (80, 4)]

def calc_value(old_list, time):
    for pos, (x, y) in enumerate(old_list):
        if time <= x:
            break
    else:
        return y
    if not pos:
        return y
    x0 = old_list[pos - 1][0]
    y0 = old_list[pos - 1][1]
    m = (y - y0) / float(x - x0)
    return y0 + m * (time - x0)

def calc_list(old_list, total_time, dist):
    time = dist
    new_list = []
    while time <= total_time:
        new_list.append((time, calc_value(old_list, time)))
        time += dist
    return new_list

if __name__ == '__main__':
    print calc_list(LIST, 90, 10)
Für Zeitpunkte nach dem letzten Zeitpunkt aus Liste 1 verwende ich den letzten Wert aus Liste 1.
MfG
HWK
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

hallo,
also danke schonmal für die Antworten.
@HWK: Werde gleich mal Deinen Code ausprobieren, sieht auf Anhieb gut aus. Habe noch folgendes gefunden: Interpolationsmethode von Numpy:
http://www.scipy.org/Numpy_Example_List ... 350aeb7f34

habe damit mal folgendes ausprobiert, was im wesentlichen das macht was ich mir vorgestellt habe:

Code: Alles auswählen

import numpy as n
xp = [2.0, 4.0, 5.0]
yp = [1.0, 3.0, 4.0]
x = 2.5
new_y = n.interp(x, xp, yp, left = None, right = None)
print new_y
xp ist das array mit den alten X Werten und yp das Array mit den alten Y Werten. jetzt soll der neue Y Wert bei x ausgerechnet werden.
@HWK müsste so öhnlich wie Deine Lösung sein.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ja, die Ergebnisse sind identisch. Hast Du es denn einmal ausgeführt? Bei mir liefert es unter Numpy 1.0.3.1 folgenden Fehler:

Code: Alles auswählen

ValueError: object of too small depth for desired array
x muss also eine Liste sein, d.h. x = [70]
MfG
HWK
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Hallo HWK,
bei mir gibt es keinen Fehler... Komisch. :?:
Habe Numpy 1.2.1
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Werden die wohl nachgebessert haben.
abgdf

Dazwischen soll linear interpoliert werden. Leider habe ich keine Ahnung wie das gehen könnte.
Meinst Du sowas:

http://www.hoaionline.de/interpolation.html

?

Gruß
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Sowas hatte ich eigentlich nicht gemeint.
Interpolation bedeutet auch überall was anderes. :roll:
Antworten