@@ -11,7 +11,13 @@ eqs = [u ~ kp * (r - y)
11
11
y ~ x]
12
12
13
13
@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
15
21
16
22
# #
17
23
```
@@ -27,15 +33,15 @@ linearize(sys, [r], [y])
27
33
28
34
function plant (; name)
29
35
@variables x (t) = 1
30
- @variables u (t)= 0 [input = true ] y (t)= 0 [output = true ]
36
+ @variables u (t)= 0 y (t)= 0
31
37
D = Differential (t)
32
38
eqs = [D (x) ~ - x + u
33
39
y ~ x]
34
40
ODESystem (eqs, t; name = name)
35
41
end
36
42
37
43
function filt_ (; name)
38
- @variables x (t)= 0 y (t)= 0 [output = true ]
44
+ @variables x (t)= 0 y (t)= 0
39
45
@variables u (t)= 0 [input = true ]
40
46
D = Differential (t)
41
47
eqs = [D (x) ~ - 2 * x + u
@@ -44,7 +50,7 @@ function filt_(; name)
44
50
end
45
51
46
52
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
48
54
@parameters kp = kp
49
55
eqs = [
50
56
u ~ kp * (r - y),
@@ -62,23 +68,38 @@ connections = [f.y ~ c.r # filtered reference to controller reference
62
68
63
69
@named cl = ODESystem (connections, t, systems = [f, c, p])
64
70
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
66
79
67
80
# #
68
81
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
77
86
@named pid = LimPID (; k, Ti, Td, Nd)
78
- ModelingToolkit. unbound_inputs (pid)
79
87
80
88
@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