Процедуры оптимизации Matlab не вписываются в простые синусоидальные данные
У меня есть несколько простых данных о времени и местоположении, которые я пытаюсь подогнать, используя любую из функций оптимизации Matlab. Я привел пример данных (показано синим цветом) и синусоидальной подгонки, которую я получаю при использовании lsqnonlin (показано красным). 1
Я знаю, что мои припадки несколько чувствительны к начальным условиям, но я также знаю, что амплитуда моих данных очень близка к ~1, а частота очень близка к 6 Гц. Несмотря на использование начальных предположений, близких к фактическим значениям, подгонка кривой работает только примерно на 1 из каждых 3 кривых, которые я пытаюсь подогнать. Почему могло случиться что-то подобное?
Для справки вот функция, которую я написал, которая оптимизируется (Примечание: мои данные уже имеют среднее значение =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 и т. д.
Поскольку данные довольно чистые, я очень удивлен, что процедуры оптимизации не могут найти правильные параметры. Может быть, я делаю что-то действительно глупое! Любая помощь / объяснения высоко ценится
РЕДАКТИРОВАТЬ (6/11/2017 @7:30 утра) Вот как я называю свою оптимизацию:
% 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