diff --git a/src/SystemIdentification.jl b/src/SystemIdentification.jl index c74e36845f446876f970e3eecb1521df221cb440..78417969cdcdf51235da9799cf520f1b36d7548f 100644 --- a/src/SystemIdentification.jl +++ b/src/SystemIdentification.jl @@ -13,7 +13,7 @@ FitResult, IdData, # Functions ar,arx,getARregressor,getARXregressor,find_na, -toeplitz, kalman, kalman_smoother, forward_kalman +toeplitz, kalman, kalman_smoother, forward_kalman, PCA ## Fit Methods ================= :LS @@ -26,8 +26,8 @@ abstract Model abstract LinearModel <: Model abstract NonLinearModel <: Model abstract Network <: NonLinearModel -typealias Polynom{T<:Real} Union(Array{T,1} , T) -typealias PolynomMatrix{T} Union(Array{Polynom{T},1},Polynom{T}, T) +typealias Polynom{T<:Real} Union{Array{T,1} , T} +typealias PolynomMatrix{T} Union{Array{Polynom{T},1},Polynom{T}, T} diff --git a/src/kalman.jl b/src/kalman.jl index b78b88b395605d98ba3fb1e2a5b36088c98917fc..345fa132248c5c5a490f6e9232cfc570b0cb2746 100644 --- a/src/kalman.jl +++ b/src/kalman.jl @@ -1,8 +1,8 @@ """ + `kalman(R1,R2,theta, y, A, P)` One dimensional Kalman filter for parameter estimates -`kalman(R1,R2,theta, y, A, P)` """ -function kalman(R1,R2,theta, y, A, P) +function kalman1(R1,R2,theta, y, A, P) ATP = A'P K = (P*A)/(R2+ATP*A) P = P - (P*A*ATP)./(R2 + ATP*A) + R1 @@ -12,6 +12,20 @@ function kalman(R1,R2,theta, y, A, P) return theta, P, e, yp end +""" + `kalman(R1,R2,R12,theta, y, A, P)` +General Kalman filter for parameter estimates +""" +function kalman(R1,R2,R12,theta, y, A, P) + ATP = A'P + K = (P*A+R12)/(R2+ATP*A) + P = P - (P*A+R12)/(R2 + ATP*A)*(ATP+R12') + R1 + yp = (A'theta)[1] + e = y-yp + theta = theta + K*e + return theta, P, e, yp +end + function forward_kalman(y,A,R1,R2, P0) diff --git a/src/least_squares.jl b/src/least_squares.jl index 23cf705fde8e54614c2385905ddfa7eae9f3047d..4a0395d836029cd7ca6a6ec6a7578687be667844 100644 --- a/src/least_squares.jl +++ b/src/least_squares.jl @@ -38,7 +38,7 @@ end function Lcurve(normE, normX, λ) plot(normE,normX,xscale=:log10,yscale=:log10,m=:o) - annotations = [(normE[i],normX[i],"λ=$(round(λ[i],4))") for i in 1:length(λ)] + annotations = [(normE[i],normX[i],"λ=$(round(λ[i],8))") for i in 1:length(λ)] annotate!(annotations) xlabel!("RMSE"); ylabel!("||k||"); title!("L-curve") end diff --git a/src/particle_filters/pf_bootstrap.jl b/src/particle_filters/pf_bootstrap.jl index 931280d76efed8fb248d68a2f5b190016d27171b..4caacc872a69102980ed9cb7f226b3e361323a29 100644 --- a/src/particle_filters/pf_bootstrap.jl +++ b/src/particle_filters/pf_bootstrap.jl @@ -130,7 +130,7 @@ function pf_aux_nn(xp, w, wnn, y, N, g_density, f) for t = 2:T xpT = xp[:,t-1] - f(xpT,t-1) + f(xpT,t-1) # This is now incorrect. particles should be propagated without noise in this step. wT = copy(w[:,t-1]) lambda = g_density(y[t],xpT)