diff --git a/src/Blocks/nonlinear.jl b/src/Blocks/nonlinear.jl index b8350669..b51125c3 100644 --- a/src/Blocks/nonlinear.jl +++ b/src/Blocks/nonlinear.jl @@ -1,4 +1,3 @@ -_clamp(u, u_min, u_max) = max(min(u, u_max), u_min) _dead_zone(u, u_min, u_max) = ifelse(u > u_max, u - u_max, ifelse(u < u_min, u - u_min, 0)) """ @@ -25,7 +24,7 @@ Limit the range of a signal. description="Minimum allowed output of Limiter $name" ] eqs = [ - y ~ _clamp(u, y_min, y_max) + y ~ clamp(u, y_min, y_max) ] extend(System(eqs, t, [], pars; name = name), siso) end @@ -111,7 +110,7 @@ Initial value of state `Y` can be set with `int.y` @unpack y, u = siso eqs = [ - D(y) ~ max(min((u - y) / Td, rising), falling) + D(y) ~ clamp((u - y) / Td, falling, rising) ] initialization_eqs = [ diff --git a/test/Blocks/nonlinear.jl b/test/Blocks/nonlinear.jl index bfc02c1d..d6fb3128 100644 --- a/test/Blocks/nonlinear.jl +++ b/test/Blocks/nonlinear.jl @@ -1,7 +1,7 @@ using ModelingToolkit, OrdinaryDiffEq using ModelingToolkitStandardLibrary.Blocks using ModelingToolkit: t_nounits as t -using ModelingToolkitStandardLibrary.Blocks: _clamp, _dead_zone +using ModelingToolkitStandardLibrary.Blocks: _dead_zone using OrdinaryDiffEq: ReturnCode.Success @testset "Limiter" begin @@ -44,12 +44,12 @@ using OrdinaryDiffEq: ReturnCode.Success sol = solve(prob, Rodas4()) @test SciMLBase.successful_retcode(sol) @test all(abs.(sol[lim.output.u]) .<= 0.5) - @test all(isapprox.(sol[lim.output.u], _clamp.(sol[source.output.u], y_min, y_max), + @test all(isapprox.(sol[lim.output.u], clamp.(sol[source.output.u], y_min, y_max), atol = 1e-2)) # Plots.plot(sol; vars=[source.output.u, lim.output.u]) # Plots.scatter(sol[source.output.u], sol[lim.output.u]) - # Plots.scatter!(sol[source.output.u], _clamp.(sol[source.output.u], y_min, y_max)) + # Plots.scatter!(sol[source.output.u], clamp.(sol[source.output.u], y_min, y_max)) end end