python - 具有正弦波纹的 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_fit
。numpy.polyfit
仅适用于多项式,因此虽然我可以生成“最佳拟合”多项式,但无法确定正弦项的参数 A 和 lambda。scipy.optimize.curve_fit
如果我已经知道 error(x) 的多项式部分的多项式的阶数,效果会很好。
有没有一种巧妙的方法可以同时使用numpy.polyfit
并scipy.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
解决方案
我终于找到了一种模拟涟漪的方法,并且可以回答我自己的问题。这篇2006 年的论文对类似于我的数据集的波纹进行了曲线拟合。
首先,我做了一个最小二乘多项式拟合,然后从原始数据中减去这个多项式曲线。这给我留下的只有涟漪。应用傅里叶变换,我选择了让我重建正弦波纹的主要频率。然后我简单地将这些波纹添加到我一开始获得的多项式曲线中。做到了。
推荐阅读
- powershell - 如何将 Gitlab {CI_COMMIT_SHORT_SHA} 变量传递给 powershell 脚本
- javascript - 在 Svelte 中连接一组对象时,如何显示迭代计数?
- spring - spring 与 postgresql heroku 的连接太多
- python - JSONDecodeError:期望值:本地机器环境中的第 1 行第 1 列(字符 0)错误,但在基于服务器的环境中没有
- gtk - 我们如何检查 Gtk_Container 是否为空?
- javascript - 如何选择具有特定文本的 div
- office-js - OfficeJs - 如何显示模式对话框
- android - Android studio 4.0 编辑器窗口不见了
- rust - 为什么 Rust 需要所有权注释而不是推断它?
- sqlite - 如何使用 Flask 从 HTML 中获取数据并将其添加到 SQLite?