Build Status |
---|
The purpose of this package is to provide methods to numerically handle real spherical harmonics expansions in Cartesian coordinates.
The normalized real spherical harmonics on the unit sphere are defined by
where
is the normalization factor and
are the associated Legendre polynomials which can be derived from the Legendre polynomials
Note that you will also find a convention in literature, where the
Each function
for all
The term
can be transformed from spherical to Cartesian coordinates, where it can be expressed as a homogeneous polynomial of degree
Generate a MultivariatePolynomials.Polynomial
representation of
in variables α
, β
, and γ
on the unit sphere by
using SphericalHarmonics
@polyvar α β γ
l = 7
m = -2
p = ylm(l,m,α,β,γ)
63.28217501963252αβγ⁵ - 48.67859616894809αβγ³ + 6.63799038667474αβγ
The polynomial representation of
in variables x
, y
, and z
on
@polyvar x y z
p = rlylm(l,m,x,y,z)
6.63799038667474x⁵yz + 13.27598077334948x³y³z - 35.40261539559861x³yz³ + 6.63799038667474xy⁵z - 35.40261539559861xy³z³ + 21.24156923735917xyz⁵
In case where a function is equal to or can be approximated by a finite Spherical harmonic expansion
with
Coefficents c[l,m] = 42.0
.
L = 2
c = SphericalHarmonicCoefficients(L)
c[0,0] = 42.0 #c₀₀
c[2,-1] = -1.0 #c₂₋₁
c[2,1] = 2.0 #c₂₁
Internally, the coefficients are lexicographically stored in a vector (c[0,0]
, c[1,-1]
, c[1,0]
, c[1,1]
, c[2,-2]
, ...). So the above initialization is equivalent to
C = [42.0,0,0,0,0,-1,0,2,0]
c = SphericalHarmonicCoefficients(C)
f = sphericalHarmonicsExpansion(c,x,y,z)
2.1850968611841584xz + -1.0925484305920792yz + 11.847981254502882
Note that SphericalHarmonicCoefficients(C)
will throw an error if length(C)
is not x
, y
, and z
can be obtained by
@polyvar x y z
f = sphericalHarmonicsExpansion(c,x,y,z)
2.1850968611841584xz - 1.0925484305920792yz + 11.847981254502882
Currently, expansions up to
If we change from a coordinate sytsem with coordinates x
, y
, and z
into a translated one with new coordinates u = x + tx
, v = y + ty
, and w = z + tz
we need transformed coefficients to express the expansion in these new coordinates. To this end, we can do
@polyvar u v w
translationVector = [0,0,1.0] # [tx,ty,tz]
cTranslated = translation(c,translationVector)
sphericalHarmonicsExpansion(cTranslated,u,v,w)
2.1850968611841584uw - 1.0925484305920792vw + 2.1850968611841584u - 1.0925484305920792v + 11.847981254502878
If you want to evaluate MultivariatePolynomials
f(x=>0.5, y=>-1.0, z=>0.25)
12.394255469798921
f((x,y,z)=>(0.5,-1.0,0.25))
12.394255469798921
In case where you want to evaluate
g = @fastfunc f
g(0.5,-1.0,0.25)
12.394255469798921
which has moderate generation overhead. Usage from within local scope requires Base.invokelatest(foo, 1.0,2.0,3.0)
instead of foo(1.0,2.0,3.0)
to avoid issue #4. Or use
h = fastfunc(f)
h(0.5,-1.0,0.25)
12.394255469798921
which uses GeneralizedGenerated
for function generation and comes with a significant overhead.
For more informations on the MultivariatePolynomials
package please visit the project page on github.