Matlab绘制伯德图 6

一、题目与代码

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;
函数语法代码中作用具体用法说明
clcclc清空命令行窗口避免之前的命令输出干扰当前结果,直接调用无参数
clear allclear all清除工作区所有变量、函数、脚本防止残留变量影响当前计算(如之前定义的num冲突)
close allclose 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函数默认自动选择频率范围(对数分布),无需手动指定频率,直接输出与频率对应的magphase矩阵。

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 图幅频特性的标准表示,));
  • 相频曲线:直接用phasebode返回的相位已为度,无需转换)。

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/ylabelxlabel('文本')设置坐标轴标签,说明物理意义和单位标签需包含单位(如rad*s^-1),保证图形可读性
texttext(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');

优化后的图像:

优化点说明:

  1. 用数组zeta_list存储阻尼比,通过循环简化代码(避免重复写 den1-den5);
  2. 手动指定频率omega = logspace(-1,2,1000),确保曲线平滑且覆盖关键频段;
  3. legend替代text标注,避免重叠,更直观;
  4. 增加color_listLineWidth,让不同阻尼比的曲线更容易区分;
  5. 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)线性幅值转 dBmag_dB = 20*log10(squeeze(mag))必须压缩mag维度,否则绘图出错
legend添加图例区分曲线legend('ζ=0.1', ..., 'Location','best')位置best自动优化,避免遮挡曲线
posted @ 2025-11-26 20:53  RaLi  阅读(1)  评论(0)    收藏  举报  来源