Matlab 使用Simulink和tf()对同一系统的不同结果
看看下面的简单系统 其中Kp=7130和Kd=59.3880。这些值的设计应确保系统的超调量为20%,稳态误差小于0.01。Simulink模型会产生正确的结果,而Matlab 使用Simulink和tf()对同一系统的不同结果,matlab,controls,system,simulink,Matlab,Controls,System,Simulink,看看下面的简单系统 其中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()
不会。这就是模型
其结果是
现在使用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实现的正确响应<代码>步骤为您提供了正确的响应
Simulink中不存在纯导数,如果尝试使用[kd,kp]
作为分子,[1]
作为分母的传递函数块,则会出现错误
使用固定步长积分器时,导数是一个带极点的滤波器,即具有可变步长的行为。控制器的闭环系统的相对阶数为1(1个零,2个极点)
如果查看响应,对于t=0
,Simulink实现从dy/dt=0
开始,这在这种闭环系统中是不可能的。正确的响应是tf
(dy/dt>0
fort=0
)
你的闭环传递函数是正确的,你应该考虑它的响应是正确的。尝试用Simulink模拟图像中的传递函数。您将看到与
步骤
命令相同的响应
让我们用一些代码来测试这一点:
在图中,我们有三个测试:
- 解析传递函数
- 导数的近似
- 使用导数块进行模拟
s/(0.001 s+1)
中的0.001
值,您将看到,如果将系数减小到0,传递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%的超调量
编辑:计算在处计算的逆拉普拉斯
同样,超调量为25.9%谢谢你的回答
tf
产生不正确的超调量(即27%),但kd和kp的设计应产生20%的超调量。我已经通过确定拉普拉斯逆变换对其进行了双重检查。另外,您认为如何实现非因果控制器?是的,我确定。看一看反向拉普拉斯在你张贴的链接有相同的超调!25.9%,如答案最后部分所示(这与步骤(tf([…
)预测的超调量完全相同)