Source code for attitude.bingham
from __future__ import division
import numpy as N
from math import factorial
from scipy.special import gamma, hyp1f1
from scipy.linalg import expm
from itertools import product
from .geom.util import dot
from .stereonet import sph2cart
from .error.axes import sampling_covariance, sampling_axes
from mplstereonet.stereonet_math import _rotate, cart2sph, sph2cart
[docs]def confluent_hypergeometric_function(k1, k2, n=10):
val = 0
for i,j in product(range(n), range(n)):
top = gamma(i+0.5)*gamma(j+0.5)*k1**i*k2**j
btm = gamma(i+j+3/2.)*factorial(i)*factorial(j)
val += top/btm
return val
[docs]def bingham_pdf(fit):
"""
From the *Encyclopedia of Paleomagnetism*
From Onstott, 1980:
Vector resultant: R is analogous to eigenvectors
of T.
Eigenvalues are analogous to |R|/N.
"""
# Uses eigenvectors of the covariance matrix
e = fit.hyperbolic_axes #singular_values
#e = sampling_covariance(fit) # not sure
e = e[2]**2/e
kappa = (e-e[2])[:-1]
kappa /= kappa[-1]
F = N.sqrt(N.pi)*confluent_hypergeometric_function(*kappa)
ax = fit.axes
Z = 1/e
M = ax
F = 1/hyp1f1(*1/Z)
def pdf(coords):
lon,lat = coords
I = lat
D = lon# + N.pi/2
#D,I = _rotate(N.degrees(D),N.degrees(I),90)
# Bingham is given in spherical coordinates of inclination
# and declination in radians
# From USGS bingham statistics reference
xhat = N.array(sph2cart(lon,lat)).T
#return F*expm(dot(xhat.T, M, N.diag(Z), M.T, xhat))
return 1/(F*N.exp(dot(xhat.T, M, N.diag(Z), M.T, xhat)))
return pdf
[docs]def regular_grid(**kwargs):
n = kwargs.pop('n', 100)
gridsize = kwargs.pop('gridsize',None)
if gridsize is None:
gridsize = (n,n)
bound = N.pi/2
nrows, ncols = gridsize
xmin, xmax, ymin, ymax = -bound, bound, -bound, bound
lon, lat = N.mgrid[xmin : xmax : ncols * 1j, ymin : ymax : nrows * 1j]
return lon,lat