Source code for pyoof.math_functions
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Tomas Cassanelli
import numpy as np
__all__ = [
'cart2pol', 'wavevector2degrees', 'wavevector2radians', 'co_matrices',
'line_equation', 'rms'
]
[docs]def cart2pol(x, y):
"""
Transformation from Cartesian to polar coordinates, in two dimensions.
Parameters
----------
x : `~numpy.ndarray`
Grid value for the :math:`x` variable.
y : `~numpy.ndarray`
Grid value for the :math:`y` variable.
Returns
-------
rho : `~numpy.ndarray`
Grid value for the radial variable.
theta : `~numpy.ndarray`
Grid value for the angular variable, in radians.
"""
rho = np.sqrt(x ** 2 + y ** 2)
theta = np.arctan2(y, x)
return rho, theta
[docs]def wavevector2degrees(u, wavel):
"""
Transformation from a wave-vector 1 / m units to degrees.
Parameters
----------
u : `~numpy.ndarray`
Wave-vector, result from FFT2 in 1 / m units.
wavel : `~numpy.ndarray`
Wavelength in meters.
Returns
-------
wavevector_degrees : `~numpy.ndarray`
Wave-vector in degrees.
"""
wavevector_degrees = np.degrees(u * wavel)
return wavevector_degrees
[docs]def wavevector2radians(u, wavel):
"""
Transformation from a wave-vector 1 / m units to radians.
Parameters
----------
u : `~numpy.ndarray`
Wave-vector, result from FFT2 in 1 / m units.
wavel : `~numpy.ndarray`
Wavelength in meters.
Returns
-------
wavevector_degrees : `~numpy.ndarray`
Wave-vector in radians.
"""
wavevector_radians = wavevector2degrees(u, wavel) * np.pi / 180
return wavevector_radians
[docs]def co_matrices(res, jac, n_pars):
"""
Computes the estimated Variance-Covariance and the Correlation matrices.
Assuming an estimator normally distributed (and consistent).
Parameters
----------
res : `~numpy.ndarray`
Last residual evaluation from a fit procedure (least squares
minimization), residual understood as data - model.
jac : `~numpy.ndarray`
Last Jacobian matrix evaluation from a fit procedure.
n_pars : `int`
Total number of parameters in the model (only the ones that have been
fitted). It is related to the degrees of freedom.
Returns
-------
cov : `~numpy.ndarray`
Variance-Covariance matrix. Dimensions :math:`n \\times p`.
corr : `~numpy.ndarray`
Correlation matrix. Dimensions :math:`n \\times p`.
"""
m = res.size # Number of data points used in the fit
p = m - n_pars # Degrees of freedom
# Variance-Covariance matrix
cov = np.dot(res.T, res) / p * np.linalg.inv(np.dot(jac.T, jac))
sigmas2 = np.diag(np.diag(cov)) # Estimated error variance (sigma ** 2)
D = np.linalg.inv(np.sqrt(sigmas2)) # Inverted diagonal variance matrix
corr = np.dot(np.dot(D, cov), D) # Correlation matrix
return cov, corr
[docs]def line_equation(P1, P2, x):
"""
Computes the linear equation solution for the :math:`y` vector values
given two data points, :math:`P_1 = (x_1, y_1)` and :math:`P_2 = (x_2,
y_2)`, and the :math:`x` vector.
Parameters
----------
P1 : `tuple`
First point that belongs to the desired linear equation.
P2 : `tuple`
Second point that belongs to the desired linear equation.
x : `~numpy.ndarray`
Data points from the :math:`x`-axis.
Returns
-------
y : `~numpy.ndarray`
Linear equation :math:`y`-data points.
"""
(x1, y1) = P1
(x2, y2) = P2
y = (y2 - y1) / (x2 - x1) * (x - x1) + y1
return y
[docs]def rms(phase):
"""
Computes the root-mean-square value from a aperture phase distribution
map, :math:`\\varphi(x, y)`.
Parameters
----------
phase : `~numpy.ndarray`
One or two dimensional array for the aperture phase distribution.
"""
# To remove elements out limit radius
nonzero_values = phase[np.nonzero(phase)]
return np.sqrt(np.sum(np.square(nonzero_values)) / nonzero_values.size)