SquareTest
Connects a square wave generator to an integrator to test integration of a periodic signal.
This component demonstrates the integration of a square wave over time. It connects a Square signal generator (with amplitude 1, frequency 2 Hz, start time 0.5 seconds, and offset 0.7) to an Integrator block. The square wave alternates between values of 0.7 and 1.7, and when integrated, should reach approximately 3.537 at t=5 seconds.
Usage
SquareTest()
Behavior
Source
dyad
# Connects a square wave generator to an integrator to test integration of a periodic signal.
#
# This component demonstrates the integration of a square wave over time. It connects a Square
# signal generator (with amplitude 1, frequency 2 Hz, start time 0.5 seconds, and offset 0.7)
# to an Integrator block. The square wave alternates between values of 0.7 and 1.7, and when
# integrated, should reach approximately 3.537 at t=5 seconds.
test component SquareTest
# Integrator block that accumulates the square wave input
integrator = Integrator()
# Square wave generator with specified amplitude, frequency, start time and offset
signal = Square(amplitude=1, frequency=2, start_time=0.5, offset=0.7)
relations
connect(signal.y, integrator.u)
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 5,
"atol": {"integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 0.7},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.7, "integrator.x": 3.53706}
}
}
}
}
}
end
Flattened Source
dyad
# Connects a square wave generator to an integrator to test integration of a periodic signal.
#
# This component demonstrates the integration of a square wave over time. It connects a Square
# signal generator (with amplitude 1, frequency 2 Hz, start time 0.5 seconds, and offset 0.7)
# to an Integrator block. The square wave alternates between values of 0.7 and 1.7, and when
# integrated, should reach approximately 3.537 at t=5 seconds.
test component SquareTest
# Integrator block that accumulates the square wave input
integrator = Integrator()
# Square wave generator with specified amplitude, frequency, start time and offset
signal = Square(amplitude=1, frequency=2, start_time=0.5, offset=0.7)
relations
connect(signal.y, integrator.u)
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 5,
"atol": {"integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 0.7},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.7, "integrator.x": 3.53706}
}
}
}
}
}
end
Test Cases
This is setup code, that must be run before each test case.
julia
using BlockComponents
using ModelingToolkit, OrdinaryDiffEqDefault
using Plots
using CSV, DataFrames
snapshotsdir = joinpath(dirname(dirname(pathof(BlockComponents))), "test", "snapshots")
"/home/actions-runner-10/.julia/packages/BlockComponents/77kIK/test/snapshots"
Test Case case1
julia
@mtkbuild model_case1 = SquareTest()
u0_case1 = []
prob_case1 = ODEProblem(model_case1, u0_case1, (0, 5))
sol_case1 = solve(prob_case1)
retcode: Success
Interpolation: 3rd order Hermite
t: 33-element Vector{Float64}:
0.0
9.999999999999999e-5
0.0010999999999999998
0.011099999999999997
0.11109999999999996
0.448740457884214
0.6715376164058572
0.720174175767719
0.9138882057015136
0.9983647686761061
⋮
3.741380400519009
4.329759627686918
4.5997489526839646
4.839633835886665
4.92801296604284
4.971770022574636
4.991184927209426
4.998295399883732
5.0
u: 33-element Vector{Vector{Float64}}:
[0.0]
[6.999999999999998e-5]
[0.0007699999999999996]
[0.007769999999999996]
[0.07776999999999995]
[0.3141183205189497]
[0.6691543336646428]
[0.751836484579808]
[0.7310938833413326]
[0.7057509144489549]
⋮
[3.2885349871669614]
[3.225532241881463]
[3.367897387655729]
[3.5772451254022957]
[3.550731386355443]
[3.5376042693959047]
[3.5317797980054677]
[3.529646656203176]
[3.537060679827635]
julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.signal.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "SquareTest_case1_sig0.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.signal.y], width=2, label="Actual value of signal.y")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of signal.y")
end
scatter!(plt, [df_case1.t[1]], [0.7], label="Initial Condition for `signal.y`")
scatter!(plt, [df_case1.t[end]], [1.7], label="Final Condition for `signal.y`")
plt
julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.integrator.x])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "SquareTest_case1_sig1.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.integrator.x], width=2, label="Actual value of integrator.x")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of integrator.x")
end
scatter!(plt, [df_case1.t[end]], [3.53706], label="Final Condition for `integrator.x`")
plt
Related
Examples
Experiments
Analyses
Tests