目前我正在使用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)
答案 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
)