An open API service indexing awesome lists of open source software.

https://github.com/juliaapproximation/recurrencerelationshiparrays.jl

A Julia package for caching solutions to recurrence relationships
https://github.com/juliaapproximation/recurrencerelationshiparrays.jl

Last synced: 5 months ago
JSON representation

A Julia package for caching solutions to recurrence relationships

Awesome Lists containing this project

README

          

# RecurrenceRelationshipArrays.jl
A Julia package for caching solutions to recurrence relationships

This package implements arrays associated with recurrence relationships
as implemented in [RecurrenceRelationships.jl](https://github.com/JuliaApproximation/RecurrenceRelationships.jl).

# Matrix-valued Clenshaw

We can
construct multiplication matrices associated with orthogonal polynomials using `Clenshaw`. The follow represents multiplication by $U_0(x) + 2U_1(x) + 3U_2(x)$ acting on a Chebyshev-U expansion:
```julia
julia> using RecurrenceRelationshipArrays, FillArrays, InfiniteArrays

julia> X = SymTridiagonal(Fill(0.0,∞), Fill(1/2,∞)) # Jacobi matrix associated with Chebyshev U
ℵ₀×ℵ₀ SymTridiagonal{Float64, Fill{Float64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}} with indices OneToInf()×OneToInf():
0.0 0.5 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ …
0.5 0.0 0.5 ⋅ ⋅ ⋅ ⋅ ⋅
⋅ 0.5 0.0 0.5 ⋅ ⋅ ⋅ ⋅
⋅ ⋅ 0.5 0.0 0.5 ⋅ ⋅ ⋅
⋅ ⋅ ⋅ 0.5 0.0 0.5 ⋅ ⋅
⋅ ⋅ ⋅ ⋅ 0.5 0.0 0.5 ⋅ …
⋅ ⋅ ⋅ ⋅ ⋅ 0.5 0.0 0.5
⋮ ⋮ ⋱

julia> rec_U = Fill(2,∞), Zeros{Int}(∞), Ones{Int}(∞); # recurrence coefficients for Chebyshev U

julia> Clenshaw([1,2,3], rec_U..., X)
ℵ₀×ℵ₀ Clenshaw{Float64} with 3 degree polynomial:
1.0 2.0 3.0 ⋅ ⋅ ⋅ ⋅ ⋅ …
2.0 4.0 2.0 3.0 ⋅ ⋅ ⋅ ⋅
3.0 2.0 4.0 2.0 3.0 ⋅ ⋅ ⋅
⋅ 3.0 2.0 4.0 2.0 3.0 ⋅ ⋅
⋅ ⋅ 3.0 2.0 4.0 2.0 3.0 ⋅
⋅ ⋅ ⋅ 3.0 2.0 4.0 2.0 3.0 …
⋅ ⋅ ⋅ ⋅ 3.0 2.0 4.0 2.0
⋮ ⋮ ⋱
```

# Minimal solutions to 3-term recurrences

The type `RecurrenceArray` allows us to represent a minimal solution
of a recurrence relationship, i.e., the Stieltjes transform of the orthogonal polynomials.
This automatically combines forward and backward recurrence, and so will also will work on the support of the measure. Here is a simple example:
```julia
julia> z = 1.0001; # point close to the support

julia> ξ = inv(z + sign(z)sqrt(z^2-1)); # exact formula for Stieltjes transform of sqrt(1-x^2). The next term is ξ^2.

julia> r = RecurrenceArray(z, rec_U, [ξ,ξ^2])
ℵ₀-element RecurrenceArray{Float64, 1, Float64, Fill{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}, Zeros{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}, Ones{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}} with indices OneToInf():
0.9859575108273005
0.9721122131567664
0.9584613379288637
0.9450021549685467
0.9317319724392233
0.9186481363043878
0.9057480297968131

julia> z = [0.1+0im, 1.0001, 10.0]; # can evaluate at multiple points

julia> ξ = @. inv(z + sign(z)sqrt(z^2-1));

julia> RecurrenceArray(z, rec_U, [ξ'; ξ'.^2])
ℵ₀×3 RecurrenceArray{ComplexF64, 2, Vector{ComplexF64}, Fill{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}, Zeros{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}, Ones{Int64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}} with indices OneToInf()×Base.OneTo(3):
0.1+0.994987im 0.985958+0.0im 0.0501256+0.0im
-0.98+0.198997im 0.972112+0.0im 0.00251258+0.0im
-0.296-0.955188im 0.958461+0.0im 0.000125945-0.0im
0.9208-0.390035im 0.945002+0.0im 6.31305e-6-0.0im
0.48016+0.877181im 0.931732+0.0im 3.16446e-7+0.0im
-0.824768+0.565471im 0.918648+0.0im 1.5862e-8-0.0im
-0.645114-0.764087im 0.905748+0.0im 7.95095e-10-0.0im

```