bao123 发表于 2007-6-22 10:29

怎么求一个函数的多个极值点(不是最大最小值)

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

[ 本帖最后由 eight 于 2007-6-25 11:10 编辑 ]

VibrationMaster 发表于 2007-6-22 10:38

没有通用的方法,你得大体估计一下有多少个关心极值,然后在从附近开始搜索。

rocwoods 发表于 2007-6-22 10:40

请参考
http://www.okok.org/cgi-bin/ut/topic_show.cgi?id=145681&h=1&bpg=1&age=0
或者
http://bbs.matwav.com/post/view?bid=12&id=577376&tpg=1&ppg=1&sty=1&age=0#577376

w89986581 发表于 2007-6-22 10:44

求一阶导零点,判断二阶导符号。

eight 发表于 2007-6-22 10:45

原帖由 bao123 于 2007-6-22 10:29 发表 http://www.chinavib.com/forum/images/common/back.gif
例如函数:y=2*sin(x/2)+cos(2*x)/2;

请搜索版面,这个问题至少讨论过两次

bao123 发表于 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 编辑 ]

rocwoods 发表于 2007-6-22 10:55

楼主认真看下我转的那两个帖子,里面有的方法一句话就可以解决你这个问题。

eight 发表于 2007-6-22 11:00

原帖由 bao123 于 2007-6-22 10:51 发表 http://www.chinavib.com/forum/images/common/back.gif
讨论是讨论了,但是没给出最好的方法啊
所以问下那个好啊

最好的方法:extr 函数,自己找找论坛

yangzj 发表于 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*');

21112127cyp 发表于 2007-6-22 21:07

班门弄斧

我觉得最好的办法就是大概先画出图像,这样可以直观的看出所要求的点的分布范围,然后对每个点限定具体范围,即可求解

w89986581 发表于 2007-6-22 21:30

回复 #11 yangzj 的帖子

是不是要把鞍点去掉?

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)+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*')

happy 发表于 2007-6-23 21:37

原帖由 chenxinrui 于 2007-6-22 21:49 发表 http://www.chinavib.com/forum/images/common/back.gif
你参照以下程序吧
% 寻找极值 data是你的数据
find(diff(sign(diff(data)))==-2)+1;
% 找到极大值的位置
find(diff(sign(diff(data)))==2)+1;
% 找到极小值的位置
data(find(diff(sign(diff(data)))==-2) ...

呵呵,举一反三,值得加分

bao123 发表于 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;
这俩句是什么意思

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 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;
if any(d==0)

imax = []; imin = [];
bad = (d==0); dd = diff();   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 = ; end
      else
      if d(fins(k)) > 0, imin = ; end
      end
    end
end

if length(imax) > 0, indmax = sort(); end
if length(imin) > 0,indmin = sort(); end
end

[ 本帖最后由 ChaChing 于 2009-12-7 16:19 编辑 ]
页: [1] 2
查看完整版本: 怎么求一个函数的多个极值点(不是最大最小值)