怎么求一个函数的多个极值点(不是最大最小值)
例如函数:y=2*sin(x/2)+cos(2*x)/2;[ 本帖最后由 eight 于 2007-6-25 11:10 编辑 ] 没有通用的方法,你得大体估计一下有多少个关心极值,然后在从附近开始搜索。 请参考
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 求一阶导零点,判断二阶导符号。 原帖由 bao123 于 2007-6-22 10:29 发表 http://www.chinavib.com/forum/images/common/back.gif
例如函数:y=2*sin(x/2)+cos(2*x)/2;
请搜索版面,这个问题至少讨论过两次 奥, 主要是不知道极值点在什么点附近
我是用的:
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 编辑 ] 楼主认真看下我转的那两个帖子,里面有的方法一句话就可以解决你这个问题。 原帖由 bao123 于 2007-6-22 10:51 发表 http://www.chinavib.com/forum/images/common/back.gif
讨论是讨论了,但是没给出最好的方法啊
所以问下那个好啊
最好的方法:extr 函数,自己找找论坛 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*');
班门弄斧
我觉得最好的办法就是大概先画出图像,这样可以直观的看出所要求的点的分布范围,然后对每个点限定具体范围,即可求解回复 #11 yangzj 的帖子
是不是要把鞍点去掉? 你参照以下程序吧% 寻找极值 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*') 原帖由 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) ...
呵呵,举一反三,值得加分
回复 #14 chenxinrui 的帖子
x(a),y(a)是极值点坐标不知道
find(diff(sign(diff(data)))==-2)+1;
find(diff(sign(diff(data)))==2)+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;
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