approximation edit page

approximate an SO3FunRBF by given function values at given nodes w.r.t. some noise as described by [1].

For \(M\) given orientations \(R_i\) and corresponding function values \(y_i\) we compute the SO3FunRBF \(f\) which minimizes the least squares problem

\[\sum_{i=1}^M|f(R_i)-y_i|^2.\]

where \(f\) is

\[ f®=\sum_{j=1}^{N}w_j\psi(\omega(R_j,R)) \]

with specific kernel \(\psi\) centered at \(N\) nodes weighted by \(w_j,\sum_{j}^{N}w_{j}=1\) as described by [1].

We can also use the approximation command to approximate an SO3FunRBF from some given SO3Fun.

Two methods are implemented, referred to as spatial method and harmonic method. The spatial method sets up a (sparse) system matrix \(\Psi\in\mathbb{R}^{M\times N}\) with entries

\[ \Psi_{i,j}=\psi(\omega(R_i,R_j)) \]

of the kernel values of the angle between the evaluation nodes \(R_i,i=1,...,M\) and grid nodes \(R_j,j=1,...,N\). The harmonic method computes a system matrix \(\Psi\in\mathbb{C}^{L\times M}\), where the columns refer to the WignerD function of each grid node \(R_j\). Both systems are solved by a modified least squares gradient descent.

The spatial method is well suited for sharp functions (i.e. high bandwidth), whereas the harmonic method is better suited for low bandwidth, since the system matrix becomes very large for high bandwidths.

For the spatial method, instead of least squares also the maximum-likelihood estimate can be computed. Note that both of this methods have the condition that we approximate a odf (the mean of the SO3Fun is 1). Hence we can also use some standard least squares methods.

Reference: [1] Schaeben, H., Bachmann, F. & Fundenberger, JJ. Construction of weighted crystallographic orientations capturing a given orientation density function. J Mater Sci 52, 2077–2090 (2017). https://doi.org/10.1007/s10853-016-0496-1

Syntax

SO3F = SO3FunRBF.approximation(SO3Grid, f)
SO3F = SO3FunRBF.approximation(SO3Grid, f, 'resolution',5*degree)
SO3F = SO3FunRBF.approximation(SO3Grid, f, 'kernel', psi)
SO3F = SO3FunRBF.approximation(SO3Grid, f, 'density')
SO3F = SO3FunRBF.approximation(SO3Grid, f, 'bandwidth', bandwidth, 'tol', TOL, 'maxit', MAXIT)
SO3F = SO3FunRBF.approximation(SO3Fun,'kernel',psi)

Input

nodes rotational grid SO3Grid, orientation, rotation or harmonic
coefficents
y function values on the grid (maybe multidimensional) or empty

Output

SO3F SO3FunRBF

Options

kernel SO3Kernel
halfwidth use @SO3DeLaValleePoussinKernel with halfwidth
resolution resolution of the grid nodes of the SO3Grid
approxresolution if input it SO3Fun, evaluate function on an approximation grid with resolution specified
bandwidth maximum degree of the Wigner-D functions used to approximate the function (Be careful by setting the bandwidth by yourself, since it may yields undersampling)
tol tolerance for mlsq/ml
iter_max maximum number of iterations for mlsq/ml
SO3Grid

Flags

lsqr least squares (MATLAB)
lsqnonneg non negative least squares (MATLAB, fast)
lsqlin interior point non negative least squares (optimization toolbox, slow)
nnls non negative least squares (W.Whiten)
mlsq modified least squares (default)
likelihood/mlm maximum likelihood estimate for spatial method
spatial/spm spatial method (default, not specified)
harmonic/fourier harmonic method
noThinning keep all approximation nodes, irrespective of the associated weight
odf ensure that SO3FunRBF is a density

See also

SO3Fun.interpolate SO3FunHarmonic.approximation WignerD