Engee 文档
Notebook

多个模型的时域响应

本例演示了如何使用step 在一张图上比较多个模型的阶跃响应。该示例比较了带有闭环和两个不同 PI 控制器的非受控对象的阶跃响应。您可以将类似方法用于其他响应命令,如impulselsim ,以获得多个模型的响应图。

在此示例中,您可以获取两个需要比较其时间特性的模型,并将它们绘制在一起。例如,您可以比较三阶系统 G 和带有控制器 C1 的闭环系统 G 的响应。

In [ ]:
Pkg.add(["ControlSystems"])
In [ ]:
import Pkg; 
Pkg.add("ControlSystems")
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using ControlSystems
In [ ]:
G = zpk([], [-5, -5, -10], 100)
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoZpk{Int64, Int64}}
             1
100----------------------
   (s + 5)(s + 5)(s + 10)

Continuous-time transfer function model
In [ ]:
C1 = pid(0, 4.4; form=:parallel)
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}}
4.4
----
1.0s

Continuous-time transfer function model
In [ ]:
CL1 = feedback(G*C1)
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoZpk{Float64, ComplexF64}}
                                                                  1.0
440.00000000000006----------------------------------------------------------------------------------------------------
                  (1.0s^2 + 18.182441807113936s + 86.88838599897278)(1.0s^2 + 1.8175581928860574s + 5.063967927833328)

Continuous-time transfer function model

函数step 将系统描述作为输入,并生成一个ControlSystemsBase.SimResult 类型的对象作为输出。如果将此对象传递给函数plot ,将绘制出瞬态图。

In [ ]:
step(CL1)
Out[0]:
ControlSystemsBase.SimResult{Matrix{Float64}, StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Matrix{Float64}, Matrix{Float64}, StateSpace{Continuous, Float64}}([0.0 1.1101474535917157e-7 … 0.9999999999999879 0.9999999999999879], 0.0:0.0089:55.9988, [0.0 6.459039729988163e-8 … 0.5818181818181747 0.5818181818181747; 0.0 1.4386184767184292e-5 … 5.620737843258297e-15 5.620604012052631e-15; 0.0 0.000597208113779645 … -1.6263032587282567e-18 -2.0599841277224584e-18; 0.0 0.016278755147748875 … -6.938893903907228e-18 -6.938893903907228e-18], [1.0 1.0 … 1.0 1.0], StateSpace{Continuous, Float64}
A = 
  0.0                  2.0                   0.0                  0.0
  0.0                  0.0                   8.0                  0.0
  0.0                  0.0                   0.0                  8.0
 -3.4375000000000044  -3.9062500000000004  -15.625000000000002  -19.999999999999993
B = 
 0.0
 0.0
 0.0
 2.0
C = 
 1.7187500000000002  0.0  0.0  0.0
D = 
 0.0

Continuous-time state-space model)
In [ ]:
plot([step(G), step(CL1)], label=["G" "CL1"])
xlims!(0,7)
hline!([1], linecolor=:black, style=:dash, label=:false)
Out[0]:

如果将多个对象作为plot 的输入参数传送给函数step,则单个图形将显示指定模型的响应。如果未指定绘图的时间范围,step 将尝试选择一个能说明模型动态的时间范围。

将带有反馈的模型阶跃响应与另一个控制器的响应进行比较。为每个响应指定颜色和绘图样式。

In [ ]:
C2 = pid(2.9, 7.1; form=:parallel)
CL2 = feedback(G * C2)

plot(step(G,7), label="G", color=:blue)
plot!(step(CL1,7), label="CL1", color=:green)
plot!(step(CL2,7), label="CL2", color=:red)

hline!([0.4, 1], linestyle=:dash, color=:black, label=:false)
Out[0]:

您可以通过更改参数linestylecolor 为每个瞬态指定自己的颜色和图表样式。