适合周期性正弦数据抵消(fittype sin1 vs方程相同)

30视图(30天)
你好,
我想适应真实数据使用以下方程:a1 *罪(b1 * x + c1) + d1。使用Matlab中的公式功能是有用的在后处理时的健康。然而,似乎从来没有适合我的脚本工作100%的时间。适合似乎部分工作当我使用sin1 fittype,但不工作如果我使用相同的方程。我怎么得到抵消项,d1, sin1的合适的模型?或Matlab来适应怎么走”a1 * sin (b1 * x + c1) + d1的方程并理解它是周期信号?“sin1”导致正确的a1, b1,和c1值,但不能计算d1(公式不存在)。
%设置假的跟踪来适应
清晰的所有
关闭所有
clc
n = 5;
res = 0.001;
x = (0: res: n * 2 *π)';
一个= 30;
b = 21;
c =π/ 3;
d = 10;
y = a * sin (b * x + c) + d;
%设置三个fittypes基本相同的方程使用相同的“sin1”选项
选择= fitoptions (“sin1”);
ft.eq = fittype (@ (a1, b1, c1, d1, x) a1 * sin (b1 * x + c1) + d1,
“系数”,{“a1”,“b1”,“c1”,“d1”});
ft.sin1_eq = fittype (@ (a1, b1, c1, x) a1 * sin (b1 * x + c1),
“系数”,{“a1”,“b1”,“c1”});
ft.sin1 = fittype (“sin1”);
[fitresult。情商,gof。情商,输出。情商]=适合(x, y, ft.eq选择);
[fitresult。sin1_eq, gof.sin1_eq, output.sin1_eq] = fit(x, y, ft.sin1_eq, opts);
[fitresult。sin1 gof。sin1,output.sin1] = fit(x, y, ft.sin1, opts);
fitresult.eq
fitresult.sin1_eq
fitresult.sin1
%画出拟合结果和差异
斧子(1)=次要情节(3,1,1);
情节(fitresult。情商,x, y)
ylim (((——) * 1.5) + d)
标题(公式(fitresult.eq));
斧子(2)=次要情节(3、1、2);
情节(fitresult。sin1_eq, x, y)
ylim (((——) * 1.5) + d)
标题(公式(fitresult.sin1_eq));
斧子(2)=情节(3、1,3);
情节(fitresult。sin1, x, y)
ylim (((——) * 1.5) + d)
标题(公式(fitresult.sin1));
linkaxes (ax,“x”);
> > fitresult.eq
ans =
通用模型:
ans (x) = a1 * sin (b1 * x + c1) + d1
系数(95%置信范围):
a1 = 0.09119 (-0.2424, 0.4247)
b1 = 0.5009 (0.0911, 0.9107)
c1 = 1.56 (-5.863, 8.983)
d1 = 10 (9.761, 10.24)
> > fitresult.sin1_eq
ans =
通用模型:
ans (x) = a1 * sin (b1 * x + c1)
系数(95%置信范围):
a1 = 1.814 (1.448, 2.181)
b1 = 0.6971 (0.6748, 0.7194)
c1 = 0.0969 (-0.3094, 0.5032)
> > fitresult.sin1
ans =
一般模型Sin1:
ans (x) = a1 * sin (b1 * x + c1)
系数(95%置信范围):
a1 = 30 (29.84, 30.16)
b1 = 21(21岁,21)
c1 = 1.042 (1.032, 1.052)
example.png

答案(1)

Cailean MacLabhruinn
Cailean MacLabhruinn 2019年2月12日
编辑:Cailean MacLabhruinn 2019年2月12日
你可以估计“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)
希望这个有帮助。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!