Matlab三阶傅里叶曲线拟合转Python用symfit输出直线问题求助
Matlab三阶傅里叶级数拟合代码转Python问题排查
原Matlab实现
原代码通过Matlab曲线拟合工具箱完成3阶傅里叶级数拟合,实现如下:
ft= fittype('fourier3'); myfit = fit(x,y,ft) figure(20) plot(y) hold figure(20) plot(myfit)
原始数据可视化效果:
Python实现代码
选用symfit库作为Matlab拟合工具箱的等效替代,参考官方文档编写代码如下:
from symfit import parameters, variables, sin, cos, Fit import numpy as np import matplotlib.pyplot as plt import pandas as pd def fourier_series(x, f, n=0): """ 返回n阶符号傅里叶级数 :param n: 傅里叶级数阶数 :param x: 自变量 :param f: 傅里叶级数频率 """ # 生成所有项的参数对象 a0, *cos_a = parameters(','.join(['a{}'.format(i) for i in range(0, n + 1)])) sin_b = parameters(','.join(['b{}'.format(i) for i in range(1, n + 1)])) # 构造级数表达式 series = a0 + sum(ai * cos(i * f * x) + bi * sin(i * f * x) for i, (ai, bi) in enumerate(zip(cos_a, sin_b), start=1)) return series T = pd.read_excel('data.xls') A = pd.DataFrame(T) x, y = variables('x, y') w, = parameters('w') model_dict = {y: fourier_series(x, f=w, n=3)} print(model_dict) xdata = np.array(A.iloc[:, 0]) ydata = np.array(A.iloc[:, 1]) # 定义拟合对象并传入数据 fit = Fit(model_dict, x=xdata, y=ydata) fit_result = fit.execute() print(fit_result) # 绘制结果 plt.plot(xdata, ydata) plt.plot(xdata, fit.model(x=xdata, **fit_result.params).y, ls=':') plt.xlabel('x') plt.ylabel('y') plt.show()
问题描述
代码运行后得到的拟合结果为直线,不符合预期,拟合效果可视化如下:
无法确定是算法调用错误还是绘图逻辑错误,需要相关技术支持。
内容的提问来源于stack exchange,提问作者abdullatif
相关产品推荐
相关产品推荐

