我需要找到恰好适合 30 个数据点的 29 次多项式函数。我们可以确定,这样的函数是存在的。然而,仅仅三个点后 numpy.polyfit 的误差就急剧增加。
import numpy as np
y = [126, 34, 78, 120, 83, 62, 104, 6, 70, 142, 147, 63, 35, 126, 9, 84, 7, 122, 93, 29, 95, 141, 42, 102, 38, 96, 130, 83, 138, 148]
print(len(y))
x = np.arange(len(y))
f = np.polyfit(x,y,30)
def eval_polynom(f, x):
res = 0
for i in range(len(f)):
res += f[i] * x**(len(f)-i-1)
return res
for i in range(len(y)):
print(y[i], " -- ", eval_polynom(f, x[i]))
我的数据点是 (x,y),其中 x = [0,1,2,3,4,...,29]
输出为
126 -- 125.941598976
34 -- 34.7366402172
78 -- 73.703669116
120 -- 134.514176467
83 -- 51.6471546864
62 -- 105.143046704
104 -- 70.1470309453
6 -- 13.808372367
70 -- 347.425617622
142 -- -1281.11122538
...
有没有办法得到精确的多项式函数,使得误差为0?
最佳答案
您的 eval_polynom
函数中几乎肯定存在整数溢出问题(由于指数较大),因为 x
中的值都是整数。尝试更换
res += f[i] * x**(len(f)-i-1)
与
res += f[i] * float(x)**(len(f)-i-1)
您最终可能会得到仍然不完全匹配的值,但请记住浮点运算本质上是不准确的。如果数字变得很大,情况更是如此,就像这里的情况一样。
关于python - 使用 polyfit 求 30 个点的多项式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45217328/