Spectral Sparse Grids

The sparse grid approximations are polynomial approximations, with a basis of Lagrange interpolation polynomials. The approximation can be written in any suitable polynomial basis, for example we could use the Chebyshev polynomials.

The change of basis is implemented exploiting the ApproxFun.jl package. The underlying interpolation polynomials used in SparseGridsKit.jl are constructed using Funs. To change basis we use an ApproxFun.jl expansion into coefficients and form a tensor product. To promote sparsity this is done using a truncated Kronecker product. The polynomial coefficients are assembled with corresponding polynomial degrees and spaces in a callable SpectralSparseGridApproximation.

Examples

An adaptive sparse grid approximation for a Genz test function is created.

using SparseGridsKit
n = 8
C = 1.0
W = 0.0
T = "exponentialdecay"
N = "gaussianpeak"
f = genz(n::Int, C::Float64, W::Float64, T::String, N::String)
# Approximate
(sg, f_on_Z) = adaptive_sparsegrid(f, n)
f_sg = SparseGridApproximation(sg,f_on_Z)
SparseGridApproximation(SparseGrid(8, [[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]], [1 1 … 3 4; 1 1 … 2 1; … ; 1 1 … 1 1; 1 1 … 1 1], [-1, 1, 0, 0, 0, -1, 1, 1], Real[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; -0.38268343236508984 0.0 … 0.0 0.0; -0.9238795325112867 0.0 … 0.0 0.0], [-0.26984126984126977, 0.16666666666666669, 0.16666666666666669, -0.0031746031746031807, 0.05079365079365081, 0.05079365079365081, -0.0031746031746031807, 0.005555555555555559, 0.044444444444444446, 0.06666666666666668  …  0.005555555555555559, 0.005555555555555559, 0.044444444444444446, 0.06666666666666668, 0.044444444444444446, 0.005555555555555559, 0.07310932460800906, 0.1808589293602449, 0.1808589293602449, 0.07310932460800906], Points[CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0]), CCPoints{Float64}([-1.0, 1.0])], Level[Doubling(), Doubling(), Doubling(), Doubling(), Doubling(), Doubling(), Doubling(), Doubling()], SparseGridsKit.sparse_grid_data{8}(SparseGridsKit.SparseTerm{8}[SparseGridsKit.SparseTerm{8}(([1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([1, 1], [1, 1], [2, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([1, 1], [1, 1], [2, 2], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([1, 1], [1, 1], [2, 3], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 2], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 3], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 4], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 5], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([3, 1], [2, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1]))  …  SparseGridsKit.SparseTerm{8}(([3, 5], [2, 3], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 2], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 3], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 4], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 5], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 6], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 7], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 8], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1])), SparseGridsKit.SparseTerm{8}(([4, 9], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1], [1, 1]))], [(1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 2, 1, 1, 1, 1, 1), (1, 1, 3, 1, 1, 1, 1, 1), (2, 1, 1, 1, 1, 1, 1, 1), (4, 1, 1, 1, 1, 1, 1, 1), (5, 1, 1, 1, 1, 1, 1, 1), (3, 1, 1, 1, 1, 1, 1, 1), (2, 2, 1, 1, 1, 1, 1, 1), (4, 2, 1, 1, 1, 1, 1, 1), (1, 2, 1, 1, 1, 1, 1, 1)  …  (3, 2, 1, 1, 1, 1, 1, 1), (2, 3, 1, 1, 1, 1, 1, 1), (4, 3, 1, 1, 1, 1, 1, 1), (1, 3, 1, 1, 1, 1, 1, 1), (5, 3, 1, 1, 1, 1, 1, 1), (3, 3, 1, 1, 1, 1, 1, 1), (6, 1, 1, 1, 1, 1, 1, 1), (7, 1, 1, 1, 1, 1, 1, 1), (8, 1, 1, 1, 1, 1, 1, 1), (9, 1, 1, 1, 1, 1, 1, 1)], [1, 2, 1, 3, 4, 5, 1, 6, 7, 8  …  17, 4, 18, 5, 19, 1, 20, 6, 21, 7], [-1, 1, 1, 1, -1, -1, -1, -1, -1, 1  …  1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…), Dict([4, 2] => 6, [1, 1] => 1, [3, 5] => 3, [4, 5] => 1, [2, 1] => 2, [3, 1] => 2, [4, 8] => 9, [4, 1] => 2, [4, 6] => 8, [2, 3] => 3…)], [[[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]], [[0.0], [1.0, 0.0, -1.0], [1.0, 0.7071067811865475, 0.0, -0.7071067811865475, -1.0], [1.0, 0.9238795325112867, 0.7071067811865475, 0.38268343236508984, 0.0, -0.38268343236508984, -0.7071067811865475, -0.9238795325112867, -1.0]]], [[0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867], [0.0, 1.0, -1.0, 0.7071067811865475, -0.7071067811865475, 0.9238795325112867, 0.38268343236508984, -0.38268343236508984, -0.9238795325112867]], [[[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]], [[1.0], [0.16666666666666669, 0.6666666666666667, 0.16666666666666669], [0.033333333333333354, 0.26666666666666666, 0.4, 0.26666666666666666, 0.033333333333333354], [0.007936507936507936, 0.07310932460800906, 0.13968253968253969, 0.1808589293602449, 0.19682539682539682, 0.1808589293602449, 0.13968253968253969, 0.07310932460800906, 0.007936507936507936]]])), [1.0, 0.9986316107749044, 0.9986316107749044, 0.5420585004051459, 0.7362462226763177, 0.7362462226763177, 0.5420585004051459, 0.5265868123957612, 0.715231937600404, 0.9714575308793776  …  0.5265868123957612, 0.5265868123957612, 0.715231937600404, 0.9714575308793776, 0.715231937600404, 0.5265868123957612, 0.5929174027357444, 0.9142226183682018, 0.9142226183682018, 0.5929174027357444], [[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]])

