声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2967|回复: 7

[编程技巧] 找函数极大值点的再讨论

[复制链接]
发表于 2009-9-8 20:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在发这个帖之前先搜了下,有找极值点的代码如下:
y是一个数据
yf=y(2:end-1)-y(1:end-2);   %前向差分
yb=y(2:end-1)-y(3:end);     %后向差分
I=find(yf.*yb>=0);             %寻找极值点(不考虑首尾两点)
I=I+1;
则I是极值点的下标了。
还有
%  data是你的数据
find(diff(sign(diff(data)))==-2)+1;
% 找到极大值的位置
find(diff(sign(diff(data)))==2)+1;
% 找到极小值的位置

但这么做不能解决在极值点连续重复几次出现的情况,比如:
y=[ 3 1 4 4 6 6 2];
若用第一种方法找极大值点,
yf=y(2:end-1)-y(1:end-2);   %前向差分
yb=y(2:end-1)-y(3:end);     %后向差分
I=I=find(yf>=0&yf.*yb>=0&yb>=0);%寻找极值点(不考虑首尾两点)
I=I+1;
则找到的极值点的下标是3 5 6,错y(3)当成极大值点了

若用第二种方法,则I为空阵。
请问在这种情况下如何找到极大值点呢?要求或极值点连续出现,则以最开始出现的那一个极值点为准。
还是以y=[ 3 1 4 4 6 6 2];为例,要求最后求出的极大值点下标就是5
回复
分享到:

使用道具 举报

发表于 2009-9-9 16:49 | 显示全部楼层
的确如LZ所说, 之前看到的一些方法, 针对一些重覆点好像都并无考虑!
参考16F我问过的疑问
http://forum.vibunion.com/forum/viewthread.php?tid=32967&extra=&highlight=%2Bhappy&page=2

[ 本帖最后由 ChaChing 于 2009-9-9 16:51 编辑 ]
 楼主| 发表于 2009-9-10 17:19 | 显示全部楼层

回复 沙发 ChaChing 的帖子

其实用我上面提到的第一种方法可以找到,但是又出现了另一个问题。
代码如下:
y=[ 3 1 4 4 6 6 2]; yf=y(2:end-1)-y(1:end-2);  yb=y(2:end-1)-y(3:end);  
I=find(yf>=0&yf.*yb>=0&yb>=0); I=I+1;
plot(y,'b'); hold on; plot(I,y(I),'r*')
程序结果图如下:
在不是极大值点的4处也标了红色标志
不知道如何才能两全其美

[ 本帖最后由 ChaChing 于 2009-9-10 20:19 编辑 ]
un11111.jpg
发表于 2009-9-10 20:56 | 显示全部楼层
没太多时间验证其他状况, 请LZ试试吧!
clc; clear; y=[ 3 1 4 4 6 6 2];
yf=diff(y); ii=find(yf==0)+1;
yy=y; yy(ii)=yy(ii)+yf(ii).*eps;
imax=find(diff(sign(diff(yy)))==-2)+1
 楼主| 发表于 2009-9-11 16:39 | 显示全部楼层

回复 地板 ChaChing 的帖子

明白您的思想了,我怎么没想到啊。。。谢谢啦

不过例如 当y=[ 3 1 4 4 4 6 6 6 2]时,又不行了

[ 本帖最后由 ChaChing 于 2009-12-14 01:29 编辑 ]
发表于 2009-9-13 20:25 | 显示全部楼层
没错多点重覆要出问题, 太晚累了, 明天有空再想想!

目前没想到什么好方式, 先用了循环处理了, 请LZ试试看! 不知是否有考虑完善
y=[ 3 1 4 4 4 6 6 6 2]; find_max(y)
y=[ 3 1 4 4 4 6 6 6 6 7 7 8]; find_max(y)
y=[ 3 3 3 3]; find_max(y)
y=[ 3 2 3 3 2 1 2 2 3 3 2 1 ]; find_max(y)
y=[ 3 4 3 3 2 1 2 2 3 3 2 1 ];find_max(y)

  1. function imax=find_max(y)
  2. %y=[ 3 1 4 4 4 6 6 6 2];
  3. ny=length(y); imax=[]; jmax=1; ii=2;
  4. while ii<=ny
  5.    if isempty(jmax), if y(ii)>y(ii-1), jmax=ii; end
  6.    else
  7.       if y(ii)<y(jmax), imax=[imax,jmax]; jmax=[]; elseif y(ii)>y(jmax), jmax=ii; end
  8.    end
  9.    ii=ii+1;
  10. end
  11. if ~isempty(jmax), imax=[imax,jmax]; end
  12. plot(y,'b'); hold on; plot(imax,y(imax),'r*'); hold off
复制代码

[ 本帖最后由 ChaChing 于 2009-12-14 01:30 编辑 ]
 楼主| 发表于 2009-9-14 10:51 | 显示全部楼层

回复 8楼 ChaChing 的帖子

我试了一些个数据,都运行地挺好的。ChaChing把细节都考虑到了,:@)
发表于 2012-10-11 16:11 | 显示全部楼层
循环处理也已经很好了。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-28 23:22 , Processed in 0.078619 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表