matlab 求某函数峰值

matlab 求某函数峰值,第1张

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

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

clear allclose allclc

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 allclose allclc

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)=ij=j+1

  end

end

figure(1)hold on

plot(x,y)

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

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

图2

matlab 中如何查找一个序列中的峰值

设定max=min=data(1),从data(2)开始,比较data(2)与data(1)的大小,若data(2)>data(1),则max=data(2),再比较data(3)与data(2)的大小,若data(3)>data(2),说明数据还在上升区间,继续置换;若data(3)<data(2),说明数据开始下降data(2)就是该区间的峰值;令min=data(3),继续进行大小判断,不过紧接的就是看是不是data(4)<data(3)了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8041482.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存