python - 使用 polyfit 求 30 个点的多项式函数

标签 python numpy

我需要找到恰好适合 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/

相关文章:

python - 点云到体积

python - 从 peer 包中导入 conftest.py

python - 外积并通过向量运算展平 - numpy

python - Numpy 高效构造稀疏 coo_matrix 或更快的列表扩展

python - 非负整数组合的高效枚举

python - 如何从角点检测给出的点数组中检测特定的坐标点?

python - 如何在文本文件中保存整个 Pandas 数据框

python - 将数据框中的列转换为 "classes"?

python - 在运行时向 Numpy 数组添加属性

python - 已结束的程序(Flask)一直将输出发送到 STDOUT?