The approximation f_sg is a representation formed as a linear combination of Lagrange interpolation polynomials. This is converted to a spectral representation using convert_to_spectral_approximation.

f_spectral = convert_to_spectral_approximation(sg, f_on_Z)
SpectralSparseGridApproximation(8, [9, 9, 9, 9, 9, 9, 9, 9], Any[Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0)], sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [0.7421643379729322, -0.0006841946125477893, 1.3877787807814457e-17, -0.010755340910229252, -2.7755575615628914e-17, -2.0816681711721685e-17, -0.2248162280230623, 0.0032676952778094223, 1.249000902703301e-16, 6.938893903907228e-18, 0.01714331539085502, -0.00024819837227248523, -8.326672684688674e-17, -0.0008868264965551098, 0.0, 3.386294373612653e-5], 43046721), sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 2, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0, 0, 0], [3, 2, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 0, 0, 0, 0], [4, 2, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 0, 0, 0, 0, 0]], 43046721), Vector{Real}[[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]])

This still has an n dimensional domain.

f_spectral.dims
8

The representation of the tensor of polynomials is compactly stored as a SparseVector. To index into this we require the storage dimension for each domain dimension.

f_spectral.expansiondimensions
8-element Vector{Int64}:
 9
 9
 9
 9
 9
 9
 9
 9

This demonstrates that more polynomial terms are used in the parameter dimensions closer to one. Intuitively, this matches the anisotropic nature of the test function (see genz). The polynomial coefficients and the corresponding polynomial degrees are stored in sparse vectors.

f_spectral.coefficients, f_spectral.polydegrees
(sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [0.7421643379729322, -0.0006841946125477893, 1.3877787807814457e-17, -0.010755340910229252, -2.7755575615628914e-17, -2.0816681711721685e-17, -0.2248162280230623, 0.0032676952778094223, 1.249000902703301e-16, 6.938893903907228e-18, 0.01714331539085502, -0.00024819837227248523, -8.326672684688674e-17, -0.0008868264965551098, 0.0, 3.386294373612653e-5], 43046721), sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 2, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0, 0, 0], [3, 2, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 0, 0, 0, 0], [4, 2, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 0, 0, 0, 0, 0]], 43046721))

