Overview
PolyChaos is a collection of numerical routines for orthogonal polynomials written in the Julia programming language. Starting from some non-negative weight (aka an absolutely continuous nonnegative measure), PolyChaos allows
- to compute the coefficients for the monic three-term recurrence relation,
- to evaluate the orthogonal polynomials at arbitrary points,
- to compute the quadrature rule,
- to compute tensors of scalar products,
- to do all of the above in a multivariate setting (aka product measures).
If the weight function is a probability density function, PolyChaos further provides routines to compute polynomial chaos expansions (PCEs) of random variables with this very density function. These routines allow
- to compute affine PCE coefficients for arbitrary densities,
- to compute moments,
- to compute the tensors of scalar products.
PolyChaos contains several canonical orthogonal polynomials such as Jacobi or Hermite polynomials. For these, closed-form expressions and state-of-the art quadrature rules are used whenever possible. However, a cornerstone principle of PolyChaos is to provide all the functionality for user-specific, arbitrary weights.
What PolyChaos is not (at least currently):
- a self-contained introduction to orthogonal polynomials, quadrature rules and/or polynomial chaos expansions. We assume the user brings some experience to the table. However, over time we will focus on strengthening the tutorial charater of the package.
- a symbolic toolbox
- a replacement for FastGaussQuadrature.jl
Installation
The package requires Julia 1.3
or newer. In Julia
switch to the package manager
julia> ]
(v1.03 pkg> add PolyChaos
This will install PolyChaos and its dependencies. Once that is done, load the package:
julia> using PolyChaos
That's it.
Let's take a look at a simple example. We would like to solve the integral
Exploiting the underlying uniform measure, the integration can be done exactly with a 3-point quadrature rule.
julia> using PolyChaos
julia> opq = Uniform01OrthoPoly(3, addQuadrature = true)
Uniform01OrthoPoly{Array{Float64,1},Uniform01Measure,Quad{Float64,Array{Float64,1}}}(3, [0.5, 0.5, 0.5, 0.5], [1.0, 0.08333333333333333, 0.06666666666666667, 0.06428571428571428], Uniform01Measure(PolyChaos.w_uniform01, (0.0, 1.0), true), Quad{Float64,Array{Float64,1}}("golubwelsch", 3, [0.11270166537925838, 0.49999999999999994, 0.8872983346207417], [0.2777777777777777, 0.4444444444444444, 0.27777777777777757]))
julia> integrate(x -> 6x^5, opq)
0.9999999999999993
julia> show(opq)
Univariate orthogonal polynomials
degree: 3
#coeffs: 4
α = [0.5, 0.5, 0.5, 0.5]
β = [1.0, 0.08333333333333333, 0.06666666666666667, 0.06428571428571428]
Measure dλ(t)=w(t)dt
w: w_uniform01
dom: (0.0, 1.0)
symmetric: true
To get going with PolyChaos check out the tutorials such as the one on numerical integration. In case you are unfamiliar with orthogonal polynomials, perhaps this background information is of help.
References
The code base of PolyChaos
is partially based on Walter Gautschi's Matlab suite of programs for generating orthogonal polynomials and related quadrature rules, with much of the theory presented in his book Orthogonal Polynomials: Computation and Approximation published in 2004 by the Oxford University Press.
For the theory of polynomial chaos expansion we mainly consulted T. J. Sullivan. Introduction to Uncertainty Quantification. Springer International Publishing Switzerland. 2015.
Contributing
We are always looking for contributors. If you are interested, just get in touch: tillmann [dot] muehlpfordt [at] kit [dot] edu.
Or just fork and/or star the repository:
Julia's package manager works nicely with Github: simply install the hosted package via Pkg.clone
and the repository's URL. A fork is created with
Pkg.clone("https://github.com/timueh/PolyChaos.jl")
The fork will replace the original package.
Call
Pkg.dir("PolyChaos")
to figure out where the package was cloned to. Go to that location and figure out what branch you are on via git branch
.
Citing
If you found the software useful and applied it to your own research, we'd appreciate a citation. Add the following to your BibTeX file
@ARTICLE{2020arXiv200403970M,
author = {{M{\"u}hlpfordt}, Tillmann and {Zahn}, Frederik and {Hagenmeyer}, Veit and
{Faulwasser}, Timm},
title = "{PolyChaos.jl -- A Julia Package for Polynomial Chaos in Systems and Control}",
journal = {arXiv e-prints},
keywords = {Electrical Engineering and Systems Science - Systems and Control, Mathematics - Numerical Analysis, Mathematics - Optimization and Control},
year = 2020,
month = apr,
eid = {arXiv:2004.03970},
pages = {arXiv:2004.03970},
archivePrefix = {arXiv},
eprint = {2004.03970},
}
Of course you are more than welcome to partake in GitHub's gamification: starring and forking is much appreciated.
Enjoy.