diff --git a/src/SystemIdentification.jl b/src/SystemIdentification.jl index 0264d4f597e0854938e11e08858704ff4a323672..a484b8e91131ad8bcb8e9f29f15545f879203281 100644 --- a/src/SystemIdentification.jl +++ b/src/SystemIdentification.jl @@ -24,8 +24,9 @@ abstract Model abstract LinearModel <: Model abstract NonLinearModel <: Model abstract Network <: NonLinearModel -typealias Polynom{T<:Real} Union(T, Array{T,1}) -typealias PolynomMatrix{T<:Real} Union(Array{Polynom,1},Polynom) +typealias Polynom{T<:Real} Array{T,1} +typealias PolynomMatrix Array{Polynom,1} + """ diff --git a/src/armax.jl b/src/armax.jl index 7f1e97b519732bfda440dfe0ab0975a11f3f91dc..9c2775110ffa60707076d5167261d61e7af98baa 100644 --- a/src/armax.jl +++ b/src/armax.jl @@ -5,7 +5,7 @@ function ar(y::Vector{Float64}, na; λ = 0, bias=false) if λ == 0 w = A\y_train else - w = (A'A + λeye(na+1))\A'y_train + w = (A'A + λeye(size(A,2)))\A'y_train end prediction = A*w error = y_train - prediction @@ -23,11 +23,20 @@ function arx(y::Vector{Float64}, u::VecOrMat{Float64}, na, nb; λ = 0, doplot=fa if λ == 0 w = A\y_train else - w = (A'A + λeye(na+1))\A'y_train + w = (A'A + λeye(size(A,2)))\A'y_train end prediction = A*w error = y_train - prediction - model = AR(w,na,bias,λ) + + + si = na+1 + b = Polynom[Polynom(w[si:si+nb[1]-1])] + si += nb[1] + for i = 2:length(nb) + push!(b,Polynom(w[si:si+nb[i]-1])) + si += nb[i] + end + model = ARX(w,na,nb,bias,λ) na = bias ? na+1:na result = FitResult(y_train,prediction,na, λ>0?(:LS_reg) :(:LS)) return model, result @@ -49,20 +58,20 @@ getARregressor(iddata::IdData, na, bias=false) = getARXregressor(iddata.y, na, b function getARXregressor(y::Vector{Float64},u::VecOrMat{Float64}, na, nb; bias=false) assert(length(nb) == size(u,2)) - @show m = max(na+1,maximum(nb)) - @show n = length(y) - m+1 - @show offs = m-na-1 - @show A = toeplitz(y[offs+na+1:n+na+offs],y[offs+na+1:-1:1]) - @show y = copy(A[:,1]) - @show A = A[:,2:end] + m = max(na+1,maximum(nb)) + n = length(y) - m+1 + offs = m-na-1 + A = toeplitz(y[offs+na+1:n+na+offs],y[offs+na+1:-1:1]) + y = copy(A[:,1]) + A = A[:,2:end] for i = 1:length(nb) - @show offs = m-nb[i] + offs = m-nb[i] A = [A toeplitz(u[nb[i]+offs:n+nb[i]+offs-1,i],u[nb[i]+offs:-1:1+offs,i])] end if bias - @show A = [A ones(n)] + A = [A ones(n)] end return y,A end