Skip to content

Commit 33c492a

Browse files
committed
add tests for linearize
1 parent 7231222 commit 33c492a

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

test/linearize.jl

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ eqs = [u ~ kp * (r - y)
1111
y ~ x]
1212

1313
@named sys = ODESystem(eqs, t)
14-
linearize(sys, [r], [y])
14+
15+
lsys, ssys = linearize(sys, [r], [y])
16+
17+
@test lsys.A[] == -2
18+
@test lsys.B[] == 1
19+
@test lsys.C[] == 1
20+
@test lsys.D[] == 0
1521

1622
##
1723
```
@@ -27,15 +33,15 @@ linearize(sys, [r], [y])
2733

2834
function plant(; name)
2935
@variables x(t) = 1
30-
@variables u(t)=0 [input = true] y(t)=0 [output = true]
36+
@variables u(t)=0 y(t)=0
3137
D = Differential(t)
3238
eqs = [D(x) ~ -x + u
3339
y ~ x]
3440
ODESystem(eqs, t; name = name)
3541
end
3642

3743
function filt_(; name)
38-
@variables x(t)=0 y(t)=0 [output = true]
44+
@variables x(t)=0 y(t)=0
3945
@variables u(t)=0 [input = true]
4046
D = Differential(t)
4147
eqs = [D(x) ~ -2 * x + u
@@ -44,7 +50,7 @@ function filt_(; name)
4450
end
4551

4652
function controller(kp; name)
47-
@variables y(t)=0 r(t)=0 [input = true] u(t)=0
53+
@variables y(t)=0 r(t)=0 u(t)=0
4854
@parameters kp = kp
4955
eqs = [
5056
u ~ kp * (r - y),
@@ -62,23 +68,38 @@ connections = [f.y ~ c.r # filtered reference to controller reference
6268

6369
@named cl = ODESystem(connections, t, systems = [f, c, p])
6470

65-
lin, xs = linearize(cl, cl.f.u, cl.p.x)
71+
lsys, ssys = linearize(cl, [f.u], [p.x])
72+
desired_order = [f.x, p.x]
73+
lsys = ModelingToolkit.reorder_states(lsys, states(ssys), desired_order)
74+
75+
@test lsys.A == [-2 0; 1 -2]
76+
@test lsys.B == [1; 0;;]
77+
@test lsys.C == [0 1]
78+
@test lsys.D[] == 0
6679

6780
##
6881
using ModelingToolkitStandardLibrary.Blocks: LimPID
69-
#using ControlSystems
70-
k = 400;
71-
Ti = 0.5;
72-
Td = 1;
73-
Nd = 10;
74-
#s = tf("s")
75-
#expected_result_r = k*(1 + 1/(s*Ti)) |> ss
76-
#expected_result_y = k*(1 + 1/(s*Ti) - s*Td / (1 + s*Td/N)) |> ss
82+
k = 400
83+
Ti = 0.5
84+
Td = 1
85+
Nd = 10
7786
@named pid = LimPID(; k, Ti, Td, Nd)
78-
ModelingToolkit.unbound_inputs(pid)
7987

8088
@unpack reference, measurement, ctr_output = pid
81-
lin = linearize(pid, [reference.u, measurement.u], [ctr_output.u])
82-
lin, lin_fun = linearize(pid, [reference.u, measurement.u], [ctr_output.u]);
83-
prob = ODEProblem(lin, [], (0.0, 1.0))
84-
lin_fun(prob.u0, prob.p, 0.0)
89+
lsys, ssys = linearize(pid, [reference.u, measurement.u], [ctr_output.u])
90+
@unpack int, der = pid
91+
desired_order = [int.x, der.x]
92+
lsys = ModelingToolkit.reorder_states(lsys, states(ssys), desired_order)
93+
94+
@test lsys.A == [0 0; 0 -10]
95+
@test lsys.B == [2 -2; 10 -10]
96+
@test lsys.C == [400 -4000]
97+
@test lsys.D == [4400 -4400]
98+
99+
# Test with the reverse desired state order as well to verify that similarity transform and reoreder_states really works
100+
lsys = ModelingToolkit.reorder_states(lsys, states(ssys), reverse(desired_order))
101+
102+
@test lsys.A == [-10 0; 0 0]
103+
@test lsys.B == [10 -10; 2 -2]
104+
@test lsys.C == [-4000 400]
105+
@test lsys.D == [4400 -4400]

0 commit comments

Comments
 (0)