The spectral representation is the same function as the sparse grid representation.

x_test = [rand(n) for i in 1:100]
y_test = f_sg.(x_test)
y_spectral = f_spectral.(x_test)
all(isapprox(y_test, y_spectral; atol=1e-8))
true

The spectral sparse grid approximation also supports addition and subtraction.

f_spectral_2 = f_spectral + f_spectral
y_spectral_2 = f_spectral_2.(x_test)

all(isapprox(y_spectral_2, 2*y_spectral; atol=1e-8))
true
f_spectral_0 = f_spectral - f_spectral
y_spectral_0 = f_spectral_0.(x_test)
@show y_spectral_0, f_spectral_0
#all(isapprox(y_spectral_0, nothing; atol=1e-8))
([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], SpectralSparseGridApproximation(8, [9, 9, 9, 9, 9, 9, 9, 9], Any[Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0), Chebyshev(-1.0 .. 1.0)], sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0, 0.0], 43046721), sparsevec([1, 118099, 531442, 1062883, 4782970, 5845852, 9565939, 10628821, 14348908, 15411790, 19131877, 20194759, 23914846, 28697815, 33480784, 38263753], [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [1, 2, 0, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0, 0, 0], [2, 2, 0, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0, 0, 0], [3, 2, 0, 0, 0, 0, 0, 0], [4, 0, 0, 0, 0, 0, 0, 0], [4, 2, 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0], [7, 0, 0, 0, 0, 0, 0, 0], [8, 0, 0, 0, 0, 0, 0, 0]], 43046721), Vector{Real}[[-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0], [-1.0, 1.0]]))

Function Reference

SparseGridsKit.SpectralSparseGridApproximationType
SpectralSparseGridApproximation

A spectral sparse grid approximation.

Fields

  • dims::Int: Dimension of the domain.
  • expansiondimensions::Vector{Int}: Vector of maximum polynomial degree in each dimension.
  • polytypes::Vector{Any}: Vector of polynomial spaces.
  • coefficients::SparseVector{Any}: SparseVector of polynomial coefficients
  • polydegrees::SparseVector{Vector}: SparseVector of polynomial degrees for each non zero coefficient.
source
SparseGridsKit.SpectralSparseGridApproximationMethod
SpectralSparseGridApproximation(dims, expansionparams, polytypes, coefficients)

Constructs a spectral sparse grid approximation.

Arguments

  • dims::Int: Dimension of the domain.
  • expansiondimensions::Vector{Int}: Vector of maximum polynomial degree in each dimension.
  • polytypes::Vector{Any}: Vector of polynomial spaces.
  • coefficients::Vector{Any}: Kronecker product vector of polynomial coefficients
  • domain::Vector{Vector{Real}}: Vector of domains for inputs

Returns

  • SpectralSparseGridApproximation: An instance of SpectralSparseGridApproximation.
source
SparseGridsKit.SpectralSparseGridApproximationMethod
(s::SpectralSparseGridApproximation)(x)

Evaluate the spectral sparse grid approximation at the given point x.

Arguments

  • s::SpectralSparseGridApproximation: Spectral sparse grid approximation object.
  • x::Vector{T}: Vector x in domain to be evaluated

Returns

  • evaluation: Evaluation of s(x)
source
Base.:+Method
+(grid1::SpectralSparseGridApproximation, grid2::SpectralSparseGridApproximation)

Add two SpectralSparseGridApproximation objects.

Arguments

  • grid1::SpectralSparseGridApproximation: Spectral sparse grid approximation.
  • grid2::SpectralSparseGridApproximation: Second spectral sparse grid approximation.

Returns

  • SpectralSparseGridApproximation representing sum of grid1 and grid2.
source
Base.:-Method
-(grid1::SpectralSparseGridApproximation, grid2::SpectralSparseGridApproximation)

Subtracts SpectralSparseGridApproximation objects

