You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:15:04