LTISystemClass.f90 Source File


Contents

Source Code


Source Code

module LTISystemClass
    use ArrayClass
    use IOClass
    use MathClass
    use RandomClass
    implicit none

    type :: LTISystem_
        real(real64),allocatable :: State(:)
        real(real64),allocatable :: ObservVec(:)
        real(real64),allocatable :: PlantNoise(:)
        real(real64),allocatable :: ObservNoise(:)
        real(real64),allocatable :: StateTransition(:,:)
        real(real64),allocatable :: Driving(:,:)
        real(real64),allocatable :: ObservMat(:,:)
        real(real64) :: sigma=0.0d0
    contains
        procedure,public :: init => initLTISystem
        procedure,public :: update => updateLTISystem
        !procedure,public :: covarianceMatrix => covarianceMatrixLTISystem
    end type
contains    
! ######################################################################################
subroutine initLTISystem(obj,State,StateTransition,Driving,ObservMat)
    class(LTISystem_),intent(inout) :: obj
    real(real64),intent(in) :: State(:)
    real(real64),intent(in) :: StateTransition(:,:)
    real(real64),intent(in) :: Driving(:,:)
    real(real64),intent(in) :: ObservMat(:,:)


    obj%State = State
    obj%StateTransition = StateTransition
    obj%Driving = Driving
    obj%ObservMat = ObservMat


end subroutine
! ######################################################################################


! ######################################################################################
function updateLTISystem(obj) result(y)
    class(LTISystem_),intent(inout) :: obj
    type(Random_) :: random
    real(real64),allocatable :: x(:),y(:),w(:),v(:)
    integer(int32) :: i,n,m,p
    m = size(obj%Driving,2)
    p = size(obj%ObservVec)
    w = zeros(m)
    do i=1,m
        w(i) = random%gauss(mu=0.0d0,sigma=obj%sigma)
    enddo
    v = zeros(p)
    do i=1,m
        v(i) = random%gauss(mu=0.0d0,sigma=obj%sigma)
    enddo

    x = matmul(obj%StateTransition,obj%State) + matmul(obj%Driving,w)
    y = matmul(obj%ObservMat,obj%State) + v(:)

    obj%state = x
    obj%ObservVec = y
    obj%PlantNoise  = w
    obj%ObservNoise = v


end function
! ######################################################################################



! ######################################################################################
!function covarianceMatrixLTISystem(obj) result(ret)
!    class(LTISystem_),intent(in) ::  obj
!    real(real64),allocatable :: ret(:,:)
!    integer(int32) :: n, m
!
!    n = size(obj%PlantNoise)
!    m = size(obj%ObservNoise)
!
!    ret = ret(n+m, n+m)
!
!
!
!end function
! ######################################################################################


end module