%% 练习一:差分方程与响应 % 文件名: exercise1_basic_response.m % 学号:______ 姓名:______ clear; clc; close all; %% 准备输入信号 u[n] n = 0:19; x = []; % TODO 生成单位阶跃输入信号 %% 系统 1 b1 = []; % TODO 定义系统1的分子系数 a1 = []; % TODO 定义系统1的分母系数 y1 = []; % TODO 计算系统1的响应 %% 系统 2 b2 = []; % TODO 定义系统2的分子系数 a2 = []; % TODO 定义系统2的分母系数 y2 = []; % TODO 计算系统2的响应 %% 系统 3 b3 = []; % TODO 定义系统3的分子系数 a3 = []; % TODO 定义系统3的分母系数 y3 = []; % TODO 计算系统3的响应 %% 绘图 % TODO 绘图要求: % 使用 subplot 创建一个 3x1 的图形布局。 % - 第一个子图: 绘制系统1的响应 y1。 % - 第二个子图: 绘制系统2的响应 y2。 % - 第三个子图: 绘制系统3的响应 y3。 figure('Name', '练习一:系统响应对比'); % 在此编写绘图代码... %% ======================================== % 🔍 提交前自检 (请勿修改以下代码) % ======================================= vars_chk = {'x', 'y1', 'y2', 'y3'}; miss = {}; for i = 1:length(vars_chk) if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i})) miss{end+1} = vars_chk{i}; end end if ~isempty(miss) fprintf(2, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n -> %s\n', strjoin(miss, ', ')); else fprintf('✅ 练习一变量检查通过。\n'); end
%% 练习二:零极点图绘制与分析
% 文件名: exercise2_pz_analysis.m
% 依赖: dpzplot.m
% 学号:______ 姓名:______
clear; clc; close all;
figure('Name', '练习二:零极点图');
%% 系统 1
b1 = []; % TODO 定义系统1的分子系数
a1 = []; % TODO 定义系统1的分母系数
subplot(1,3,1);
dpzplot(b1, a1);
title('系统 1');
%% 系统 2
b2 = []; % TODO 定义系统2的分子系数
a2 = []; % TODO 定义系统2的分母系数
subplot(1,3,2);
dpzplot(b2, a2);
title('系统 2');
%% 系统 3
b3 = []; % TODO 定义系统3的分子系数
a3 = []; % TODO 定义系统3的分母系数
subplot(1,3,3);
dpzplot(b3, a3);
title('系统 3');
%% ========================================
% 🔍 提交前自检 (请勿修改以下代码)
% =======================================
vars_chk = {'b1', 'a1', 'b2', 'a2', 'b3', 'a3'};
miss = {};
for i = 1:length(vars_chk)
if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i}))
miss{end+1} = vars_chk{i};
end
end
if ~isempty(miss)
fprintf(2, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n -> %s\n', strjoin(miss, ', '));
else
fprintf('✅ 练习二变量检查通过。\n');
end
%% 练习三:零极点设计与稳定性 % 文件名: exercise3_pole_zero_design.m % 依赖文件: dpzplot.m % 学号:______ 姓名:______ clear; clc; close all; %% 任务一:理想谐振器设计 b_ideal = []; % TODO 定义理想谐振器的分子系数 a_ideal = []; % TODO 定义理想谐振器的分母系数 h_ideal = []; % TODO 计算理想谐振器的冲激响应 %% 任务二:参数化分析 K = 0.9; r = []; % TODO 计算衰减因子 r b_damped = []; % TODO 定义阻尼谐振器的分子系数 a_damped = []; % TODO 定义阻尼谐振器的分母系数 h_damped = []; % TODO 计算阻尼谐振器的冲激响应 %% 绘图 n = 0:49; % TODO 绘图要求: % 使用 subplot 创建一个 2x2 的图形布局。 % - 左上: 理想谐振器的零极点图。 % - 右上: 阻尼谐振器的零极点图。 % - 左下: 理想谐振器的冲激响应。 % - 右下: 阻尼谐振器的冲激响应。 figure('Name', '练习三:谐振器设计'); % 在此编写绘图代码... %% ======================================== % 🔍 提交前自检 (请勿修改以下代码) % ======================================= vars_chk = {'a_ideal', 'h_ideal', 'r', 'a_damped', 'h_damped'}; miss = {}; for i = 1:length(vars_chk) if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i})) miss{end+1} = vars_chk{i}; end end if ~isempty(miss) fprintf(2, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n -> %s\n', strjoin(miss, ', ')); else fprintf('✅ 练习三变量检查通过。\n'); end
%% 练习四:自定义函数与系统特性 % 文件名: exercise4_custom_function.m % 依赖文件: diffeqn.m % 学号:______ 姓名:______ clear; clc; close all; n = 0:30; %% 任务二:零状态响应 y_impulse = []; % TODO 计算零状态下的冲激响应 y_step = []; % TODO 计算零状态下的阶跃响应 %% 任务三:非零状态与线性度检验 y1 = []; % TODO 计算非零状态下 u[n] 的响应 y2 = []; % TODO 计算非零状态下 2u[n] 的响应 linearity_test = []; % TODO 执行线性度检验计算 %% 任务四:稳定性与初始条件 y_stable1 = []; % TODO 计算稳定系统在一种初始条件下的响应 y_stable2 = []; % TODO 计算稳定系统在另一种初始条件下的响应 %% 绘图 figure('Name', '练习四:自定义函数分析'); subplot(2,2,1); stem(n, y_impulse); title('冲激响应 (a=1)'); grid on; subplot(2,2,2); stem(n, y_step); title('阶跃响应 (a=1)'); grid on; subplot(2,2,3); stem(n, linearity_test); title('线性度检验 (2y1 - y2)'); grid on; subplot(2,2,4); stem(n, y_stable1, 'b'); hold on; stem(n, y_stable2, 'r--'); legend('y[-1]=0', 'y[-1]=0.5'); title('初始条件影响 (a=0.5)'); grid on; %% ======================================== % 🔍 提交前自检 (请勿修改以下代码) % ======================================= vars_chk = {'y_impulse', 'y_step', 'linearity_test', 'y_stable1', 'y_stable2'}; miss = {}; for i = 1:length(vars_chk) if ~exist(vars_chk{i}, 'var') || isempty(eval(vars_chk{i})) miss{end+1} = vars_chk{i}; end end if ~isempty(miss) fprintf(2, '❌ 错误:以下变量未赋值或为空,无法通过批改:\n -> %s\n', strjoin(miss, ', ')); else fprintf('✅ 练习四变量检查通过。\n'); end
function y = diffeqn(a, x, yn1) %% diffeqn - 计算 y[n] = a*y[n-1] + x[n] % 输入: % a - 反馈系数 % x - 输入序列 x[n] % yn1 - 初始状态 y[-1] N = length(x); y = zeros(1, N); % TODO 使用 for 循环实现递归方程求解 % 提示:需要分别处理循环的第一次迭代 (i=1) 和后续迭代 (i>1) 的情况。 end
function dpzplot(b, a)
% dpzplot(b, a) 绘制离散时间系统函数的零极点图
la = length(a); lb = length(b);
if (la > lb), b = [b zeros(1, la-lb)]; elseif (lb > la), a = [a zeros(1, lb-la)]; end
ps = roots(a); zs = roots(b);
mx = max(abs([ps' zs' 0.95])) + 0.5;
axis([-mx mx -mx mx]); axis('equal'); hold on
w = [0 : 0.01 : 2*pi]; plot(cos(w), sin(w), '.');
plot([-mx mx], [0 0]); plot([0 0], [-mx mx]);
text(0.1, 1, 'Im', 'sc'); text(1, 0.1, 'Re', 'sc');
plot(real(ps), imag(ps), 'rx', 'markersize', 10);
plot(real(zs), imag(zs), 'ko', 'markersize', 10);
numz = sum(abs(zs) == 0); nump = sum(abs(ps) == 0);
if numz > 1, text(-0.1, -0.1, num2str(numz)); elseif nump > 1, text(-0.1, -0.1, num2str(nump)); end
hold off
end