首页 > 解决方案 > 具有正弦波纹的 n 阶多项式的曲线拟合

问题描述

我正在对某个测量设备中的测量误差进行建模。这就是数据的样子:低频多项式上的高频正弦纹波。我的模型也应该捕捉到涟漪。

拟合误差的曲线应采用以下形式:error(x) = a0 + a1*x + a2*x^2 + ... an*x^n + Asin(x/lambda)。多项式的阶数 n 未知。我的计划是从 1-9 迭代 n 并选择具有最高F-value的那个。

我玩过,numpy.polyfit到目前为止scipy.optimize.curve_fitnumpy.polyfit仅适用于多项式,因此虽然我可以生成“最佳拟合”多项式,但无法确定正弦项的参数 A 和 lambda。scipy.optimize.curve_fit如果我已经知道 error(x) 的多项式部分的多项式的阶数,效果会很好。

有没有一种巧妙的方法可以同时使用numpy.polyfitscipy.optimize.curve_fit完成这项工作?或者可能是另一个库函数?

这是我numpy.polyfit用来选择最佳多项式的代码:

def GetErrorPolynomial(X, Y):

    maxFval = 0.0
    for i in range(1, 10):   # i is the order of the polynomial (max order = 9)
        error_func = np.polyfit(X, Y, i)
        error_func = np.poly1d(error_func)

        # F-test (looking for the largest F value)
        numerator = np.sum(np.square(error_func(X) - np.mean(Y))) / i
        denominator = np.sum(np.square(Y - error_func(X))) / (Y.size - i - 1)
        Fval = numerator / denominator

        if Fval > maxFval:
            maxFval = Fval
            maxFvalPolynomial = error_func

    return maxFvalPolynomial

这是我如何使用的代码curve_fit

def poly_sine_fit(x, a, b, c, d, l):
     return a*np.square(x) + b*x + c + d*np.sin(x/l)

param, _ = curve_fit(poly_sine_fit, x_data, y_data)

它被“硬编码”为二次函数,但我想选择“最佳”顺序,就像我在上面所做的那样np.polyfit

标签: pythonnumpycurve-fittingscipy-optimize

解决方案


我终于找到了一种模拟涟漪的方法,并且可以回答我自己的问题。这篇2006 年的论文对类似于我的数据集的波纹进行了曲线拟合。

首先,我做了一个最小二乘多项式拟合,然后从原始数据中减去这个多项式曲线。这给我留下的只有涟漪。应用傅里叶变换,我选择了让我重建正弦波纹的主要频率。然后我简单地将这些波纹添加到我一开始获得的多项式曲线中。做到了。


推荐阅读