使用 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 = 0
的 dy/dt = 0
开始,而对于这种闭环系统,这是不可能的。正确的答案是 tf
(dy/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%
看看下面这个简单的系统
其中 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 = 0
的 dy/dt = 0
开始,而对于这种闭环系统,这是不可能的。正确的答案是 tf
(dy/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%