forked from SciML/ModelingToolkit.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelectrical_components.jl
84 lines (76 loc) · 1.83 KB
/
electrical_components.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using Test
using ModelingToolkit, OrdinaryDiffEq
# Basic electric components
const t = Sym{ModelingToolkit.Parameter{Real}}(:t)
function Pin(;name)
@variables v(t) i(t)
ODESystem(Equation[], t, [v, i], [], name=name, defaults=[v=>1.0, i=>1.0])
end
function Ground(;name)
@named g = Pin()
eqs = [g.v ~ 0]
ODESystem(eqs, t, [], [], systems=[g], name=name)
end
function ConstantVoltage(;name, V = 1.0)
val = V
@named p = Pin()
@named n = Pin()
@parameters V
eqs = [
V ~ p.v - n.v
0 ~ p.i + n.i
]
ODESystem(eqs, t, [], [V], systems=[p, n], defaults=Dict(V => val), name=name)
end
function Resistor(;name, R = 1.0)
val = R
@named p = Pin()
@named n = Pin()
@variables v(t)
@parameters R
eqs = [
v ~ p.v - n.v
0 ~ p.i + n.i
v ~ p.i * R
]
ODESystem(eqs, t, [v], [R], systems=[p, n], defaults=Dict(R => val), name=name)
end
function Capacitor(;name, C = 1.0)
val = C
@named p = Pin()
@named n = Pin()
@variables v(t)
@parameters C
D = Differential(t)
eqs = [
v ~ p.v - n.v
0 ~ p.i + n.i
D(v) ~ p.i / C
]
ODESystem(eqs, t, [v], [C], systems=[p, n], defaults=Dict(C => val), name=name)
end
function Inductor(; name, L = 1.0)
val = L
@named p = Pin()
@named n = Pin()
@variables v(t) i(t)
@parameters L
D = Differential(t)
eqs = [
v ~ p.v - n.v
0 ~ p.i + n.i
i ~ p.i
D(i) ~ v / L
]
ODESystem(eqs, t, [v, i], [L], systems=[p, n], defaults=Dict(L => val), name=name)
end
function connect_pins(ps...)
eqs = [
0 ~ sum(p->p.i, ps) # KCL
]
# KVL
for i in 1:length(ps)-1
push!(eqs, ps[i].v ~ ps[i+1].v)
end
return eqs
end