numpy 信号的多项式拟合法及拟合图的绘制

zf9nrax1  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(159)

我正在尝试使用适合我的函数(信号)的多项式表达式。我正在使用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)
doinxwow

doinxwow1#

如果您查看文档,请考虑两个属性:poly.domainpoly.window。为了避免数字问题,我们传递给fit()的自变量(x)的范围poly.domain = [x.min(), x.max()]被归一化为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

mklgxw1f

mklgxw1f2#

我总是喜欢看到问题的原创性解决方案。我敦促您继续这样做,因为这是学习如何以编程方式匹配函数的最佳方式。我还想提供一种更适合标准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()

输出

8cdiaqws

8cdiaqws3#

如果你还不知道这一点,这里有一个简单的方法。

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()

相关问题