matlab 求某函数峰值x = 0:0.1:100; y = x.*sin(x); plot(x,y); z=diff(y); c=find(z==0) x(c)
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/21 15:37:46
matlab 求某函数峰值x = 0:0.1:100; y = x.*sin(x); plot(x,y); z=diff(y); c=find(z==0) x(c)
matlab 求某函数峰值
x = 0:0.1:100; y = x.*sin(x); plot(x,y); z=diff(y); c=find(z==0) x(c)
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