我有一些简单的时间与位置数据,我正在尝试使用 matlab 的任何优化函数来拟合。我给出了一个数据示例(以蓝色显示)和我在使用 lsqnonlin 时得到的正弦拟合(以红色显示)。1
我知道我的拟合对初始条件有些敏感,但我也知道我的数据幅度非常接近 ~1,频率非常接近 6 Hz。尽管使用接近实际值的初始猜测,但曲线拟合仅适用于我尝试拟合的每 3 条曲线中的大约 1 条。为什么会发生这样的事情?
作为参考,这是我编写的正在优化的函数(注意:我的数据已经有 mean=0 所以我不需要偏移项):
function [err,pred] = sine_fit2(k,x,y)
pred = k(1)*sin(2*pi*x./k(2))+k(3)*cos(2*pi*x./k(2));
err=(y-pred);
end
我在 matlab 中尝试了一些不同的优化函数,包括:lsqnonlin、lsqcurvefit、fminsearch、fminunc
我也玩过初始条件 (IC),发现例如曲线 A 可能很适合 IC#1,但不适合 IC#2,而曲线 B 在使用 IC#1 时很不适合,但在使用 IC#2 等时非常适合。
看到数据非常干净,我真的很惊讶优化例程无法找到正确的参数。也许我在做一些非常愚蠢的事情!非常感谢任何帮助/解释
编辑(2017 年 11 月 6 日@7:30AM)这是我如何称呼我的优化:
% initial guesses
k0 = [1,1/6,1];
% y = data I'm trying to fit
% t = independent variable (time)
[k_opt] = lsqnonlin(@(k)sine_fit2(k,t,y),k0,[],[],lsq_options);
[error,prediction] = sine_fit2(k_opt,t,y);
此外,这里是我试图拟合的数据示例(请注意,我将 y 乘以 100 以获得更重要的数字来显示):
t y*100
0 0.1225
0.0435 -0.0698
0.0870 -0.0550
0.1304 0.0410
0.1739 -0.0908
0.2174 -0.1034
0.2609 0.0671
0.3043 0.0044
0.3478 -0.0630
0.3913 0.1045
0.4348 0.1177
0.4783 -0.0324
0.5217 0.0332
0.5652 0.0886
0.6087 -0.0767
0.6522 -0.0867
0.6957 0.0586
0.7391 -0.0534
0.7826 -0.1024
0.8261 0.0948
0.8696 0.0441
0.9130 -0.1001
0.9565 0.0114
1.0000 0.0457