你可以估计“a”(振幅)一半y的最大和最小的区别:
事情= (max (y)分钟(y)) / 2
你可以估计“d”(垂直位移)的意思是y的最大和最小(或y本身的意思):
dinit = (max (y) + min (y)) / 2
估计“b”可以通过计算信号的傅里叶变换,但是我只是“插值”x值y = 0,然后平均的两倍邻国根估计“b”的区别:
L1 =符号(y (1: end-1)) ~ =符号(y(2:结束));
L2 =找到(标志(y (1: end-1)) ~ =符号(y(2:结束)))+ 1;
x0 = x (L1) - y (L1)。* (x (L2) - x (L1)。/ (y (L2) - y (L1));
二进制符号= 1 /(平均(diff (x0)) * 2)
最后,“c”之间可以保持0广告2π。使用它们,您可以应用遗传算法找到确切的值,b, c和d:
[vals, fnc] = ga (@ (X)规范(X (1) * sin (X (2) * + X (3)) + X (4) - y), 4,[],[],[],[],[0.5 *事情,0.1 *二进制数位,0,0.5 * dinit],[1.5 *事情,10 *二进制数位,2 *π,1.5 * dinit])
(由于遗传算法的本质,甚至这可以找到错误的值参数,但它通常是找到好的解决方案。)万博 尤文图斯在那之后,你可以申请“适合”来调整结果:
ft.eq = fittype (@ (a1, b1, c1, d1, x) a1 * sin (b1 * x + c1) + d1,…
“系数”,{“a1”,“b1”,“c1”,“d1”});
[fitresult。情商,gof。情商,输出。情商]= fit (x, y, ft.eq,曾经繁荣的瓦尔斯,瓦尔斯[(1),(2),瓦尔斯(3),瓦尔斯(4)]);
fitresult.eq
%画出拟合结果和差异
图(2);
情节(fitresult。情商,x, y)
希望这个有帮助。