using ControlSystems
状態空間モデルの記述は,ssを用います
A = [0 1; -1 -1]
B = [0; 1]
C = [1 0]
D = 0
P = ss(A, B, C, D)
StateSpace{Continuous, Int64} A = 0 1 -1 -1 B = 0 1 C = 1 0 D = 0 Continuous-time state-space model
A = [1 1 2; 2 1 1; 3 4 5]
B = [2; 0; 1]
C = [1 1 0]
D = 0
P = ss(A, B, C, D)
StateSpace{Continuous, Int64} A = 1 1 2 2 1 1 3 4 5 B = 2 0 1 C = 1 1 0 D = 0 Continuous-time state-space model
println("A=", P.A)
println("B=", P.B)
println("C=", P.C)
println("D=", P.D)
A=[1 1 2; 2 1 1; 3 4 5] B=[2; 0; 1;;] C=[1 1 0] D=[0;;]
伝達関数モデルの記述は,tfを用います
Np = [0, 1] # 伝達関数の分子多項式の係数 (0*s + 1)
Dp = [1, 2, 3] # 伝達関数の分母多項式の係数 (1*s^2 + 2*s + 3)
P = tf(Np, Dp)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ------------ s^2 + 2s + 3 Continuous-time transfer function model
P = tf([0, 1], [1, 2, 3])
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ------------ s^2 + 2s + 3 Continuous-time transfer function model
ラプラス演算子を定義して記述することもできます
s = tf("s")
P = 1/(s^2+2s+3)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ------------ s^2 + 2s + 3 Continuous-time transfer function model
P = tf([1, 2], [1, 5, 3, 4])
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 2 ------------------- s^3 + 5s^2 + 3s + 4 Continuous-time transfer function model
分母多項式の展開
using Symbolics
@variables s
expand( (s+1)*(s+2)^2 )
P = tf([1, 3],[1, 5, 8, 4])
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 3 ------------------- s^3 + 5s^2 + 8s + 4 Continuous-time transfer function model
P1 = tf([1, 3], [0, 1])
P2 = tf([0, 1], [1, 1])
P3 = tf([0, 1], [1, 2])
P = P1 * P2 * P3^2
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 3 ------------------- s^3 + 5s^2 + 8s + 4 Continuous-time transfer function model
s = tf("s")
P = 1/(s+1)/(s+2)^2
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ------------------- s^3 + 5s^2 + 8s + 4 Continuous-time transfer function model
den(P)
1×1 Matrix{Vector{Int64}}: [1, 5, 8, 4]
num(P)
1×1 Matrix{Vector{Int64}}: [1]
P = tf([0, 1], [1, 1, 1])
Pss = ss(P) # 伝達関数モデルから状態空間モデルへの変換
println(Pss)
Ptf = tf(Pss) # 状態空間モデルから伝達関数モデルへの変換
println(Ptf)
StateSpace{Continuous, Float64} A = 0.0 1.0 -1.0 -1.0 B = 0.0 1.0 C = 1.0 0.0 D = 0.0 Continuous-time state-space model TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}} 1.0 ------------------- 1.0s^2 + 1.0s + 1.0 Continuous-time transfer function model
S1 = tf( [0, 1], [1, 1])
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ----- s + 1 Continuous-time transfer function model
S2 = tf( [1, 1], [1, 1, 1])
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 1 ----------- s^2 + s + 1 Continuous-time transfer function model
S = S2 * S1;
println(S)
S = series(S1, S2);
println(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 1 ------------------- s^3 + 2s^2 + 2s + 1 Continuous-time transfer function model TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 1 ------------------- s^3 + 2s^2 + 2s + 1 Continuous-time transfer function model
分母分子の共通因子 s+1 が約分されない この場合は,minreal を使う
minreal(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}} 1.0 ------------------------------------------------- 1.0s^2 + 1.0000000000000004s + 0.9999999999999992 Continuous-time transfer function model
S = S1 + S2;
println(S)
S = parallel(S1, S2)
println(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 2s^2 + 3s + 2 ------------------- s^3 + 2s^2 + 2s + 1 Continuous-time transfer function model TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 2s^2 + 3s + 2 ------------------- s^3 + 2s^2 + 2s + 1 Continuous-time transfer function model
S = S1*S2 / (1 + S1*S2)
println(S)
S = feedback(S1*S2, 1)
println(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s^4 + 3s^3 + 4s^2 + 3s + 1 ------------------------------------------ s^6 + 4s^5 + 9s^4 + 13s^3 + 12s^2 + 7s + 2 Continuous-time transfer function model TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 1 ------------------- s^3 + 2s^2 + 3s + 2 Continuous-time transfer function model
minreal(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}} 1.0 ------------------------------------------------- 1.0s^2 + 0.9999999999999993s + 2.0000000000000018 Continuous-time transfer function model
S1 = tf(1, [1, 1])
S2 = tf(1, [1, 2])
S3 = tf([3, 1], [1, 0])
S4 = tf([2, 0], [0, 1])
S12 = feedback(S1, S2)
S123 = series(S12, S3)
S = feedback(S123, S4)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 3s^2 + 7s + 2 ----------------- 7s^3 + 17s^2 + 7s Continuous-time transfer function model
S1 = tf([1, 1], [0, 1])
S2 = tf([0, 1], [1, 1])
S = series(S1, S2)
minreal(S)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}} 1.0 --- 1.0 Continuous-time transfer function model
print(S2)
ss(S2)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} 1 ----- s + 1 Continuous-time transfer function model
StateSpace{Continuous, Float64} A = -1.0 B = 1.0 C = 1.0 D = 0.0 Continuous-time state-space model
print(S1)
ss(S1)
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}} s + 1 ----- 1 Continuous-time transfer function model
System is improper, a state-space representation is impossible Stacktrace: [1] error(s::String) @ Base ./error.jl:35 [2] convert(::Type{StateSpace{Continuous, Float64}}, G::TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}}; balance::Bool) @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/conversion.jl:92 [3] convert @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/conversion.jl:90 [inlined] [4] #convert#153 @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/conversion.jl:86 [inlined] [5] convert @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/conversion.jl:84 [inlined] [6] StateSpace @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/StateSpace.jl:127 [inlined] [7] ss(args::TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}}) @ ControlSystemsBase ~/.julia/packages/ControlSystemsBase/4kZY4/src/types/StateSpace.jl:144 [8] top-level scope @ In[26]:2