在MATLAB中,可以很方便地使用bode()margin()绘制系统的开环伯德图,但是使用这两种方法绘制的伯德图不容易调整格式,本文将介绍如何绘制自己想要的格式的伯德图。

  1. 第一步需要将MATLAB伯德图中的数据提取出来,无论是使用上文提到的两个函数还是使用Simulink的线性化模块绘制的伯德图都可以;
    在这里插入图片描述
  2. 打开图片的属性检查器后,就可以单独选中上面或下面的图;
    在这里插入图片描述
  3. 运行下面一段代码,提取图中的数据。需要注意的是要保持图窗开启,还要选中想提取的图片;
lh=findall(gca,'type','line'); % 从当前图(gca)中取出曲线的handle,
xcc=get(lh,'xdata'); % 取出x、y轴数据,注意,这个xcc和ycc是以cell的数据结构保存的
ycc=get(lh,'ydata'); 
y=ycc{3};% 取出y轴数据y=ycc{3};从cell转换成矩阵
x=xcc{3};
  1. 有了数据之后,运行下面一段代码就可以画图了。
figure;
% 设置图片大小,单位是厘米
% 位置矩阵各项分别代表图片左上角的横、纵坐标、宽、高
% 这句指令运行结果是绘制一张大小为6.67*5cm的图片
set(gcf,'unit', 'centimeters', 'position', [10 5 6.67 5]);

% subplot有两种用法,一种是subplot(2,1,1),代表绘制2行1列的图片矩阵,
% 另一种是subplot('position', pos),pos是位置矩阵
% 绘制幅频图
pos1 = [0.18 0.6 0.75 0.35];
subplot('position', pos1);

% 以对数为横坐标绘图,颜色是'b'(蓝色),线宽是1
semilogx(x,y,'-','Color','b','LineWidth',1);  

% 限定横纵坐标显示范围
xlim([100,1000000]);
ylim([-90, 30]);
grid on % 开启网格

% 设置纵坐标轴标签,字体是Times New Roman,字号是9(小五号)
ylb = ylabel('\fontname{Times New Roman}\fontsize{9}Magnitude(dB)');

% 设置坐标轴显示的刻度
xticks([10 100 1000 10000 100000]);
yticks([ -90 -60 -30 0 30]);

% 获取幅频图纵坐标轴标签位置,下文需要用它来将两个纵坐标标签对齐
p = get(ylb, 'position');

% 设置全局格式,网格线使用点线,刻度字号9,字体Times New Roman,幅频图横坐标轴标签为空[]
set(gca, 'GridLineStyle', ':', 'GridAlpha', 1, 'Fontsize', 9, 'Fontname', 'Times New Roman','xticklabel','');

% 绘制相频图
pos2 = [0.18, 0.2, 0.75, 0.35]
subplot('position', pos2);
semilogx(xx,yy,'-','Color','b','LineWidth',1);
grid on;
ylim([-180, 0]);
xlim([100 1000000]);
yticks([-180 -135 -90 -45 0]);
xticks([10 100 1000 10000  100000 1000000]);
set(gca, 'GridLineStyle', ':', 'GridAlpha', 1, 'Fontsize', 9, 'Fontname', 'Times New Roman');
ylb1 = ylabel('\fontname{Times New Roman}\fontsize{9}Phase(deg)');
xlabel('\fontname{Times New Roman}\fontsize{9}Frequency(rad/s)');

p1 = get(ylb1, 'position');
p1(1) = (p1(1) + p(1))/2;

% 对齐两个纵坐标标签
set(ylb1,'position',p1);

绘图结果为:
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