花如月 发表于 2007-10-16 22:14

离散序列求极值问题小结

此问题重复讨论的势头见长,因此做个小结。这类问题的基本思路都一致。
利用数学里驻点和极值点定义来求。
--------------------------------------ilxy的方法-------------------------------------------------------------------
aa=randperm(20)
bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))
----------------------------------hyperelastic 的方法----------------------------------------------------------
N = 100; aa=randperm(N);
index = find(((aa(2:N-1)>aa(1:N-2))+(aa(2:N-1)>aa(3:N)))==2)+1;
bb = aa(index);
-------------------bainhome 的方法-----------------------------------------------------------------------------
a=rand(1,100);find(diff(sign(diff(a)))>0)+1
------------------------------------------------------------------------------------------------------------------------
以上代码都是求极大值,略微变换后可以得到极小值。出自:中华钢结构论坛
------------------------------------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;
------------------------------------------------------------------------------------------------------------------------
虽然基本原理一样,不过几位的方法都各有特色。都是前辈们智慧的结晶,在此深表感谢。
小代码体现大智慧的典范!

[ 本帖最后由 ChaChing 于 2009-12-7 21:44 编辑 ]

phebus 发表于 2007-10-16 22:33

学习学习 呵呵目前还不使用 但可以先留下印象 以便今后学习

[ 本帖最后由 花如月 于 2007-10-16 22:40 编辑 ]

donkeyxu 发表于 2007-10-16 22:50

回复 #1 花如月 的帖子

我的改动:

求a(i)>a(i-1)&a(i)>a(i+1)的:

a(find(diff(sign(diff(a)))<0)+1)

但如果求a(i)>=a(i-1)&a(i)>=a(i+1),我看非要for k=1:length(a)循环下不可.

花如月 发表于 2007-10-16 22:57

原帖由 donkeyxu 于 2007-10-16 22:50 发表 http://www.chinavib.com/forum/images/common/back.gif
我的改动:

求a(i)>a(i-1)&a(i)>a(i+1)的:

a(find(diff(sign(diff(a)))=a(i-1)&a(i)>=a(i+1),我看非要for k=1:length(a)循环下不可.
加等号问题就没有什么意义了:例如一个全1的数列,求出来的结果还是整个数列

donkeyxu 发表于 2007-10-16 23:04

回复 #4 花如月 的帖子

看实际问题的需要了。

eight 发表于 2007-10-16 23:30

我的方法(其实不是我写的,我在另外的帖子已经注明)并不仅仅只有几句话,后面的其实是处理“相等”的情况,即出现一个“极值点序列小平台”时如何处理的问题。基本上,extr 函数就解决了几乎所有的极值点情况

[ 本帖最后由 ChaChing 于 2009-12-7 21:42 编辑 ]

花如月 发表于 2007-10-17 09:15

你的那段后边的程序挺长没有仔细读,我只是想他们放到一起,看起来会方便些:@)
回头再研究研究:loveliness:

donkeyxu 发表于 2007-10-17 16:14

原帖由 eight 于 2007-10-16 23:30 发表 http://www.chinavib.com/forum/images/common/back.gif


我的方法(其实不是我写的,我在另外的帖子已经注明)并不仅仅只有几句话,后面的其实是处理“相等”的情况,即出现一个“极值点序列小平台”时如何处理的问题。基本上,extr 函数就解决了几乎所有的极值点情况


找不到你说的extr 函数,真的

eight 发表于 2007-10-17 16:16

原帖由 donkeyxu 于 2007-10-17 16:14 发表 http://www.chinavib.com/forum/images/common/back.gif
找不到你说的extr 函数,真的

认真看这个帖子:http://www.chinavib.com/forum/viewthread.php?tid=46984

cmcc 发表于 2007-10-17 18:02

这是不是您说的“极值点序列小平台”?

原帖由 eight 于 2007-10-16 23:30 发表 http://www.chinavib.com/forum/images/common/back.gif


我的方法(其实不是我写的,我在另外的帖子已经注明)并不仅仅只有几句话,后面的其实是处理“相等”的情况,即出现一个“极值点序列小平台”时如何处理的问题。基本上,extr 函数就解决了几乎所有的极值点情况

eight 发表于 2007-10-17 18:19

原帖由 cmcc 于 2007-10-17 18:02 发表 http://www.chinavib.com/forum/images/common/back.gif
这是不是您说的“极值点序列小平台”?



no,是指这种:

zcam 发表于 2010-2-16 02:22

最好用的方法

--------------------------------------ilxy的方法+等号解决“小平台”问题-------------------------------------------------------------------
>> aa=;%randperm(20)
indmax=intersect(find(diff(aa)>=0)+1,find(diff(aa)<=0))

indmax =

   2   6   8   9    10

这个方法既简洁又完善。“小平台”全部包括进去,不想要的话,把“=”去掉就行了。。。
页: [1]
查看完整版本: 离散序列求极值问题小结