Module alexandria.math.interpolation
Interpolation methods
Expand source code
# SPDX-FileCopyrightText: © 2021 Antonio López Rivera <antonlopezr99@gmail.com>
# SPDX-License-Identifier: GPL-3.0-only
"""
Interpolation methods
---------------------
"""
import numpy as np
def polyfit(x, y, z, kx=3, ky=3):
"""
Polyfit-function, adapted from answers provided by
https://stackoverflow.com/questions/33964913/equivalent-of-polyfit-for-a-2d-polynomial-in-python
:param x: Domain 1.
:param y: Domain 2.
:param z: Function.
:param kx: Polynomial order in x.
:param ky: Polynomial order in y.
:type x: np.ndarray
:type y: np.ndarray
:type z: np.ndarray
:type kx: float
:type ky: float
:return:
"""
def transform_x(_x):
return -1 + 2 * (_x - xmin)/(xmax - xmin)
def transform_y(_y):
return -1 + 2 * (_y - ymin)/(ymax - ymin)
xmax = np.amax(x)
xmin = np.amin(x)
ymax = np.amax(y)
ymin = np.amin(y)
x = transform_x(x)
y = transform_y(y)
xx, yy = np.meshgrid(x,y,copy=False)
coef = np.ones((kx+1,ky+1))
A = np.zeros((coef.size,xx.size))
for index, (i, j) in enumerate(np.ndindex(coef.shape)):
arr = coef[i,j] * xx**i * yy**j
A[index] = arr.ravel()
coef, r, rank, s = np.linalg.lstsq(A.T,np.ravel(z),rcond=None)
res = lambda x,y: np.polynomial.polynomial.polyval2d(transform_x(x),
transform_y(y),
coef.reshape((kx+1,
ky+1)))
return res, r
Functions
def polyfit(x, y, z, kx=3, ky=3)
-
Polyfit-function, adapted from answers provided by https://stackoverflow.com/questions/33964913/equivalent-of-polyfit-for-a-2d-polynomial-in-python
:param x: Domain 1. :param y: Domain 2. :param z: Function. :param kx: Polynomial order in x. :param ky: Polynomial order in y.
:type x: np.ndarray :type y: np.ndarray :type z: np.ndarray :type kx: float :type ky: float
:return:
Expand source code
def polyfit(x, y, z, kx=3, ky=3): """ Polyfit-function, adapted from answers provided by https://stackoverflow.com/questions/33964913/equivalent-of-polyfit-for-a-2d-polynomial-in-python :param x: Domain 1. :param y: Domain 2. :param z: Function. :param kx: Polynomial order in x. :param ky: Polynomial order in y. :type x: np.ndarray :type y: np.ndarray :type z: np.ndarray :type kx: float :type ky: float :return: """ def transform_x(_x): return -1 + 2 * (_x - xmin)/(xmax - xmin) def transform_y(_y): return -1 + 2 * (_y - ymin)/(ymax - ymin) xmax = np.amax(x) xmin = np.amin(x) ymax = np.amax(y) ymin = np.amin(y) x = transform_x(x) y = transform_y(y) xx, yy = np.meshgrid(x,y,copy=False) coef = np.ones((kx+1,ky+1)) A = np.zeros((coef.size,xx.size)) for index, (i, j) in enumerate(np.ndindex(coef.shape)): arr = coef[i,j] * xx**i * yy**j A[index] = arr.ravel() coef, r, rank, s = np.linalg.lstsq(A.T,np.ravel(z),rcond=None) res = lambda x,y: np.polynomial.polynomial.polyval2d(transform_x(x), transform_y(y), coef.reshape((kx+1, ky+1))) return res, r