如何使用MATLAB的bode函数进行伯德图分析?

一、bode函数基础作用

bode是Control System Toolbox核心频域分析函数,用于绘制线性系统幅频特性、相频特性 两张子图,横轴为对数频率,纵轴分别是分贝幅值、相位角度。

通过伯德图可直观判断系统稳定裕度、谐振峰值、带宽、低频稳态误差、高频衰减特性,是校正装置设计、稳定性判据(奈奎斯特、对数稳定判据)的必备工具。

前提:必须用tf、ss、zpk生成LTI线性系统模型,缺少控制系统工具箱会提示函数未定义。

二、系统建模两种常用写法

1. 分子分母系数向量建模(课程实验常用)

传递函数 G(s)=10s2+2s+10G(s)=\frac{10}{s^2+2s+10}G(s)=s2+2s+1010

matlab 复制代码
num = [10];
den = [1 2 10];
G = tf(num, den);

2. s符号建模,复杂分式更简洁

matlab 复制代码
s = tf('s');
G = 10/(s^2 + 2*s + 10);

多因式相乘用conv拼接分母

典型一阶积分加惯性环节 G(s)=3s(s+5)G(s)=\frac{3}{s(s+5)}G(s)=s(s+5)3

matlab 复制代码
num = [3];
den = conv([1 0],[1 5]);
G = tf(num, den);

三、bode基础绘图语法

1. 最简调用,自动生成频率区间

matlab 复制代码
clear;clc;
s = tf('s');
G = 16/(s^2+4*s+16);
figure;
bode(G);
grid on;
title('二阶振荡系统伯德图');

图像分为上下两幅:

上图:幅值(dB),下图:相位(°);横轴自动对数刻度。

右键画布选择「特性」,可读取指定频率下幅值、相位数值。

2. 自定义仿真频率范围

默认频率由MATLAB自适应,需要限定起止频率时,构造对数频率向量w:

matlab 复制代码
% 频率区间0.1~100 rad/s,对数等分
w = logspace(-1, 2, 1000);
bode(G, w);
grid on;

logspace(a,b,n):生成10^a ~ 10^b 之间n个对数均匀分布频率点,点数越多曲线越平滑。

四、高频进阶实操场景

场景1:多系统伯德图同图对比

对比校正前后、不同阻尼、不同增益系统频域特性,自定义线型颜色区分:

matlab 复制代码
clear;clc;
s = tf('s');
G1 = 10/(s^2+2*s+10);
G2 = 25/(s^2+2*s+25);
w = logspace(-1,2,800);
figure;
bode(G1,w,'r-',G2,w,'b--');
grid on;
legend('G1 阻尼大','G2 阻尼小','Location','best');
title('两组二阶系统伯德图对比');

场景2:仅提取幅值、相位数据,不绘图

需要手动计算增益裕度、相位裕度、带宽时,返回频率wout、幅值mag、相位phase:

matlab 复制代码
s = tf('s');
G = 16/(s^2+4*s+16);
[mag, phase, wout] = bode(G);
% mag为三维数组,提取一维向量
mag_dB = 20*log10(squeeze(mag));
phase_deg = squeeze(phase);
% 手动绘制伯德图
subplot(2,1,1);
semilogx(wout, mag_dB); grid on;
ylabel('幅值 / dB');
title('手动绘制幅频曲线');
subplot(2,1,2);
semilogx(wout, phase_deg); grid on;
xlabel('频率 ω / (rad/s)');
ylabel('相位 / °');
title('手动绘制相频曲线');

场景3:闭环系统伯德图分析

工程中常分析闭环系统带宽、谐振峰值,先用feedback构造闭环再绘图:

matlab 复制代码
clear;clc;
s = tf('s');
G_open = 5/(s*(s+3)); % 开环传递函数
G_close = feedback(G_open,1); % 单位负反馈闭环
w = logspace(-1,3,1000);
figure;
bode(G_open,w,'r',G_close,w,'b');
grid on;
legend('开环伯德图','闭环伯德图');
title('开环与闭环系统伯德图对比');

场景4:离散系统伯德图

离散传递函数指定采样时间Ts,tf末尾传入采样周期:

matlab 复制代码
num = [0.2];
den = [1 -0.7 0.1];
Ts = 0.1;
Gz = tf(num, den, Ts);
figure;
bode(Gz);
grid on;
title('离散控制系统伯德图');

五、搭配裕度函数快速判定稳定性

bode仅绘图,margin可直接在伯德图标注增益裕度GM、相位裕度PM,工程调试最常用:

matlab 复制代码
s = tf('s');
G = 3/(s*(s+1)*(s+5));
figure;
margin(G);
grid on;
title('带稳定裕度标注的伯德图');

运行后图像自动标出0dB穿越频率、-180°穿越频率,同时命令行输出裕度数值。

六、常见报错与实操注意事项

  1. 未定义函数'bode'
    未安装Control System Toolbox,命令行输入ver control校验,附加功能管理器安装对应工具箱。
  2. 曲线出现尖峰、折线粗糙
    频率点数量太少,logspace第三个参数调大至800~1500,曲线会更顺滑。
  3. 多系统绘图线条重叠
    手动指定线型:实线-、虚线--、点线:,搭配r/g/b/k区分颜色。
  4. 分不清开环/闭环伯德图用途
    开环伯德图用于稳定裕度、校正装置设计;闭环伯德图用于分析系统响应速度、谐振、带宽。
  5. 幅值数值不是dB
    bode输出原始幅值mag,转为分贝必须用公式 20*log10(mag)

七、完整可直接运行综合示例脚本

matlab 复制代码
% bode伯德图完整仿真代码
clear; clc; close all;
% 1. 建立三阶开环传递函数
s = tf('s');
G_open = 4/(s*(s+2)*(s+6));
% 2. 自定义频率区间绘制伯德图
w = logspace(-2, 3, 1200);
figure(1);
bode(G_open, w);
grid on;
title('三阶系统开环伯德图');
% 3. 绘制带稳定裕度的伯德图
figure(2);
margin(G_open);
grid on;
title('标注增益裕度、相位裕度伯德图');
% 4. 构造闭环系统对比频域特性
G_close = feedback(G_open, 1);
figure(3);
bode(G_open,w,'r-',G_close,w,'b--');
grid on;
legend('开环','闭环');
title('开环、闭环伯德图对比');
% 5. 提取频域数据
[mag,phase,w_data] = bode(G_open);
mag_dB = 20*log10(squeeze(mag));
disp('前10组频率-幅值数据:');
disp([w_data(1:10), mag_dB(1:10)]);
相关推荐
微学AI3 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡4 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天4 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Aaron - Wistron5 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy12393102166 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
0566467 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄7 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰7 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔7 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
Leighteen7 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言