hexaeder/BlockSystems.jl

Is it possible to model a transfer function using an IOBlock?

bryaan opened this issue · 1 comments

Newbie to this library. I'm wondering if there's a way to define the transfer function of a second order harmonic oscillator using this library?

image

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