0

我有一些简单的时间与位置数据,我正在尝试使用 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  
4

0 回答 0