2016-07-08 9 views
-1

Im Moment arbeite ich mit Interpolation in Python. Sie haben einen Ventilatortisch mit Temperatur und Drehzahl. Der Eingang ist eine Temperatur und der Ausgang den neu verarbeiteten Drehzahlwert. Ich bekomme nicht den richtigen Wert. Kannst du mir helfen?Python Fanspeed Interpolation - Falscher Wert

TABLE = [ 
(0, 0), 
(20, 10), 
(50, 30), 
(80, 90), 
(100, 100)] 

def interPolation(table, input): 
    if input < table[0][0]: 
     return table[0][1] 
    elif input > table[-1][0]: 
     return table[-1][1] 
    else: 
     for n, _ in enumerate(table): 
      if table[n][0] <= input <= table[n + 1][0]: 
       return (table[n + 1][0] - table[n][0])/(table[n + 1][1] - table[n][1]) * input + table[n][1] 

print interPolation(TABLE, 66) 
+1

Welchen Wert erwarten Sie, und was bekommen Sie stattdessen? – Taegost

Antwort

0

Zunächst einmal würde ich vorschlagen, die Tabelle nur für den Fall zu sortieren. Die Sortierung würde innerhalb der Funktion erfolgen.

Wenn Sie nicht es sortieren, und es wird in der Reverse oder willkürlich vorgesehen, um sagen wir mal (aus irgendeinem Grund) Ihre if und elif Anweisungen, die Sie sich im Bereich stellen Sie sicher, überprüfen würde falsch sein. Alternativ können Sie die Funktionen min() und max() verwenden.

schließlich für den else Teil, das ist, wo die Interpolation geschieht, würde ich eine while Anweisung für die nächste aufgezeichnete Wert (wieder eine sortierte Tabelle von entscheidender Bedeutung ist hier) zu suchen und tun, die Berechnung wie folgt:

def interPolation(table, user_value): 
    table = sorted(table, key=lambda x: x[0]) 
    if user_value < table[0][0]: 
     return table[0][1] 
    elif user_value > table[-1][0]: 
     return table[-1][1] 
    else: 
     i = 0 
     while user_value >= table[i][0]: 
      i += 1 
     return table[i-1][1] + (user_value - table[i-1][0]) * (table[i][1] - table[i-1][1])/(table[i][0] - table[i-1][0]) 

table_inp = [(0, 0), (20, 10), (50, 30), (80, 90), (100, 100)] 

print(interPolation(table_inp, 66)) # returns 62.0 

Wie Sie vielleicht bemerkt haben, habe ich Ihre Variablennamen geändert. Eine allgemeine Regel ist Kleinbuchstaben zu verwenden (TABLE zu table geändert) und vermeiden Namen gebunden Python Funktionen (input() geändert user_value)

0

Ich weiß nicht, welche Art von Interpolation Sie tun, aber es scheint, dass Sie eine lineare Interpolation zu tun versuchen, in diesem Fall, dass Sie hier eine falsche Formel anwenden, 1. Ihre Formel ist Dimension weise falsch . Ich habe versucht, diesen Teil zu korrigieren, überprüft es gibt Ihnen die richtigen am

data = [ 
(0, 0), 
(20, 10), 
(50, 30), 
(80, 90), 
(100, 100)] 

def interPolation(table, temp): 
    if temp < table[0][0]: 
     return table[0][1] 
    elif temp > table[-1][0]: 
     return table[-1][1] 
    else: 
     for n, _ in enumerate(table): 
      if table[n][0] <= temp <= table[n + 1][0]: 
       return (table[n + 1][1] - table[n][1])/(table[n + 1][0] - table[n][0]) * (temp-table[n][0]) + table[n][1] 

print interPolation(data, 66) 

Gibt am 62

+0

Ja, es ist lineare Interpolation. Ihr Code sieht besser aus, aber ich bekomme nicht den richtigen Wert. z.B. Eingabe = 10, Ausgabe = 0 – schui

+0

Nein für Eingabe 10 gibt es mir Ausgabe 5, wenn Sie Python 2 verwenden, dann versuchen Sie Division von '__future__ zu importieren. – Eular