x1=(1:360);
y1=Sheet.(1);
y2=Sheet.(2);
%构建一个360×21的数组;
y=[y1,y2];
%拟合曲线表达式,采用的是四阶傅里叶拟合
[a_1,b_1]=createFit(x1, y1); %b中的sse是和方差,rmse均方根,都是越小越好;rsquare决定系数,一般越接近1越好,>0.4拟合效果就还可以;Adjusted R-square:自由度调整 r 平方。
a0 = 5.223 ; %下面都是傅里叶拟合的系数,同频的正弦函数加和还是正弦函数
a1 = -0.02391;
b1 = -0.3808 ;
a2 = -0.1735 ;
b2 = 0.1064 ;
a3 = -0.05254 ;
b3 = 0.1933 ;
a4 = 0.03245 ;
b4 = 0.0001262 ;
w = 0.006936 ;
a_x1 = a0 + a1*cos(x1*w) + b1*sin(x1*w) + ...
a2*cos(2*x1*w) + b2*sin(2*x1*w) + a3*cos(3*x1*w) + b3*sin(3*x1*w) + ...
a4*cos(4*x1*w) + b4*sin(4*x1*w);
ax=[a_x1;a_x1];
error=y-ax';%计算误差,误差是一个360×21的数组
[value,position]=max(error);%计算每一个点的最大误差值与相角
[number,n]=max(value);%导出最大值与其所在的点。我们的目标是输出点和对应的相角
temp=position(n);
%%输出下压点信息
disp('下压点的序号为');
disp(n);
disp('下压点的相角为')
disp(temp);
function [fitresult, gof] = createFit(x, y)
[xData, yData] = prepareCurveData( x, y );
% 设置拟合类型和精度
ft = fittype( 'fourier4' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0 0 0 0 0 0 0 0 0 0.00583396964454929];
% 使模型符合数据
[fitresult, gof] = fit( xData, yData, ft, opts );
end