xiaoxiao123 发表于 2006-11-22 19:12:21

matlab如何 求一个函数的多个峰值?

matlab如何 求一个函数的多个峰值?一个函数有多个峰值,但 不知道峰值的位置,如何同时求出各个峰值的大小?谢谢

inndoor 发表于 2006-11-22 19:34:06

1)对该函数求一次导数和二次导数,
2)求一次导数对应的根,
3)判断一次导数的对应根是否为二次导数是否为负,若为负既凸形则是峰值;为正则为凹形。
比如y=-x^2+3*x,一次导数-2*x+3,根3/2。二次导数-2,显然是y(3/2)是峰值。
比如y=x^3+3*x^2等等,也可以如法求出。
4)另外需要考虑两个端点问题,就是说根的范围可能在给出的区间外。这样需要去掉范围外的;
5)还需要考虑的是,两点端点的值,端点值甚至会比任何范围内的都大。比如上边的三次函数,如果范围为[-3,3],虽然峰值不在端点,但是确实y(x=3)是最大的。

bainhome 发表于 2006-11-22 19:39:31

更简单的方法:
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*')

shunfly 发表于 2006-11-22 20:07:36

SMTH MATHTOOLS FAQ
不过好象有点问题

:#FangQ(Qianqian.Fang@dartmouth.edu), 2001/4/21,UESTC/Math#

      极值:
      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)
      返回的是极大值和极小值

======================================================

我的没有问题,你可以测试一下,波峰和波谷点的求法只是将“>”改为“<”,MIT的一道题目,原来simwe有讨论,做波峰波谷求解是我独立想出来的,没想到前人早已经想到了,sign...
                                                                                                                              ——by bainhome

======================================================

[ 本帖最后由 bainhome 于 2006-11-22 20:21 编辑 ]

xiaoxiao123 发表于 2006-11-23 08:56:51

多谢两位

非常感谢两位的回答,按照版主的方法,我已经把这个问题解决了!谢谢!

rocwoods 发表于 2006-11-23 10:00:57

如果不知道diff函数的情况下这么做:
x=linspace(0,10,200);
y=sin(exp(x));
a=find((y(2:end-1)>y(1:end-2))&(y(2:end-1)>y(3:end)))+1;
plot(x,y,x(a),y(a),'r*')
偶当初是在中华钢结构论坛(http://www.okok.org/cgi-bin/ut/topic_show.cgi?id=145681&h=1&bpg=1&age=0)看到bainhome的这个帖子的,又把它贴到研学了(http://bbs.matwav.com/post/view?bid=12&id=577376&tpg=1&ppg=1&sty=1&age=0#577376)。呵呵

[ 本帖最后由 rocwoods 于 2006-11-23 10:05 编辑 ]

zzkkelley 发表于 2007-10-9 13:46:57

真好使啊,强

semeng 发表于 2007-10-10 09:40:15

三维的哪?

litwei 发表于 2010-7-9 12:24:43

三维的很困难

qibbxxt 发表于 2010-7-10 06:01:30

记得前面有一个类似的帖子,一元和二元函数的先离散话,然后有相应的命令,就像找到一个图像上亮度较高的点,用imregionalmax,由于手机上网,不方便找到那个帖子,楼主可以找找看
页: [1]
查看完整版本: matlab如何 求一个函数的多个峰值?