使用 Simulink 和 tf() 时同一系统的不同结果

Different result for same system with Simulink and tf()

看看下面这个简单的系统

其中 Kp=7130 和 Kd=59.3880。这些值的设计使系统应表现出 20% 的过冲和小于 0.01 的稳态误差。 Simulink 模型产生正确的结果,而 tf() 没有。这是模型

其结果是

现在与 tf 实现相同的系统如下:

clear all
clc
kp=7130;
kd=59.3880;
num=[kd kp];
den=[1 18+kd 72+kp];
F=tf(num,den);
step(F)
stepinfo(F)

产生不同的过冲。

对于为什么出现不一致的响应有什么建议吗?我是否必须将系统设置为特定形式才能使用 tf()

错误正在考虑更正 Simulink 实现的响应。 step 给出了正确的答案。

一个纯导数在Simulink中不存在,如果尝试使用[kd, kp]作为分子和[1]作为分母的传递函数块,你会得到一个错误。

当您使用固定步长积分器时,导数是一个带有极点的滤波器,具有可变步长的行为is quite uncertain, and should be avoided。您使用控制器获得的闭环系统具有相对度数 1(1 个零点,2 个极点)。

如果您查看响应,Simulink 实现以 t = 0dy/dt = 0 开始,而对于这种闭环系统,这是不可能的。正确的答案是 tfdy/dt > 0 对应 t = 0)。

你的闭环传递函数是正确的,你应该认为它的响应是正确的。尝试使用 Simulink 模拟图像中的传递函数。您将看到与 step 命令相同的响应。

让我们用一些代码来测试一下:

图中我们有三个测试:

  • 解析传递函数
  • 导数的近似值
  • 用你的导数块模拟

尝试实现它并测试 tf s / (0.001 s + 1)0.001 的值,你会看到如果将系数减小到 0,Transfer Fnc2 的响应 将逼近解析闭环 tf 中的一个(在某一点上,Simulink 将不会计算导数并将停止仿真)。 最后,Simulink 中的解析传递函数给出了与 step 命令相同的响应。

在评论中你说你评估了逆拉普拉斯,所以让我们也检查一下逆拉普拉斯。符号工具箱将为我们做到这一点:

syms s kp kd t

Plant = 1/(s^2 + 18 * s + 72)
Reg = kp + kd * s

L = Plant * Reg
ClosedLoop = simplify(L / (1 + L))
Step = 1/s

ResponseStep = simplify(ilaplace(ClosedLoop * Step))

ResponseStep_f = matlabFunction(simplify( ...
  subs( ...
    subs(ResponseStep, kp, 7130), kd, 59.3880)));

t_ = linspace(0, 0.15, 200);
y_ = arrayfun(t_closedLoop_d, t_);
plot(t_, y_);

如您所见,逆拉普拉斯显示超过 25% 的超调。

编辑:计算您在 this link

计算的逆拉普拉斯

再次超调为 25.9%