Arguments

  • grid1::SpectralSparseGridApproximation: Spectral sparse grid approximation.
  • grid2::SpectralSparseGridApproximation: Second spectral sparse grid approximation, to be subtracted

Returns

  • SpectralSparseGridApproximation object representing the subtraction.
source
SparseGridsKit.convert_to_sg_approximationMethod
convert_to_sg_approximation(ssg::SpectralSparseGridApproximation)
Convert a `SpectralSparseGridApproximation` object to a SparseGridApproximation representation.

Arguments

  • ssg::SpectralSparseGridApproximation: Spectral sparse grid approximation.

Returns

  • SparseGridApproximation: Sparse grid approximation representation of ssg.
source
SparseGridsKit.convert_to_spectral_approximationMethod
convert_to_spectral_approximation(sparsegrid::SparseGrid, fongrid)

Converts a sparse grid and corresponding evaluations fongrid to a SpectralSparseGridApproximation

Arguments

  • sparsegrid::SparseGrid: Sparse grid
  • fongrid: Function evaluations of sparse grid.

Returns

  • SpectralSparseGridApproximation represntation of sparsegrid with evaluations fongrid.
source
SparseGridsKit.convert_to_spectral_approximationMethod
convert_to_spectral_approximation(sga::SparseGridApproximation)

Convert a SparseGridApproximation object to its spectral approximation.

Arguments

  • sga::SparseGridApproximation: Sparse grid approximation.

Returns

  • Spectral Sparse Grid Approximation representing sga.
source
SparseGridsKit.getdomainMethod
getdomain(polytype)

Takes an ApproxFun polynomial space a returns a vector [a,b] of the domain endpoints.

Arguments

  • polytype : ApproxFun Space

Returns

  • domain : Vector domain [a,b]
source
SparseGridsKit.inverse_level_mapMethod
inverse_level_map(levelfunction, maxlevel)
Inverse level map for a given level2knots type function.

Arguments

  • levelfunction: Level function.
  • maxlevel: Maximum level.

Returns

  • Vector{Int}: Inverse level map.
source
SparseGridsKit.kron_indexMethod
kron_index(indices::Vector{Int}, dims::Vector{Int})

Calculate the linear index in a Kronecker product space given the multi-dimensional indices and the dimensions of each space.

Arguments

  • indices::Vector{Int}: Index vector.
  • dims::Vector{Int}: Vector of storage dimension for each tensor dimension.

Returns

  • Linear index corresponding to the index given in indices.
source
SparseGridsKit.poly_FunMethod
poly_Fun(knots, ind; lb=-1.0, ub=1.0)

Lagrange interpolation polynomial ind for the set of knots

Arguments

  • knots::Vector{T}: A vector of knots
  • ind::Int: Knot index for polynomial equal to 1.
  • lb::Float64: Domain lower bound. Default is -1.0.
  • ub::Float64: Domain upper bound. Default is 1.0.

Returns

  • f::Fun: Lagrange interpolation polynomial as ApproxFun Fun object.
source
SparseGridsKit.reverse_kron_indexMethod
reverse_kron_index(index::Int, dims::Vector{Int})

Given linear index index and a vector of dimensions dims, computes the multi-dimensional tensor index.

Arguments

  • index::Int: Linear index.
  • dims::Vector{Int}: Vector containing the storage dimension of the tensor dimensions.

Returns

  • Vector{Int}: Tensor index
source
SparseGridsKit.truncated_kronMethod
truncated_kron(vectors; tol=eps())

Compute the Kronecker product of a list of vectors with truncation.

Arguments

  • vectors::Vector{Vector}: Vector of vectors to compute the Kronecker product.
  • tol::Float64: Tolerance value for coefficienet truncation to promote sparsity. Elements with absolute values less than tol are set to zero. Default is 1e-15 to remove coefficients at machine precision.

Returns

  • result: SparseVector representation of truncated Kronecker product of the input vectors.
  • tensor_dims::Vector{Int}: Dimensions of the resulting tensor.
source