同样的代码,用的bodeplot画图,在2020b上画出来是正常的波特图,在2021b以及更新的版本上画出来是两条线的波特图,请问这应该怎么处理


同样的代码,用的bodeplot画图,在2020b上画出来是正常的波特图,在2021b以及更新的版本上画出来是两条线的波特图,请问这应该怎么处理


在 MATLAB 2021b 及更新版本中,bodeplot 的默认行为发生了变化,导致波特图出现两条线(通常是标称响应 + 不确定性边界)和相位箭头(相位 wrap 导致的不连续)。
问题根源
1.两条线:新版本默认显示系统的标称响应和不确定性边界,即使模型本身没有显式定义不确定性(如辨识模型 idtf/idss 会默认携带不确定性)。
2.相位箭头:新版本默认对相位进行 wrap 处理(限制在 -180°~180°),当相位跨越边界时会显示箭头表示不连续。
以下是针对性的解决方法:
_方法 1_:显式关闭不确定性显示 + 调整相位设置
通过 bodeoptions 对象自定义绘图行为,从根源上解决显示异常:
% 1. 创建自定义绘图选项
opts = bodeoptions;
opts.ShowUncertainty = false; % 关闭不确定性边界,只画标称响应
opts.WrapPhase = false; % 关闭相位wrap,避免箭头
opts.PhaseRange = [-360 360]; % 自定义相位范围(按需调整)
opts.FreqUnits = 'Hz'; % 确保频率单位与旧版本一致
opts.MagUnits = 'dB'; % 确保幅度单位为dB
% 2. 使用自定义选项绘制波特图
sys = tf([1 10], [1 2 100]); % 替换为你的系统模型
bodeplot(sys, opts);
_方法 2_:如果是辨识模型,先提取标称值
如果你的系统模型来自系统辨识(如 idtf/idss),新版本会默认显示不确定性,可先提取标称模型:
% 假设sys是辨识模型(如idtf对象)
sys_nominal = nominal(sys); % 提取标称模型
opts = bodeoptions;
opts.ShowUncertainty = false;
bodeplot(sys_nominal, opts);
_方法 3_:使用 bode 函数替代 bodeplot
bode 函数在新版本中行为更稳定,默认只绘制标称响应,且相位显示更直观:
sys = tf([1 10], [1 2 100]);
bode(sys); % 直接调用bode,避免bodeplot的版本差异
_方法 4_:手动删除多余线条 + 调整相位
如果需要保留 bodeplot,可手动删除不确定性线条并修正相位显示:
sys = tf([1 10], [1 2 100]);
h = bodeplot(sys); % 获取绘图对象句柄
% 删除不确定性边界线条
uncertainty_lines = findobj(h, 'Type', 'line', 'Tag', 'Uncertainty');
if ~isempty(uncertainty_lines)
delete(uncertainty_lines);
end
% 调整相位显示,避免箭头
setoptions(h, 'WrapPhase', false, 'PhaseRange', [-360 360]);
补充建议
检查代码中是否有 hold on 等绘图叠加命令,新版本中可能默认开启,导致线条叠加。