声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5169|回复: 11

[编程技巧] 离散序列求极值问题小结

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

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

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

x
此问题重复讨论的势头见长,因此做个小结。这类问题的基本思路都一致。
利用数学里驻点和极值点定义来求。
--------------------------------------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 编辑 ]

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2007-10-16 22:33 | 显示全部楼层
学习学习 呵呵前还不使用 但可以先留下印象 以便今后学习

[ 本帖最后由 花如月 于 2007-10-16 22:40 编辑 ]
发表于 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 | 显示全部楼层

加等号问题就没有什么意义了:例如一个全1的数列,求出来的结果还是整个数列
发表于 2007-10-16 23:04 | 显示全部楼层

回复 #4 花如月 的帖子

看实际问题的需要了。
发表于 2007-10-16 23:30 | 显示全部楼层
我的方法(其实不是我写的,我在另外的帖子已经注明)并不仅仅只有几句话,后面的其实是处理“相等”的情况,即出现一个“极值点序列小平台”时如何处理的问题。基本上,extr 函数就解决了几乎所有的极值点情况

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

评分

1

查看全部评分

 楼主| 发表于 2007-10-17 09:15 | 显示全部楼层
你的那段后边的程序挺长没有仔细读,我只是想他们放到一起,看起来会方便些:@)
回头再研究研究:loveliness:
发表于 2007-10-17 16:14 | 显示全部楼层
原帖由 eight 于 2007-10-16 23:30 发表


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



找不到你说的extr 函数,真的
发表于 2007-10-17 16:16 | 显示全部楼层
原帖由 donkeyxu 于 2007-10-17 16:14 发表
找不到你说的extr 函数,真的


认真看这个帖子:http://www.chinavib.com/forum/viewthread.php?tid=46984
发表于 2007-10-17 18:02 | 显示全部楼层
这是不是您说的“极值点序列小平台”?

原帖由 eight 于 2007-10-16 23:30 发表


我的方法(其实不是我写的,我在另外的帖子已经注明)并不仅仅只有几句话,后面的其实是处理“相等”的情况,即出现一个“极值点序列小平台”时如何处理的问题。基本上,extr 函数就解决了几乎所有的极值点情况
maxmium distinguished.jpg
发表于 2007-10-17 18:19 | 显示全部楼层
原帖由 cmcc 于 2007-10-17 18:02 发表
这是不是您说的“极值点序列小平台”?


no,是指这种:[1,2,4,4,4,4,4,3,2,1]
发表于 2010-2-16 02:22 | 显示全部楼层

最好用的方法

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

indmax =

     2     6     8     9    10

这个方法既简洁又完善。“小平台”全部包括进去,不想要的话,把“=”去掉就行了。。。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-6-26 14:35 , Processed in 0.081569 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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