- clc; close all; clear;
- % 节点信息
- data=[105.03 99.18 84.965 72.445 68.994 77.265...
- 91.052 100.61 98.215 86.363 74.439 71.625...
- 80.061 92.18 97.823 91.483 80.241 73.616...
- 78.547 89.084 94.924 89.689 79.898 75.485...
- 81.544 89.485 90.578 83.712 77.401 80.18...
- 86.904 88.721 83.468 78.971 81.983 86.25...
- 85.224 80.901 80.808 84.488];
- % 微分变号信息
- c=findpeaks(data);
- IndMin=find(diff(sign(diff(data)))>0)+1; %获得局部最小值的位置
- IndMax=find(diff(sign(diff(data)))<0)+1; %获得局部最大值的位置
- figure; hold on; box on;
- plot(1:length(data),data);
- plot(IndMin,data(IndMin),'r^')
- plot(IndMax,data(IndMax),'k*')
- legend('曲线','波谷点','波峰点')
- title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold');
初始化一段数据,寻找波峰波谷数据如下:
求极值的具体语句:
要想diff(sign(diff))出现-2,只有是sign的结果为-1,1排列的时候,-1代表,前一次的diff运算前面的数值比后面大,1代表,后一次diff运算后面的数值比前面大,因而,x-a,x,x+b,a,b均为正数,则x为极小值。
同理判断极大值。
find查找到极值的索引后还要+1,是因为,差分运算(diff)后的数据的长度比原始数据少1,见help。
%方法一
x=0:0.01:20;
y=2*sin(x/2)+cos(2*x)/2;
% indmax=find(diff(sign(diff(y)))<0)+1;%极大值点
% indmin=find(diff(sign(diff(y)))>0)+1;%极小值点
ind=find(diff(sign(diff(y)))~=0)+1;%极值点
plot(x,y,x(ind),y(ind),'ro')
%方法二
x=0:0.01:20;
y=2*sin(x/2)+cos(2*x)/2;
indmax=intersect(find(diff(y)>0)+1,find(diff(y)<0));%极大值点
indmin=intersect(find(diff(y)<0)+1,find(diff(y)>0));%极小值点
plot(x,y,x(indmax),y(indmax),'ro',x(indmin),y(indmin),'go')
%方法三
x=0:0.01:20;
y=2*sin(x/2)+cos(2*x)/2;
yf=y(2:end-1)-y(1:end-2); %前向差分
yb=y(2:end-1)-y(3:end);
I=find(yf.*yb>=0)+1;
plot(x,y,'b',x(I),y(I),'r*');