Skip to content

Commit 31ed4b9

Browse files
mzaffalonMichele Zaffalon
andauthored
Restrict size of input parameters (#770)
* Restrict size of input parameters * Add tests Co-authored-by: Michele Zaffalon <michele.zaffalon@bruker.com>
1 parent 7029934 commit 31ed4b9

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

src/timeresp.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ function lsim(sys::AbstractStateSpace{Continuous}, u::Function, t::AbstractVecto
2323
x0::AbstractVecOrMat=zeros(Bool, nstates(sys)), method::Symbol=:cont, alg = Tsit5(), kwargs...)
2424
ny, nu = size(sys)
2525
nx = sys.nx
26-
u0 = u(x0,1)
27-
if length(x0) != nx
26+
u0 = u(x0,t[1])
27+
length(x0) == nx ||
2828
error("x0 must have length $nx: got length $(length(x0))")
29-
elseif !(u0 isa Number && nu == 1) && (size(u0) != (nu,) && size(u0) != (nu,1))
29+
isa(u0, Number) &&
30+
error("u must be a vector of size ($nu,)")
31+
size(u0) == (nu,) ||
3032
error("u must have size ($nu,): got size $(size(u0))")
31-
end
33+
3234
T = promote_type(Float64, eltype(x0), numeric_type(sys))
3335

3436
dt = t[2] - t[1]
@@ -414,4 +416,4 @@ function _lsim(sys::HammersteinWienerSystem{T}, u!, t::AbstractArray{<:Real}, x0
414416
end
415417

416418
return SimResult(yout, t, x, uout2, sys)
417-
end
419+
end

test/test_timeresp.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ th = 1e-6
2323
# Error for wrong size of u
2424
@test_throws ErrorException lsim(sys, (x,t)->[sin(t), cos(t)], 2; x0=[0, 1])
2525

26+
# Restrict u to being vectors
27+
@test_throws ErrorException lsim(sys, (x,t)->[sin(t)]', 0:0.1:1)
28+
@test_throws ErrorException lsim(sys, (x,t)->[sin(t)]', 2)
29+
@test_throws ErrorException lsim(sys, (x,t)->sin(t), 2)
30+
2631
# Error for wrong size of x0
2732
@test_throws ErrorException lsim(sys, (x,t)->[sin(t)], 2; x0=[0, 1, 1])
2833

@@ -123,4 +128,4 @@ for balanced in [true, false]
123128
sys2 = time_scale(sys, a; balanced)
124129
res2 = step(sys2, t ./ a)
125130
@test res1.y res2.y rtol=1e-2 atol=1e-2
126-
end
131+
end

0 commit comments

Comments
 (0)