From fc4b9be4d63fd7ac65a9a3e5774c16e984d405a8 Mon Sep 17 00:00:00 2001 From: Daniel Brown <ddb@star.sr.bham.ac.uk> Date: Mon, 1 Dec 2014 11:13:35 +0000 Subject: [PATCH] forgot zernike file... --- pykat/utilities/zernike.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 pykat/utilities/zernike.py diff --git a/pykat/utilities/zernike.py b/pykat/utilities/zernike.py new file mode 100644 index 0000000..4adf65e --- /dev/null +++ b/pykat/utilities/zernike.py @@ -0,0 +1,38 @@ +import numpy as np +from scipy.misc import factorial as fac + +def zernike_R(m, n, rho): + + if ((n-m) % 2): + return rho*0.0 + + nnm = (n-m)/2.0 + npm = (n+m)/2.0 + + R = 0 + + return sum(rho**(n-2.0*k) * (-1.0)**k * fac(n-k) / ( fac(k) * fac(npm - k) * fac(nnm - k)) for k in xrange(int(nnm) + 1)) + +def zernike(m, n, rho, phi): + """ + Computes the zernike polynomial in radial coordinates: + + Z_{n}^{m}(rho, phi) = R_{n}^{m}(rho) cos(m * phi) (even) + R_{n}^{m}(rho) sin(m * phi) (odd) + + Must satisfy n >= m. + """ + + if (n < 0): + raise ValueError("n must be larger than 0") + + if (abs(m) > n): + raise ValueError("Must use m <= n") + + if m > 0: + return zernike_R(m, n, rho) * np.cos(m * phi) + elif m < 0: + return zernike_R(-m, n, rho) * np.sin(-m * phi) + else: + return zernike_R(0, n, rho) + -- GitLab