在曲线图上最值和极值点位置进行适当标注

1、首先生成一组0-100的随机数,组内共有100个数据;

yy=randi([0,100],[1,100]);

2、求这组数据的功率谱密度,并绘图;

m=size(yy,2);    xdft = fft(yy);
% 计算功率谱密度
psd = (1/m) * abs(xdft).^2; x=1:m;
loglog(x,psd,'Linewidth',1.5);  grid on;

3、在图上分别标注功率谱密度的最值和某些极值

①[maxVal, maxIdx] = max(psd);  [minVal, minIdx] = min(psd);  % 最值和对应的索引
text(x(1,maxIdx),maxVal, sprintf('%.2e',maxVal), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",13)
text(x(1,minIdx),minVal, sprintf('%.2e',minVal), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",13)

②[peaks1, locs1] = findpeaks(psd);  [peaks2, locs2]= findpeaks(-psd);  %极值和对应的索引
%%选出一些较为明显的极值进行标注
for ii=[1,2]
text(x(locs1(1,ii)),peaks1(1,ii), sprintf('%.2e',peaks1(1,ii)), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",10);
end
for ii=[1,13]
text(x(locs2(1,ii)),-1*peaks2(1,ii), sprintf('%.2e',-1*peaks2(1,ii)), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",10);
end 

 示例代码如下:

clearvars -except yy
close all;
yy=randi([0,100],[1,100]);
m=size(yy,2);  
xdft = fft(yy);
% 计算功率谱密度
psd = (1/m) * abs(xdft).^2;  x=1:m;
loglog(x,psd,'Linewidth',1.5);  grid on;
xlabel('Frequency (Hz)','Fontname','Time New Roman',"FontSize",15);
ylabel('PSD','Fontname','Time New Roman',"FontSize",15);
[maxVal, maxIdx] = max(psd);  [minVal, minIdx] = min(psd);  % 最值和对应的索引
text(x(1,maxIdx),maxVal, sprintf('%.2e',maxVal), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",13)
text(x(1,minIdx),minVal, sprintf('%.2e',minVal), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",13)
[peaks1, locs1] = findpeaks(psd);  [peaks2, locs2]= findpeaks(-psd);  %极值和对应的索引
%选出一些较为明显的极值进行标注
for ii=[1,2]
text(x(locs1(1,ii)),peaks1(1,ii), sprintf('%.2e',peaks1(1,ii)), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",10);
end
for ii=[1,13]
text(x(locs2(1,ii)),-1*peaks2(1,ii), sprintf('%.2e',-1*peaks2(1,ii)), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom',"FontSize",10);
end

如有问题,欢迎随时联系交流!  多多点赞加倍支持,不甚感激😂😂😂

好的,对于一条曲线,我们可以通过Python中的NumPy和SciPy库来实现求解单调区间和极值的功能。下面是一份示例代码: ```python import numpy as np from scipy.signal import argrelextrema # 定义一条曲线 x = np.linspace(-10, 10, 100) y = x**3 - 2*x**2 + 3*x - 4 # 求单调区间 def monotonic_intervals(y): increasing = [] decreasing = [] n = len(y) i = 1 while i < n: while i < n and y[i] >= y[i-1]: i += 1 if i - 1 > 0: increasing.append((i-1, y[i-1])) while i < n and y[i] <= y[i-1]: i += 1 if i - 1 > 0: decreasing.append((i-1, y[i-1])) return increasing, decreasing inc, dec = monotonic_intervals(y) print("Increasing intervals:", inc) print("Decreasing intervals:", dec) # 求极值 maxima_indices = argrelextrema(y, np.greater)[0] minima_indices = argrelextrema(y, np.less)[0] maxima_points = [(x[i], y[i]) for i in maxima_indices] minima_points = [(x[i], y[i]) for i in minima_indices] print("Maxima points:", maxima_points) print("Minima points:", minima_points) ``` 在这个示例代码中,我们首先定义了一条曲线 `y = x**3 - 2*x**2 + 3*x - 4`,然后通过 `monotonic_intervals` 函数来求解单调区间,该函数会返回一个包含单调递增区间和单调递减区间的元组。接下来,我们使用 `argrelextrema` 函数来求解曲线的极值,该函数接受两个参数,第一个参数是曲线的数据,第二个参数是一个比较函数,用于指定是求解极大值还是极小值。最后,我们将求得的单调区间和极值打印出来。 需要注意的是,这个示例代码中的 `monotonic_intervals` 函数只能够处理单峰函数,对于多峰函数可能会出现错误的结果。如果需要处理多峰函数,可以使用更加复杂的算法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

present1227

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值