我正在尝试将一些数据拟合到 MATLAB 中的正弦函数之和,但是,MATLAB 中正弦函数的项数是有限的,即到 1 ≤ n ≤ 8。但是,我希望拟合函数中有更多项,即超过 50 个项。有没有办法让 MATLAB 将我的数据拟合到具有超过 8 个正弦项的正弦函数之和?为什么 MATLAB 中有这样的约束(是技术上的还是任意的)?是否有任何工具箱可以拟合正弦函数(尤其是能够支持加权数据的工具箱)?
>f = fit(X,Y, 'sin10')
>Error using fittype>iCreateFromLibrary (line 412)
>Library function sin10 not found.
最多可以设置“sin8”或“sin9”参数。
我很感激任何回答。
最佳答案
上述问题是,当我使用 matlab fit
函数时,为 Sum of Sines
拟合指定参数(例如 fit(xdata,ydata,'sin6 ')
),它很容易收敛到最优解,并且拟合结果是可以接受的,如下所示:
但是当我尝试使用习惯定义的函数来拟合相同的数据时,结果根本不令人满意,如下图所示:
fun=@(x,xdata)a1*sin(b1*xdata+c1)+...+a6*sin(b6*xdata+c6); %Sum if Six Sines
f=fit(xdata,ydata,fun);
首先,我觉得这是 fit
指令,所以我尝试了其他指令,例如 lsqcurvefit
,它对于某些数据效果很好,但一旦使用其他数据,它就开始了行为不端。
从 Maltab 文档中,我发现正弦总和拟合和傅立叶拟合对起始点或初始点或拟合算法为拟合参数假设的值(振幅、频率和相位)进行第一次迭代。通过检查Matlab拟合工具箱.m
文件,我注意到当您使用预定义函数拟合时,matlab做了一些巧妙的技巧来获取起点(例如fit(x,y,'sin1'),或 fit(x,y,'sin2'),...
但是当您选择 ti 输入自定义函数时,初始点是随机生成的!这就是为什么 Matlab 构建函数有效而我的自定义函数拟合不起作用(即使我输入相同的功能)。
顺便说一句,Matlab 计算ydata
的 FFT,并通过一些(似乎贪婪的)方法提取幅度、频率和相位的初始点(一个名为 startpt.m
的函数可以完成此操作) )。
关于matlab - MATLAB 中的曲线拟合,对于超过 8 项的正弦函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832474/