Is it possible to model a transfer function using an IOBlock?
bryaan opened this issue · 1 comments
bryaan commented
hexaeder commented
No, currently it is state-space system only. You could use ControlSystems.jl
to get the ABCD system matrices from a transfer function object. Requires some additional code to digest those matrices though, I've used something like that for another project
function IOBlock(A::Matrix,B::Matrix,C::Matrix,D::Matrix,x,y,u; name=gensym(:LTI), warn=BlockSystems.WARN[], rem_eqs=Equation[])
@assert size(A)[1] == size(A)[2] == size(B)[1] == size(C)[2] == length(x)
@assert size(B)[2] == size(D)[2] == length(u)
@assert size(C)[1] == size(D)[1] == length(y)
iv_candidate = unique(vcat(Symbolics.arguments.(value.(x)),
Symbolics.arguments.(value.(y)),
Symbolics.arguments.(value.(u))))
@assert length(iv_candidate) == 1 && length(iv_candidate[begin]) == 1
iv = iv_candidate[1][1]
dt = Differential(iv)
eqs = vcat(dt.(x) .~ A*x + B*u,
y .~ C*x + D*u)
filter!(eq -> !isequal(eq.lhs, eq.rhs), eqs)
IOBlock(eqs, u, y; name, warn, rem_eqs)
end