动力系统的线性化¶
在本演示中,我们将从动态模型的输入输出中识别出一个 LTI 系统(线性和静态)。这样,我们就可以对模型的选定部分进行线性化,然后将其作为常规线性静态系统处理。
模型描述¶
我们的线性化对象是一个由两个 RC 滤波器组成的模型,周期为 0.01 秒的矩形脉冲将通过这两个滤波器。
每个滤波器由一个 10 欧姆的电阻和一个 1e-04 F 的电容器组成。输入信号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"] )
可以预计,非周期性链路可能不足以准确近似系统的行为。
线性化过程¶
我们将使用ControlSystemIdentification
库中的函数subspaceid
进行线性化处理:
using ControlSystems, ControlSystemIdentification
默认情况下,subspaceid
会以如下形式返回系统的状态空间:
$$\begin{aligned} x^+ &= Ax + Bu + Ke\\ y &= Cx + Du + e \end{aligned}$$
软件包中还有十多个用于系统线性化的函数,但如果系统是以开环形式定义的,建议首先使用这个函数。对于闭环系统,我们建议使用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 或霍德图之后再做出这样的判断。
我们可以用一个简短的函数来绘制一个系统的线性振幅-相位-频率响应的简单曲线图:
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 度,但超过 360 度时,LAFCC 值会急剧下降。
结论¶
通过这种线性化方法,您可以从各种动力系统或简单的表格数据中建立 LTI 模型。简化后的动力系统可以放在一个块Transfer Function
中,并用作快速计算的替代模型,例如,可以对动力系统的稳定性进行第一近似研究。