前言
波特图作为传递函数分析中最常用的手段,讨论如何使用MATLAB绘制参数可变的波特图具有实际应用的意义。特别是在实验报告,期刊论文等中,常需要进行波特图的绘制,涉及多个传递函数的对比波特图等。常用的绘图函数在图线的颜色,线形,线宽的调整上存在不便,本文给出一些波特图绘制的手段。
目录
前言
1基础的波特图绘制
2.bode()相关的绘图函数
编辑3.bodeoptions
4.多曲线共同绘制
5.曲线完全自定义修改
6.进一步问题
1基础的波特图绘制
采用一个简单的三阶系统作为示例,基础的波图图绘制仅需采用bode()函数,输入系统的传递函数即可生成对应的波特图。
Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);figure;bode(Gp);
2.bode()相关的绘图函数
bode()函数相关的衍生有bodeplot()函数,bodemag()函数。前者与bode()函数的应用相同,后者可以单独得到幅值响应图像。如果需要单独得到相位响应函数则需要采用bode()函数的返回值得到相位数据后自行绘制。
Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);figure;subplot(1,2,1);bodeplot(Gp);subplot(1,2,2);bodemag(Gp);
3.bodeoptions
bodeoptions中提供了常见的波特图绘制设置,常用的设置主要有两个,一个是FreqUnits,其能够设置横坐标的类型,可选频率Hz与角频率rad/s的单位。另一个是PhaseWrapping,其为相位绕组设置,选择相位绕组后相位响应的范围为-180°至180°,超过范围的相位会以绕组的形式呈现。特别用在高阶系统,其经常出现过大的相位变化,不利于观察特征频段,故采用绕组形式。
op = bodeoptions;op.FreqUnits = 'Hz';op.PhaseWrapping = 'on';Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);figure;bode(Gp,op);
4.多曲线共同绘制
bode()函数提供了多系统绘制的结构,仅需要排列多个系统的传函即可,同时针对图线的颜色,线形和标记等提供了同plot()函数一样的快捷设置字符串。然后其只能选择快捷设置的提供的颜色选项以及无法改变线宽有待优化。
快捷设置字符串的查找表参考连接中plot()函数的说明
二维线图 - MATLAB plot - MathWorks 中国https://ww2.mathworks.cn/help/matlab/ref/plot.html#btzitot_sep_mw_3a76f056-2882-44d7-8e73-c695c0c54ca8
op = bodeoptions;op.FreqUnits = 'Hz';op.PhaseWrapping = 'on';Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);Gp1=tf(1,[4e-8 4e-6 1])*tf(1,[0.001 1]);figure;bode(Gp,'b-',Gp1,'r--',op);
5.曲线完全自定义修改
在matlab的figure中能够完全修改绘图参数,记录画图的figure,根据其下的children子集就能找到绘图区Axes,在绘图区的子集中能够到对象组Group,Group的子集即为绘图的曲线。通过子集探索即可找到对应的图线进行自定义修改包括RGB颜色,线形,粗细等。
op = bodeoptions;op.FreqUnits = 'Hz';op.PhaseWrapping = 'on';Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);Gp1=tf(1,[4e-8 4e-6 1])*tf(1,[0.001 1]);f1=figure;bode(Gp,Gp1,op);
op = bodeoptions;op.FreqUnits = 'Hz';op.PhaseWrapping = 'on';Gp=tf(1,[4e-9 4e-7 1])*tf(1,[0.001 1]);Gp1=tf(1,[4e-8 4e-6 1])*tf(1,[0.001 1]);f1=figure;bode(Gp,Gp1,op);f1.Children(2).Children(1).Children.LineWidth=2;f1.Children(3).Children(1).Children.LineWidth=2;f1.Children(2).Children(1).Children.Color=[166, 64, 54]/255;f1.Children(3).Children(1).Children.Color=[166, 64, 54]/255;f1.Children(2).Children(1).Children.LineStyle='--';f1.Children(3).Children(1).Children.LineStyle='--';f1.Children(2).Children(2).Children.LineWidth=3;f1.Children(3).Children(2).Children.LineWidth=3;f1.Children(2).Children(2).Children.Color=[65, 130, 164]/255;f1.Children(3).Children(2).Children.Color=[65, 130, 164]/255;
6.进一步问题
使用过程中发现标签显示不正常,尝试在f1的子集中寻找legend相关内容,legend由标签符号,标签文本组成,在其子集中更改标签符号的线形和线宽
%n根据实际figure子集内容选择f1.Children(n).EntryContainer.Children(2).Children(1).Transform.Children.Children.LineStyle='--';f1.Children(n).EntryContainer.Children(2).Children(1).Transform.Children.Children.LineWidth=1;
通过该种方式修改以后,在figure中的显示得到修改,然而通过figure进行保存,标签样式回归之前没修改的样子,无法保存。尝试采用print()函数进行保存
print(f1, 'myfigure.png', '-dpng', '-r300');
该方式目前能解决问题,但是过程过于繁琐,后续继续探索出现的该问题。
(更新中)