编写程序求解系统的阶跃响应及其性能指标;计算系统的闭环根、阻尼比、无阻尼振荡频率;修改参数,实现与ζ=1和ζ=2的阶跃响应;修改参数,实现Wn1=1/2Wn和Wn2=2Wn的阶跃响应(Wn=√10)。
时间: 2024-03-16 18:46:01 浏览: 97
基于Matlab求阶跃响应的典型指标(源码).rar
好的,这里是用 MATLAB 编写的程序,可以求解系统的阶跃响应及其性能指标,计算系统的闭环根、阻尼比、无阻尼振荡频率,同时也可以修改参数,实现不同的阶跃响应。
```matlab
% 传递函数为 G(s) = 10 / (s^2 + 2s + 10)
% 定义传递函数
num = 10;
den = [1 2 10];
G = tf(num, den);
% 求解系统的阶跃响应
t = 0:0.01:10;
[y, t] = step(G, t);
% 绘制阶跃响应曲线
plot(t, y, 'LineWidth', 2);
grid on;
xlabel('时间 t (s)', 'FontSize', 12);
ylabel('响应 y(t)', 'FontSize', 12);
title('系统阶跃响应曲线', 'FontSize', 14);
% 计算系统的性能指标
% 峰值时间 tp
[peak, idx] = max(y);
tp = t(idx);
% 调整时间尺度,放大峰值处
if peak > 1
t = (t - tp) * 5;
else
t = (t - tp) * 50;
end
% 上升时间 tr
idx1 = find(y >= 0.1 * peak, 1, 'first');
tr = t(idx1);
% 调整时间尺度,放大上升时间段
t = t(idx1:end);
y = y(idx1:end);
% 调整峰值处的值
if peak > 1
peak = max(y);
end
% 调整振荡周期
if peak < 1
idx2 = find(y >= 0.95 * peak, 1, 'first');
else
idx2 = find(y <= 0.95 * peak, 1, 'first');
end
T = 2 * (t(idx2) - tp);
% 调整时间尺度,放大振荡周期
t2 = t(1:idx2);
y2 = y(1:idx2);
if peak > 1
y2 = peak - y2;
end
% 调整峰值处的值
if peak > 1
peak = max(y2);
end
% 绘制上升时间和峰值
hold on;
plot([0 tr], [0.1 * peak 0.1 * peak], 'r--', 'LineWidth', 1.5);
plot([tr tr], [0 1.1 * peak], 'r--', 'LineWidth', 1.5);
plot([0 tp], [peak peak], 'g--', 'LineWidth', 1.5);
plot([tp tp], [0 peak], 'g--', 'LineWidth', 1.5);
text(tr, 0.1 * peak, ['t_r = ' num2str(tr, '%.2f') 's'], 'FontSize', 12, 'HorizontalAlignment', 'center');
text(tp, peak, ['P = ' num2str(peak, '%.2f')], 'FontSize', 12, 'HorizontalAlignment', 'center');
text(tp, 0, ['t_p = ' num2str(tp, '%.2f') 's'], 'FontSize', 12, 'HorizontalAlignment', 'center');
% 计算系统的闭环根、阻尼比、无阻尼振荡频率
% 闭环根
r = roots(den);
% 阻尼比
zeta = abs(real(r(1))) / sqrt(real(r(1))^2 + imag(r(1))^2);
% 无阻尼振荡频率
wn = abs(imag(r(1)));
% 输出性能指标和系统参数
disp(['峰值时间 tp = ' num2str(tp) 's']);
disp(['上升时间 tr = ' num2str(tr) 's']);
disp(['峰值 P = ' num2str(peak)]);
disp(['振荡周期 T = ' num2str(T) 's']);
disp(['闭环根 r = ' num2str(r(1)) ' +/- j' num2str(abs(r(2)))]);
disp(['阻尼比 ζ = ' num2str(zeta)]);
disp(['无阻尼振荡频率 ω_n = ' num2str(wn) ' rad/s']);
% 修改参数,实现与 ζ=1 的阶跃响应
% 定义新的传递函数
num1 = 10;
den1 = [1 2 1];
G1 = tf(num1, den1);
% 求解系统的阶跃响应
[y1, t1] = step(G1, t);
% 绘制阶跃响应曲线
figure;
plot(t1, y1, 'LineWidth', 2);
grid on;
xlabel('时间 t (s)', 'FontSize', 12);
ylabel('响应 y(t)', 'FontSize', 12);
title('系统阶跃响应曲线 (ζ=1)', 'FontSize', 14);
% 修改参数,实现与 ζ=2 的阶跃响应
% 定义新的传递函数
num2 = 10;
den2 = [1 4 10];
G2 = tf(num2, den2);
% 求解系统的阶跃响应
[y2, t2] = step(G2, t);
% 绘制阶跃响应曲线
figure;
plot(t2, y2, 'LineWidth', 2);
grid on;
xlabel('时间 t (s)', 'FontSize', 12);
ylabel('响应 y(t)', 'FontSize', 12);
title('系统阶跃响应曲线 (ζ=2)', 'FontSize', 14);
% 修改参数,实现 Wn1=1/2Wn 和 Wn2=2Wn 的阶跃响应
% 定义新的传递函数
num3 = 10;
den3 = [1 1 10];
G3 = tf(num3, den3);
num4 = 10;
den4 = [1 4.4721 10];
G4 = tf(num4, den4);
% 求解系统的阶跃响应
[y3, t3] = step(G3, t);
[y4, t4] = step(G4, t);
% 绘制阶跃响应曲线
figure;
plot(t3, y3, 'LineWidth', 2);
hold on;
plot(t4, y4, 'LineWidth', 2);
grid on;
xlabel('时间 t (s)', 'FontSize', 12);
ylabel('响应 y(t)', 'FontSize', 12);
title('系统阶跃响应曲线 (Wn1=1/2Wn, Wn2=2Wn)', 'FontSize', 14);
legend('Wn1=1/2Wn', 'Wn2=2Wn');
```
运行程序后,会生成三幅图像,分别显示系统的阶跃响应曲线、ζ=1 的阶跃响应曲线和 ζ=2 的阶跃响应曲线,以及 Wn1=1/2Wn 和 Wn2=2Wn 的阶跃响应曲线。同时,程序还会输出系统的性能指标和系统参数。
阅读全文