声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 11367|回复: 22

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

[复制链接]
发表于 2007-6-22 10:29 | 显示全部楼层 |阅读模式

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

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

x
例如函数:y=2*sin(x/2)+cos(2*x)/2;

[ 本帖最后由 eight 于 2007-6-25 11:10 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-6-22 10:38 | 显示全部楼层
没有通用的方法,你得大体估计一下有多少个关心极值,然后在从附近开始搜索。
发表于 2007-6-22 10:40 | 显示全部楼层
发表于 2007-6-22 10:44 | 显示全部楼层
求一阶导零点,判断二阶导符号。
发表于 2007-6-22 10:45 | 显示全部楼层
 楼主| 发表于 2007-6-22 10:46 | 显示全部楼层
奥, 主要是不知道极值点在什么点附近
我是用的:
         if (r(n)>=r(n+1) && r(n)>=r(n-1))|(r(n)<=r(n+1) &&r(n)<=r(n-1))
               a13(end+1)=r(n);
            end
斑竹看这样好不好啊, 有没有更好的方法啊
讨论是讨论了,但是没给出最好的方法啊, 所以问下那个好啊

[ 本帖最后由 ChaChing 于 2009-12-7 16:08 编辑 ]
发表于 2007-6-22 10:55 | 显示全部楼层
楼主认真看下我转的那两个帖子,里面有的方法一句话就可以解决你这个问题。
发表于 2007-6-22 11:00 | 显示全部楼层
原帖由 bao123 于 2007-6-22 10:51 发表
讨论是讨论了,但是没给出最好的方法啊
所以问下那个好啊


最好的方法:extr 函数,自己找找论坛
发表于 2007-6-22 13:40 | 显示全部楼层
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);             %寻找极值点(不考虑首尾两点)
I=I+1;
plot(x,y,'b',x(I),y(I),'r*');
extrapoint.jpg

评分

1

查看全部评分

发表于 2007-6-22 21:07 | 显示全部楼层

班门弄斧

我觉得最好的办法就是大概先画出图像,这样可以直观的看出所要求的点的分布范围,然后对每个点限定具体范围,即可求解
发表于 2007-6-22 21:30 | 显示全部楼层

回复 #11 yangzj 的帖子

是不是要把鞍点去掉?
发表于 2007-6-22 21:49 | 显示全部楼层
你参照以下程序吧
% 寻找极值 data是你的数据
find(diff(sign(diff(data)))==-2)+1;
% 找到极大值的位置
find(diff(sign(diff(data)))==2)+1;
% 找到极小值的位置
data(find(diff(sign(diff(data)))==-2)+1);
data(find(diff(sign(diff(data)))==2)+1);
% 返回的是极大值和极小值

例如,下面这个程序标出了y的极大值
x=linspace(0,10,200);
y=sin(exp(x));
a=find(diff(sign(diff(y)))<0)+1;
plot(x,y,x(a),y(a),'r*')

极大值点

极大值点

评分

1

查看全部评分

发表于 2007-6-23 21:37 | 显示全部楼层
原帖由 chenxinrui 于 2007-6-22 21:49 发表
你参照以下程序吧
% 寻找极值 data是你的数据
find(diff(sign(diff(data)))==-2)+1;
% 找到极大值的位置
find(diff(sign(diff(data)))==2)+1;
% 找到极小值的位置
data(find(diff(sign(diff(data)))==-2) ...


呵呵,举一反三,值得加分
 楼主| 发表于 2007-6-25 09:55 | 显示全部楼层

回复 #14 chenxinrui 的帖子

x(a),y(a)是极值点坐标
不知道
find(diff(sign(diff(data)))==-2)+1;

find(diff(sign(diff(data)))==2)+1;
这俩句是什么意思
发表于 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 & 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-7 16:19 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-13 14:11 , Processed in 0.094109 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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