## Bernstein.jl

Calculate Bernstein polynomials
Author eschnett
Popularity
3 Stars
Updated Last
2 Years Ago
Started In
May 2020

# Bernstein Polynomial Basis

• GitHub: Source code repository

The Bernstein polynomials form a basis for polynomials living on simplices. This package calculates the Bernstein polynomials for simplices of arbitrary dimension.

This package also provides conversion functions between Cartesian and barycentric coordinates.

## Examples

### Convert between Cartesian and barycentric coordinates

```julia> using StaticArrays

julia> using Bernstein

julia> # Define a triangle
s = rand(SMatrix{3,2})
3×2 SArray{Tuple{3,2},Float64,2,6} with indices SOneTo(3)×SOneTo(2):
0.814346  0.297149
0.519781  0.620776
0.345743  0.733385

julia> # Choose a point
p = rand(SVector{2})
2-element SArray{Tuple{2},Float64,1,2} with indices SOneTo(2):
0.1483582649665245
0.3923504628863179

julia> # Convert to barycentric coordinates
λ = cartesian2barycentric(s, p)
3-element SArray{Tuple{3},Float64,1,3} with indices SOneTo(3):
3.523588891718682
-10.621534570787583
8.097945679068905

julia> # Convert back
q = barycentric2cartesian(s, λ)
2-element SArray{Tuple{2},Float64,1,2} with indices SOneTo(2):
0.14835826496652604
0.3923504628863199

julia> p ≈ q
true```

You can also pass the simplex vertices as a vector of vectors `SVector{N, SVector{D, T}}` instead of a matrix.

If you convert many Cartesian to barycentric coordinates, then part of the transformation can be pre-calculated to increase efficiency. Call `cartesian2barycentric_setup` for this:

```julia> using StaticArrays

julia> using Bernstein

julia> # Define a triangle
s = rand(SMatrix{3,2})
3×2 SArray{Tuple{3,2},Float64,2,6} with indices SOneTo(3)×SOneTo(2):
0.814346  0.297149
0.519781  0.620776
0.345743  0.733385

julia> # Choose a point
p = rand(SVector{2})
2-element SArray{Tuple{2},Float64,1,2} with indices SOneTo(2):
0.1483582649665245
0.3923504628863179

julia> # Pre-calculate part of the transformation
setup = cartesian2barycentric_setup(s);

julia> # Convert to barycentric coordinates
λ = cartesian2barycentric(setup, p)
3-element SArray{Tuple{3},Float64,1,3} with indices SOneTo(3):
3.523588891718682
-10.621534570787583
8.097945679068905```

### Evaluate Bernstein polynomials

You can evaluate Bernstein polynomials from barycentric coordinates or from Cartesian coordinates:

```julia> using StaticArrays

julia> using Bernstein

julia> # Define a triangle
s = rand(SMatrix{3,2})
3×2 SArray{Tuple{3,2},Float64,2,6} with indices SOneTo(3)×SOneTo(2):
0.814346  0.297149
0.519781  0.620776
0.345743  0.733385

julia> # Choose a point
p = rand(SVector{2})
2-element SArray{Tuple{2},Float64,1,2} with indices SOneTo(2):
0.1483582649665245
0.3923504628863179

julia> # Convert to barycentric coordinates
λ = cartesian2barycentric(s, p)
3-element SArray{Tuple{3},Float64,1,3} with indices SOneTo(3):
3.523588891718682
-10.621534570787583
8.097945679068905

julia> # Choose polynomial index and order
# (The order is the sum of all coefficients)
α = SVector(2,0,0);

julia> bernstein(α, λ)
3.523588891718682

julia> bernstein(s, α, p)
3.523588891718682

julia> bernstein(setup, α, p)
3.523588891718682```

## References

• Douglas N. Arnold, Richard S. Falk, Ragnar Winther, "Geometric decompositions and local bases for spaces of finite element differential forms", 10.1016/j.cma.2008.12.017, arXiv:0806.1255 [math.NA].

• Tom Lyche, Karl Scherer, "On the p-norm condition number of the multivariate triangular Bernstein basis", DOI: 10.1016/S0377-0427(00)00383-6.

### Used By Packages

No packages found.