线性动力系统的识别
在本演示中,我们通过动态模型的输入和输出来识别LTI系统(线性和静态)。 这将允许我们获得在非线性模型计算期间收集的选定数据段的线性模型,然后像使用常规线性静止系统一样使用它。
模型描述
我们的识别对象将是一个由两个RC滤波器组成的模型,周期为0.01s的矩形脉冲将通过该模型。
每个滤波器由一个10欧姆电阻和一个1e-04f电容组成。 的输入信号 u 它来自街区 Pulse Generator,和输出信号 y 是级联的最后一个电容处的电压,由电压表测量 Voltage Sensor.
Pkg.add(["ControlSystemIdentification", "ControlSystems"])
gr()
modelName = "rc_circuit"
if !(modelName in [m.name for m in engee.get_all_models()]) engee.load( "$(@__DIR__)/$(modelName).engee"); end;
data = engee.run( modelName )
如果我们绘制变量的图形 u 和 y 然后我们可以估计滤波器链对输入信号的修改程度。 我们将尝试使用线性模型近似描述这种行为。
t,u,y = collect(data["u"]).time, collect(data["u"]).value, collect(data["y"]).value
plot( t, [u y], label=["u" "y"] )
可以预期,非周期链路可能不足以精确地近似系统的行为。
识别过程
我们将使用函数执行识别 subspaceid 从图书馆 ControlSystemIdentification:
using ControlSystems, ControlSystemIdentification
默认情况下 subspaceid 返回以下形式的状态空间中的系统:
软件包中还有十多个其他系统识别功能可用,但如果系统以开放形式配置,建议先使用这一个。 对于封闭式系统,建议使用 newpem.
# Получим частоту дискретизации системы из вектора времени
Ts = t[2] - t[1]
# Проведем идентификацию системы
sys = subspaceid( iddata( y, u, Ts ));
阶跃响应图将允许我们评估结果模型的质量(我们专门将脉冲发生器幅度设置为1,否则需要归一化)。
plot( t, y, label="Исходный сигнал" )
plot!( step( sys, 0.03 ), label="Реакция системы на ступеньку" )
可以看出,对单个步骤的反应非常准确地重复了模拟的结果-初始系统对矩形脉冲的反应。 如果需要,我们可以使用第二个参数 subspaceid 限制线性系统的程度,并获得更简单,更不精确的近似值。
研究系统的稳定性
当然,观察到的系统是稳定的。 但是在一个更复杂的系统的情况下,我们可以在分析响应,AFC或hodographs之后做出这样的陈述。
系统的线性幅度-相位-频率响应的简单图可以使用短函数构建:
bodeplot( sys )
但是下面的代码允许您对图形显示的性质进行更多的控制。:
mag, phase, w = bode( sys )
plot( [w./(2pi)],
[20*log10.( mag[:]) phase[:]], xscale=:log10, xticks=exp10.(1:8),
linecolor=[1 2], layout=(2,1))
vline!( [1/(2Ts) 1/(2Ts)] )
plot!( title=["ЛАФЧХ системы" ""], xlabel=["" "Частота (Гц)"] )
plot!( ylabel=["Амплитуда (дБ)" "Фаза (град)"], leg=:false )
它们上的红色垂直线表示等于采样频率一半的频率。 相位图被限制在360度,但随后LCF的值急剧下降。
结论
所示的识别线性模型的方法允许您基于广泛的动态系统或简单的表格数据构建LTI模型。 由此产生的简化的动态系统可以放置在一个块 Transfer Function 并将其用作替代模型,该模型可以快速计算,例如,允许您在第一个近似值中研究动态系统的稳定性。



