qq_53556146 2023-05-18 17:49 采纳率: 0%
浏览 30

MATLAB画波特图出现两条线加一个剪头

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

img

img

  • 写回答

1条回答 默认 最新

  • 因趣斯听 2026-02-25 14:36
    关注

    在 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 等绘图叠加命令,新版本中可能默认开启,导致线条叠加。

    评论 编辑记录

报告相同问题?

问题事件

  • 专家修改了标签 2月25日
  • 创建了问题 5月18日