我正在尝试使用适合我的函数(信号)的多项式表达式。我正在使用numpy.polynomial.polynomial.Polynomial.fit
函数来使用系数来拟合我的函数(信号)。现在,在生成系数后,我想将这些系数放回多项式方程式中--获得相应的y值--并将它们绘制在图形上。但我没有得到我想要的(橙色线)。我到底做错了什么?
谢谢。
import math
def getYValueFromCoeff(f,coeff_list): # low to high order
y_plot_values=[]
for j in range(len(f)):
item_list= []
for i in range(len(coeff_list)):
item= (coeff_list[i])*((f[j])**i)
item_list.append(item)
y_plot_values.append(sum(item_list))
print(len(y_plot_values))
return y_plot_values
from numpy.polynomial import Polynomial as poly
import numpy as np
import matplotlib.pyplot as plt
no_of_coef= 10
# original signal
x = np.linspace(0, 0.01, 10)
period = 0.01
y = np.sin(np.pi * x / period)
# poly fit
test1= poly.fit(x,y,no_of_coef)
coeffs= test1.coef
# print(test1.coef)
coef_y= getYValueFromCoeff(x, test1.coef)
# print(coef_y)
plt.plot(x,y)
plt.plot(x, coef_y)
3条答案
按热度按时间doinxwow1#
如果您查看文档,请考虑两个属性:
poly.domain
和poly.window
。为了避免数字问题,我们传递给fit()
的自变量(x
)的范围poly.domain = [x.min(), x.max()]
被归一化为poly.window = [-1, 1]
。这意味着您从poly.coef
获得的系数适用于此归一化范围。但您可以相应地调整此行为(牺牲数值稳定性),即调整poly.window
将使您的曲线匹配:但是,除非您有充分的理由这样做,否则我将坚持使用
fit()
的默认行为。附带说明:计算多项式或系数列表已经在NumPy中实现,例如直接使用
或者可替换地使用
np.polyval
。mklgxw1f2#
我总是喜欢看到问题的原创性解决方案。我敦促您继续这样做,因为这是学习如何以编程方式匹配函数的最佳方式。我还想提供一种更适合标准NumPy实现的解决方案。至于你的定制功能,你做得真的很好。唯一的问题是,系数是从高到低的,而你是以从0到最高次方的幂向上计数的。简单地从最高次方倒数到0,允许您的函数给出正确的结果。请注意,您的函数是如何完美地与 numpy 多边形重叠的。
输出
8cdiaqws3#
如果你还不知道这一点,这里有一个简单的方法。