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 |