maltee1
1
I’m trying to get started using modeling toolkit, but I’m hitting an ArgumentError that I can’t interpret. This is my code:
using Plots; pyplot()
using ControlSystemsBase, RobustAndOptimalControl, LinearAlgebra
using ModelingToolkit
@parameters Li::Real Ri::Real Lg::Real Rg::Real ωn::Real Vn::Real kp::Real kq::Real ωf::Real
j=1im
Ap = -(Ri+Rg)/(Li+Lg)-j*ωn
A1 = (Rg*Li-Ri*Lg)/(Lg+Li)
A2 = [Lg/(Lg+Li) Li/(Lg+Li)]
A3 = 1/(Li+Lg)
kp = 0.2*2π/1000
kq = 20/1000
@variables t P(t)::Real=0 Q(t)::Real=0 Pf(t)::Real=0 Qf(t)::Real=0 vo(t)::Complex=0 ig(t)::Complex=0 vi(t)::Complex=0 vamp(t)::Real=0 theta(t)::Real=0 ω(t)::Real=0 vg(t)::Complex=0
D = Differential(t)
eqs = [P ~ 3/2*real(vo*conj(ig)) # P calc
D(Pf) ~ ωf*(P-Pf) # low pass filter
Q ~ 3/2*imag(vo*conj(ig)) # Q calc
D(Qf) ~ ωf*(Q-Qf) # low pass filter
vi ~ vamp*exp(j*theta) # output voltage generation
D(theta) ~ ω # angle integration
vo ~ A1*ig+(A2*[vi; vg])[1] # output admittance
D(ig) ~ Ap*ig+A3*vi-A3*vg # output admittance
vamp ~ Vn-kq*Qf # Q-droop
ω ~ -kp*Pf] # P-droop
@named sys = ODESystem(eqs, t, [Pf Qf ig theta], [Li Ri Lg Rg ωn Vn kp kq ωf], tspan = [0,1])
Complex variables should be supported, right?
johhell
2
in the past I had a similar problem.
Below my approach (not perfect, but sufficient for me):
- substitute
real(cVAR)
and imag(cVAR)
by cVAR_re
and cVAR_im
using Plots; pyplot()
using ControlSystemsBase, RobustAndOptimalControl, LinearAlgebra
using ModelingToolkit
@parameters Li::Real Ri::Real Lg::Real Rg::Real ωn::Real Vn::Real kp::Real kq::Real ωf::Real
j=1im
function NewVars(eqName::String, CCX::Vector{Complex{Num}})::Tuple{Expr, Expr}
vari::String = "newVariables = @variables "
substi::String = ""
for cx in CCX
stcx = string(cx)[1:end-3] # without '(t)'
vari = string(vari,stcx*"₋re(t) ",stcx*"₋im(t) ")
substi = string(substi,"$eqName = substitute($eqName,(real($stcx)=>$(stcx)₋re)); ")
substi = string(substi,"$eqName = substitute($eqName,(imag($stcx)=>$(stcx)₋im)); ")
end
return (Meta.parse(vari), Meta.parse(substi))
end
Ap = -(Ri+Rg)/(Li+Lg)-j*ωn
A1 = (Rg*Li-Ri*Lg)/(Lg+Li)
A2 = [Lg/(Lg+Li) Li/(Lg+Li)]
A3 = 1/(Li+Lg)
kp = 0.2*2π/1000
kq = 20/1000
@variables begin
t
P(t)::Real=0
Q(t)::Real=0
Pf(t)::Real=0
Qf(t)::Real=0
vamp(t)::Real=0
theta(t)::Real=0
ω(t)::Real=0
end
CX = @variables begin # Complex VARS
vo(t)::Complex
ig(t)::Complex
vi(t)::Complex
vg(t)::Complex
end
D = Differential(t)
eqs = [P ~ 3/2*real(vo*conj(ig)) # P calc
D(Pf) ~ ωf*(P-Pf) # low pass filter
Q ~ 3/2*imag(vo*conj(ig)) # Q calc
D(Qf) ~ ωf*(Q-Qf) # low pass filter
vi ~ vamp*exp(j*theta) # output voltage generation
D(theta) ~ ω # angle integration
vo ~ A1*ig+(A2*[vi; vg])[1] # output admittance
D(ig) ~ Ap*ig+A3*vi-A3*vg # output admittance
vamp ~ Vn-kq*Qf # Q-droop
ω ~ -kp*Pf] # P-droop
eqs1=deepcopy(eqs)
(Bvaria, Bsubst) = NewVars("eqs1",CX)
eval(Bvaria) # create new variables
eval(Bsubst) # substitute
# @named sys = ODESystem(eqs, t, [Pf Qf ig theta], [Li Ri Lg Rg ωn Vn kp kq ωf], tspan = [0,1])
@named model = ODESystem(eqs1, t)
# sys = structural_simplify(model)
Check your system again: Model model with 13 equations, States (15):