matlab 求某函数峰值

x = 0:0.1:100; y = x.*sin(x); plot(x,y); z=diff(y); c=find(z==0) x(c) 请问高手这程序问题在哪?

首先,diff(y)算出来的z并不是严格意义上的y的微分,而是有一定误差的,所以要它严格等于0除非是巧合才能碰到。

但是即使找绝对值z小于error (error是一个自己设定的比较小的数,作为误差)的话也会有问题,主要是error的值不好确定,和x的取值有关,而且会出现如图1所示的问题,有些点能探测到,有些又探测过多。

clear all;close all;clc;

x = 0:0.01:100;

y = x.*sin(x);

error=1e-2

z=diff(y);

length(z)

plot(x,y);hold on;

c=find(z<=error);

c=find(z(c)>=-error);

plot(x(c),y(c),'r*')


  图1


因此不建议用find函数,另一种方法是探测z的绝对值最小的点作为近似的峰值点,代码如下

clear all;close all;clc;

x = 0:0.01:100;

y = x.*sin(x);

z=diff(y);

z=abs(z);

j=1;

for i=2:length(z)-1

    if z(i)<z(i+1) && z(i)<z(i-1) % 如果微分的绝对值最小则记录下来

        c(j)=i;j=j+1;

    end

end

figure(1);hold on;

plot(x,y);

plot(x(c),y(c),'r*')

效果很好,见图2。但不排除有更简洁的算法。



图2

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-27
z=diff(y); 这一句是求y相邻的差值,根本就不回出现0
c=find(z==0) 就根本找不到0
第2个回答  2013-03-27
y是一个矩阵是吧,矩阵是离散的应该不能求导吧。定义x为符号然后对y求导应该可以吧。我猜的。