Python Fanspeed Interpolation - 返回错误的值

时间:2016-07-08 13:15:31

标签: python interpolation

目前我正在使用python中的插值。你有一个温度和转速的风扇表。输入是温度,输出新处理的rpm值。我没有得到正确的价值。你能救我吗?

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)

2 个答案:

答案 0 :(得分:0)

我不知道你正在做什么样的插值,但似乎你正在尝试进行线性插值,在这种情况下你在这里应用了一个错误的公式,首先你的公式是尺寸明智不正确的。我试图纠正那部分,检查它给你正确的答案

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)

给出了答案62

答案 1 :(得分:0)

首先,我建议排序以防万一。排序将在函数内部完成。

如果您不对其进行排序,并且提供的是反向任意顺序(无论出于何种原因)if和检查以确保您在范围内的elif语句将错误。或者,您可以使用min()max()函数。

最后,对于发生插值的else部分,我会使用while语句来搜索最接近的记录值(此处排序表也是至关重要的)并进行计算像这样:

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

您可能已经注意到,我更改了您的变量名称。一般规则是使用小写字母(TABLE更改为table)并避免使用绑定到python函数的名称(input()更改为user_value

相关问题