一、题目与代码
![]()
clc;clear all;close all;
%Wn=6
num=[36];
W=logspace(-1,2,100);
%阻尼比为0.1
den1=[1 1.2 36];
[mag,phase w]=bode(num,den1,W);
subplot(2,1,1);
semilogx(w,20*log10(mag));grid;
xlabel('W/rad*s^-1')
ylabel('L(w)/dB')
text(1,1,'阻尼比:0.1'); hold;
subplot(2,1,2);
semilogx(w,phase);grid;
xlabel('W/rad*s^-1')
ylabel('相/度')
text(1,1,'阻尼比:0.1'); hold;
%阻尼比为0.3
den2=[1 3.6 36];
[mag2,phase2,w2]=bode(num,den2,W);
subplot(2,1,1);
semilogx(w2,20*log10(mag2));
text(1,1,'阻尼比:0.3');
subplot(2,1,2);
semilogx(w2,phase2);
text(1,1,'阻尼比:0.3');
%阻尼比为0.5
den3=[1 6 36];
[mag3,phase3,w3]=bode(num,den3,W);
subplot(2,1,1);
semilogx(w3,20*log10(mag3));
text(1,1,'阻尼比:0.5');
subplot(2,1,2);
semilogx(w3,phase3);
text(1,1,'阻尼比:0.5');
%阻尼比为0.8
den4=[1 9.6 36];
[mag4,phase4,w4]=bode(num,den4,W);
subplot(2,1,1);
semilogx(w4,20*log10(mag4));
text(1,1,'阻尼比:0.8');
subplot(2,1,2);
semilogx(w4,phase4);
text(1,1,'阻尼比:0.8');
%阻尼比为2
den5=[1 24 36];
[mag5,phase5,w5]=bode(num,den5,W);
subplot(2,1,1);
semilogx(w5,20*log10(mag5));
text(1,1,'阻尼比:2');
subplot(2,1,2);
semilogx(w5,phase5);
text(1,1,'阻尼比:2');
二、代码解读
1. 初始化命令(代码第 1 行)
clc; clear all; close all;
| 函数 | 语法 | 代码中作用 | 具体用法说明 |
|---|
clc | clc | 清空命令行窗口 | 避免之前的命令输出干扰当前结果,直接调用无参数 |
clear all | clear all | 清除工作区所有变量、函数、脚本 | 防止残留变量影响当前计算(如之前定义的num冲突) |
close all | close all | 关闭所有已打开的图形窗口 | 确保 Bode 图在新窗口绘制,不与其他图重叠 |
2. 传递函数参数定义(代码第 3-20 行)
num = [36]; % 分子多项式系数
den1 = [1 1.2 36]; % ζ=0.1时的分母系数
den2 = [1 3.6 36]; % ζ=0.3时的分母系数
...
den5 = [1 24 36]; % ζ=2时的分母系数
3. Bode 图数据计算(bode函数)
[mag, phase] = bode(num, den1); % 计算ζ=0.1时的幅频、相频数据
[mag2, phase2] = bode(num, den2); % 计算ζ=0.3时的数据
...
| 函数 | 语法格式 | 代码中作用 | 输出参数说明 |
|---|
bode | [mag, phase] = bode(num, den) | 计算线性系统的幅频特性和相频特性数据 | - mag:幅值(线性刻度,非 dB);- phase:相位(单位:度);- 输入num/den:传递函数的分子 / 分母多项式系数 |
- 关键注意:
bode函数默认自动选择频率范围(对数分布),无需手动指定频率,直接输出与频率对应的mag和phase矩阵。
4. 子图分割与绘制(subplot+semilogx函数)
subplot(2,1,1); % 上子图(幅频特性)
semilogx(20*log10(mag)); % 绘制幅频曲线
grid; % 显示网格
...
subplot(2,1,2); % 下子图(相频特性)
semilogx(phase); % 绘制相频曲线
grid;
(1)subplot函数:分割图形窗口
| 语法格式 | 代码中作用 | 参数说明 |
|---|
subplot(m, n, k) | 将图形窗口分割为 m 行 n 列,激活第 k 个子图 | - m=2:2 行;n=1:1 列;k=1:第 1 个子图(上)、k=2:第 2 个子图(下);- 后续绘图命令自动作用于 “激活的子图” |
(2)semilogx函数:x 轴对数刻度绘图
| 语法格式 | 代码中作用 | 核心原因 |
|---|
semilogx(x_data, y_data) | 绘制 x 轴为对数刻度、y 轴为线性刻度的曲线 | 频率响应的频率范围宽(如 0.1~100 rad/s),对数刻度可清晰显示低、高频段的特性,这是 Bode 图的标准绘图方式 |
- 幅频曲线:
20*log10(mag) 将线性幅值转换为 dB 刻度(Bode 图幅频特性的标准表示,)); - 相频曲线:直接用
phase(bode返回的相位已为度,无需转换)。
5. 图形标注(xlabel+ylabel+text函数)
xlabel('W/rad*s^-1'); % x轴标签(频率单位)
ylabel('L(w)/dB'); % 幅频图y轴标签(dB)
ylabel('相/度'); % 相频图y轴标签(度)
text(1,1,'阻尼比:0.1'); % 在坐标(1,1)处添加文本标注
| 函数 | 语法格式 | 代码中作用 | 注意事项 |
|---|
xlabel/ylabel | xlabel('文本') | 设置坐标轴标签,说明物理意义和单位 | 标签需包含单位(如rad*s^-1),保证图形可读性 |
text | text(x, y, '标注文本') | 在图形指定坐标 (x,y) 处添加说明 | 代码中所有text的坐标都是 (1,1),会导致标注重叠(后续优化) |
三、代码运行效果与物理意义
1. 幅频特性曲线(上子图)
- 阻尼比 ζ 越小(如 ζ=0.1):曲线在共振频率(≈Wₙ=6 rad/s)处的谐振峰值越高(系统振荡越剧烈);
- 阻尼比 ζ 增大(如 ζ=0.5、0.8):谐振峰值逐渐降低,曲线更平缓;
- 阻尼比 ζ>1(如 ζ=2,过阻尼):无谐振峰值,幅频特性随频率增大单调衰减。
2. 相频特性曲线(下子图)
- 所有二阶系统的相位最终都会从 0° 衰减到 - 180°(二阶系统的相位变化范围);
- 阻尼比 ζ 越小:相位在共振频率附近的变化越陡峭(相位突变明显);
- 阻尼比 ζ 越大:相位变化越平缓,过渡更平滑。
![]()
四、代码优化建议(解决原代码问题)
原代码存在 3 个关键问题:①text标注重叠;②hold on使用不规范;③未指定频率范围导致曲线可能不清晰。以下是优化后的完整代码:
clc; clear all; close all;
% 系统参数:Wn=6,5个阻尼比
Wn = 6;
zeta_list = [0.1, 0.3, 0.5, 0.8, 2]; % 阻尼比数组(简化代码)
num = [Wn^2]; % 分子:Wn²=36
color_list = ['r', 'g', 'b', 'm', 'k']; % 曲线颜色(区分不同阻尼比)
% 手动指定频率范围(0.1~100 rad/s,对数分布,更清晰)
omega = logspace(-1, 2, 1000); % 10^-1 ~ 10^2 rad/s,1000个点
% 绘制幅频特性(上子图)
subplot(2,1,1);
for i = 1:length(zeta_list)
zeta = zeta_list(i);
den = [1, 2*zeta*Wn, Wn^2]; % 分母(自动计算2ζWn)
[mag, phase] = bode(num, den, omega); % 传入指定频率
mag_dB = 20*log10(squeeze(mag)); % 转换为dB,squeeze消除多余维度
semilogx(omega, mag_dB, color_list(i), 'LineWidth', 1.2); % 指定颜色和线宽
hold on; % 保持当前子图,叠加后续曲线
% 标注:避免重叠,y坐标随阻尼比调整
text(0.2, 20 - 5*(i-1), ['ζ=', num2str(zeta)], 'Color', color_list(i));
end
xlabel('ω / (rad·s^{-1})');
ylabel('L(ω) / dB');
title('不同阻尼比二阶系统的Bode图(W_n=6 rad/s)');
grid on; % 显示网格
legend('ζ=0.1', 'ζ=0.3', 'ζ=0.5', 'ζ=0.8', 'ζ=2', 'Location', 'best'); % 图例(替代text)
% 绘制相频特性(下子图)
subplot(2,1,2);
for i = 1:length(zeta_list)
zeta = zeta_list(i);
den = [1, 2*zeta*Wn, Wn^2];
[mag, phase] = bode(num, den, omega);
phase_deg = squeeze(phase); % 相位(度)
semilogx(omega, phase_deg, color_list(i), 'LineWidth', 1.2);
hold on;
end
xlabel('ω / (rad·s^{-1})');
ylabel('φ(ω) / 度');
grid on;
legend('ζ=0.1', 'ζ=0.3', 'ζ=0.5', 'ζ=0.8', 'ζ=2', 'Location', 'best');
优化后的图像:
![]()
优化点说明:
- 用数组
zeta_list存储阻尼比,通过循环简化代码(避免重复写 den1-den5); - 手动指定频率
omega = logspace(-1,2,1000),确保曲线平滑且覆盖关键频段; - 用
legend替代text标注,避免重叠,更直观; - 增加
color_list和LineWidth,让不同阻尼比的曲线更容易区分; - 用
squeeze消除mag/phase的多余维度(bode返回 3 维矩阵,需压缩为 1 维)。
五、核心函数总结表(结合代码实战)
| 函数 | 核心用途 | 代码实战语法 | 关键注意点 |
|---|
bode | 计算系统幅频 / 相频数据 | [mag, phase] = bode(num, den, omega) | 可指定频率omega,输出mag为线性值 |
subplot | 分割图形窗口 | subplot(2,1,1) | 先激活子图,再绘图 |
semilogx | 绘制 x 轴对数刻度曲线 | semilogx(omega, mag_dB) | 频率响应必用,适配宽频率范围 |
20*log10(mag) | 线性幅值转 dB | mag_dB = 20*log10(squeeze(mag)) | 必须压缩mag维度,否则绘图出错 |
legend | 添加图例区分曲线 | legend('ζ=0.1', ..., 'Location','best') | 位置best自动优化,避免遮挡曲线 |