我试图使用一个符合我的函数(信号)的多项式表达式。我使用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)
发布于 2022-10-27 11:48:08
如果您签出文档,请考虑这两个属性:poly.domain
和poly.window
。为了避免数值问题,我们传递给poly.domain = [x.min(), x.max()]
的自变量范围(x
)被标准化为poly.window = [-1, 1]
。这意味着您从poly.coef
获得的系数适用于这个规范化范围。但是您可以相应地调整这种行为(牺牲数值稳定性),也就是说,poly.window
将使您的曲线匹配:
...
test1 = poly.fit(x, y, deg=no_of_coef, window=[x.min(), x.max()])
...
但是,除非您有充分的理由这样做,否则我会坚持fit()
的默认行为。
附带说明:计算多项式或系数列表已经在numpy中实现,例如直接使用
coef_y = test1(x)
或者选择使用np.polyval
。
发布于 2022-10-27 11:57:13
我总是喜欢看到最初的解决问题的方法。我敦促您继续这样做,因为这是学习如何以编程方式匹配函数的最佳方法。我还想提供更适合于标准numpy实现的解决方案。至于您的自定义功能,您做得非常好。唯一的问题是,系数是从高到低的,而你正在计算的幂从0到最高的幂。只需从最高功率下降到0,你的函数就能给出正确的结果。请注意您的函数是如何与numpy多边形完美地重叠的。
import numpy as np
import matplotlib.pyplot as plt
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])**(len(coeff_list)-i-1))
item_list.append(item)
y_plot_values.append(sum(item_list))
print(len(y_plot_values))
return y_plot_values
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
coeffs = np.polyfit(x,y,no_of_coef)
coef_y = np.polyval(coeffs,x)
COEF_Y = getYValueFromCoeff(x,coeffs)
plt.figure()
plt.plot(x,y)
plt.plot(x, coef_y)
plt.plot(x, COEF_Y)
plt.legend(['Original Function', 'Fitted Function', 'Custom Fitting'])
plt.show()
输出
发布于 2022-10-27 12:24:12
如果你还不知道的话,这里有个简单的方法.
import math
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)
plt.plot(x, y, 'r', label='original y')
x = np.linspace(0, 0.01, 1000)
plt.plot(x, test1(x), 'b', label='y_fit')
plt.legend()
plt.show()
https://stackoverflow.com/questions/74226765
复制