声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: bao123

[编程技巧] 怎么求一个函数的多个极值点(不是最大最小值)

[复制链接]
发表于 2007-6-27 00:29 | 显示全部楼层
原帖由 mst-tum 于 2007-6-26 16:44 发表
以前问过这个问题,以下是eight大人给出的参考,希望对你有用。


d = diff(x);
n = length(d);
d1 = d(1:n-1);
d2 = d(2:n);
indmin = find(d1.*d2 0
    if fins(end) == m
      if length(debs) ...


恩,正是这个: extr 函数
回复 支持 反对
分享到:

使用道具 举报

发表于 2007-6-29 22:33 | 显示全部楼层
函数不懂时可以查看matlab里的“帮助”,我很多时候就是看帮助的
发表于 2007-9-1 09:58 | 显示全部楼层

回复 #15 happy 的帖子

完全同意,代码简洁好用
发表于 2007-9-1 10:07 | 显示全部楼层

回复 #16 bao123 的帖子

求极值的一般步骤是:

     a):求f'(x);

     b):求f'(x)=0的全部的解——驻点;

     c):判断在驻点两侧的变化规律,即可判断出函数的极值。
find(diff(sign(diff(data)))==-2)就是依照此步骤写出的代码,diff(data)有可能大于0,=0,小于0,我们要找的是相邻两点符号一正一负才是极值区间,如果不理解,你可以把此表达式拆解,分步计算进行观察

评分

1

查看全部评分

发表于 2009-12-7 15:49 | 显示全部楼层
“ if fins(end) == m”求教这个m代表的是什么意思?

评分

1

查看全部评分

发表于 2009-12-7 16:21 | 显示全部楼层

回复 20楼 mason2008 的帖子

好像没有复制齐或有误!? 个人没细看
m的确未定义!
发表于 2009-12-7 20:07 | 显示全部楼层

extr.m完整源程序

在网上找到了如下:
extr函数的链接: http://perso.ens-lyon.fr/patrick.flandrin/EDSFA_mfiles/extr.m

function [indmin, indmax, indzer] = extr(x,t);

% [indmin, indmax, indzer] = EXTR(x,t) finds extrema and zero-crossings
%
% inputs : - x : analyzed signal
%          - t (optional) : sampling times, default 1:length(x)
%
% outputs : - indmin = indices of minima
%           - indmax = indices of maxima
%           - indzer = indices of zero-crossings

if(nargin==1),  t=1:length(x); end

m = length(x); x1=x(1:m-1); x2=x(2:m); indzer = find(x1.*x2<0);

if any(x == 0)
  iz = find( x==0 ); indz = [];
  if any(diff(iz)==1)
    zer = x == 0; dz = diff([0 zer 0]);
    debz = find(dz == 1); finz = find(dz == -1)-1;
    indz = round((debz+finz)/2);
  else
    indz = iz;
  end
  indzer = sort([indzer indz]);
end
  
d = diff(x);

n = length(d); d1 = d(1:n-1); d2 = d(2:n);
indmin = find(d1.*d2<0 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;

if any(d==0)
  imax = []; imin = [];
  bad = (d==0); dd = diff([0 bad 0]);
  debs = find(dd == 1); fins = find(dd == -1);
  if debs(1) == 1
    if length(debs) > 1
      debs = debs(2:end); fins = fins(2:end);
    else
      debs = []; fins = [];
    end
  end
  if length(debs) > 0
    if fins(end) == m
      if length(debs) > 1
        debs = debs(1:(end-1)); fins = fins(1:(end-1));
      else
        debs = []; fins = [];
      end      
    end
  end
  lc = length(debs);
  if lc > 0
    for k = 1:lc
      if d(debs(k)-1) > 0
        if d(fins(k)) < 0
          imax = [imax round((fins(k)+debs(k))/2)];
        end
      else
        if d(fins(k)) > 0
          imin = [imin round((fins(k)+debs(k))/2)];
        end
      end
    end
  end
  if length(imax) > 0, indmax = sort([indmax imax]); end
  if length(imin) > 0, indmin = sort([indmin imin]); end
end

[ 本帖最后由 ChaChing 于 2009-12-9 18:33 编辑 ]

评分

1

查看全部评分

发表于 2012-5-22 15:30 | 显示全部楼层
回复 22 # mason2008 的帖子

谢谢你的分享,刚好有用~
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-1 19:29 , Processed in 0.063656 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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