# \[ANN\] PeriodicSystems.jl - Analysis and design of linear periodic time-varying systems

**URL:** <https://discourse.julialang.org/t/ann-periodicsystems-jl-analysis-and-design-of-linear-periodic-time-varying-systems/124919>\
**Category:** Package Announcements\
**Tags:** package, dynamical-systems, controlsystems\
**Created:** [January 19, 2025, 12:32pm UTC](https://discourse.julialang.org/t/ann-periodicsystems-jl-analysis-and-design-of-linear-periodic-time-varying-systems/124919 "2025-01-19T12:32:55Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![andreasvarga](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andreasvarga/32/11634_2.png) [@andreasvarga](https://discourse.julialang.org/u/andreasvarga)\
**Post date:** [January 19, 2025, 12:32pm UTC](https://discourse.julialang.org/t/ann-periodicsystems-jl-analysis-and-design-of-linear-periodic-time-varying-systems/124919/1 "2025-01-19T12:32:55Z")

</div>

Many control system applications are formulated as genuine periodic control problems, as for example, satellite attitude control, helicopter forward flight control, orbital stabilization of underactuated systems, etc. Besides that, periodic systems represent a general framework to analyze and design multi-rate sampled-data systems. To address analysis and controller synthesis problems for _linear periodic time-varying_ (LPTV) systems the [`PeriodicSystems.jl`](https://github.com/andreasvarga/PeriodicSystems.jl) package has been implemented. This package relies on the periodic matrix objects defined in the [`PeriodicMatrices.jl`](https://github.com/andreasvarga/PeriodicMatrices.jl) package and on the solvers of differential and difference periodic matrix equations in the [`PeriodicMatrixEquations.jl`](https://github.com/andreasvarga/PeriodicMatrixEquations.jl) package. [`PeriodicSystems.jl`](https://github.com/andreasvarga/PeriodicSystems.jl) can be seen as an extension of both the [`ControlSystems.jl`](https://github.com/JuliaControl/ControlSystems.jl) and [`DescriptorSystems.jl`](https://github.com/andreasvarga/DescriptorSystems.jl) packages dedicated to handle _linear time-invariant_ (LTI) systems.

The available functions cover both continuous-time and discrete-time settings, by focussing on the main basic analysis and controller design problems. The available functions address the following main areas:

- _Model building_: Constructors of periodic systems for all periodic matrix types defined in [`PeriodicMatrices.jl`](https://github.com/andreasvarga/PeriodicMatrices.jl) are available. Also LPTV systems can be constructed from LTI systems, as well as LTI systems with multi-rate sampling.

- _Model conversions_: Conversions between LPTV system representations with different periodic matrix types are supported; additionally, conversions from continuous-time to discrete-time representations can be performed. Several functions allow to obtain equivalent LTI representations using time- and frequency-lifting techniques. In this way, many analysis problems for LPTV systems can be also performed using the lifted LTI representations using the functions of the [`DescriptorSystems.jl`](https://github.com/andreasvarga/DescriptorSystems.jl) package.

- _System connections and operations_: Basic system connections, such as, parallel, series and feedback connections, as well as system concatenations can be performed for LPTV systems with all periodic matrix types.  
Operations corresponding to input-output mappings with LPTV systems, such as, sums, products, row/column concatennations can be performed when one of the systems is a constant gain (i.e., matrix, UniformScaling, scalar). The inversion of periodic systems with invertible feedthrough matrix is also possible.

- _System analysis_: The analysis of LPTV systems covers the computation of system poles and zeros, stability assessment, evaluation of system norms (Hankel-, L2- and H∞-norms), computation of time responses for step or arbitrary input signals.

- _Controller design_: The focus of controller design is on the stabilization of LPTV systems using periodic controllers. Several stabilization approaches are implemented, such as, the solution of linear-quadratic-gaussian optimization problem using controllers based on periodic time-varying state feedback and Kalman state estimators, or periodic output feeback gains. For output feedback stabilization the periodic controller gains are determined using optimization based techniques based either on explicitly computed gradients or employing direct search techniques for suitably parameterized periodic gains, such as, switching periodic gains or harmonic representation gains.

The current release of this package covers the basic needs of the analysis and synthesis of LPTV systems. All functions are available for both continuous- and discrete-time systems. The planned new developments target the implementation of tools for eigenvalue assignment using state feedback based on the solution of a periodic Sylvester equation. Tools will be also implemented to determine the steady-state (periodic) solutions of linear periodic differential equations with periodic inputs. The computation of minimal realizations of discrete-time LPTV systems is intended to be implemented (no viable approaches available for continuous-time systems).

The [`PeriodicSystems.jl`](https://github.com/andreasvarga/PeriodicSystems.jl) package relies on countless contributions from the community of Julia package developers and of some general purpose libraries. Here is a (hopefully complete) list of aditionally employed main packages: [`ApproxFun.jl`](https://github.com/JuliaApproximation/ApproxFun.jl), [`DescriptorSystems.jl`](https://github.com/andreasvarga/DescriptorSystems.jl),[`FastLapackInterface.jl`](https://github.com/DynareJulia/FastLapackInterface.jl), [`FFTW.jl`](https://github.com/JuliaMath/FFTW.jl), [`IRKGaussLegendre.jl`](https://github.com/SciML/IRKGaussLegendre.jl), [`Interpolations.jl`](https://github.com/JuliaMath/Interpolations.jl), [`LAPACK`](https://github.com/Reference-LAPACK/lapack), [`LinearMaps.jl`](https://github.com/JuliaLinearAlgebra/LinearMaps.jl),[`MatrixEquations.jl`](https://github.com/andreasvarga/MatrixEquations.jl), [`MatrixPencils.jl`](https://github.com/andreasvarga/MatrixPencils.jl), [`Optim.jl`](https://github.com/JuliaNLSolvers/Optim.jl), [`OrdinaryDiffEq.jl`](https://github.com/SciML/OrdinaryDiffEq.jl), [`PeriodicSchurDecompositions.jl`](https://github.com/RalphAS/PeriodicSchurDecompositions.jl), [`Polynomials.jl`](https://github.com/JuliaMath/Polynomials.jl), [`Primes.jl`](https://github.com/JuliaMath/Primes.jl), [`QuadGK.jl`](https://github.com/JuliaMath/QuadGK.jl), [`SLICOT`](https://github.com/SLICOT/SLICOT-Reference/), [`SparseArrays.jl`](https://github.com/JuliaSparse/SparseArrays.jl), [`Symbolics.jl`](https://github.com/JuliaSymbolics/Symbolics.jl). The interaction with many of the package authors helped me a lot to overcome various difficulties encountered during the development of [`PeriodicSystems.jl`](https://github.com/andreasvarga/PeriodicSystems.jl). Many thanks to all of you!
