Metadata-Version: 2.1
Name: pyfunctionbases
Version: 1.0
Summary: A Python module to compute multidimensional arrays of evaluated functions.
Home-page: https://github.com/NiMlr/PyFunctionBases
Author: Nils Mueller
Author-email: nils.mueller@ini.rub.de
License: MIT
Platform: UNKNOWN

# PyFunctionBases
A Python module to compute multidimensional arrays of evaluated functions based on Numpy.

Specifically, the module evaluates basis functions on intervals by employing a recursive formula of type
<p align="center">
<img src="https://latex.codecogs.com/gif.latex?f_{n&plus;1}(x)&space;=&space;g(f_n(x),&space;\dots,&space;f_0(x),x)." title="f_{n+1}(x) = g(f_n(x), \dots, f_0(x),x)." />
</p>

This is generalized to the multi-dimensional case by using a tensor product
<p align="center">
<img src="https://latex.codecogs.com/gif.latex?(x,y)&space;\mapsto&space;f_i(x)f_j(y)" />
</p>

repeatedly on coordinate wise one-dimensional function bases. The code is vectorized over the evalution points


<img src="https://latex.codecogs.com/gif.latex?x_m&space;\in&space;\mathbb{R}^{num\_dim},&space;m&space;\in&space;\{1,&space;\dots,&space;num\_samples\}" />


and returns a multi-dimensional array of shape `(num_samples, degree+1, ..., degree+1)`, where `degree`
is the cardinality of the one-dimensional bases omitting a constant function. Currently, the following functions are available:


| Name | Domain |  
|-------|-----------|
| [`standard_poly`](https://en.wikipedia.org/wiki/Polynomial) | `[-Inf, Inf]`|
| [`legendre_poly`](https://en.wikipedia.org/wiki/Legendre_polynomials) | `[-1, 1]`|
| [`legendre_rational`](https://en.wikipedia.org/wiki/Legendre_rational_functions) | `[0, Inf]`|
| [`chebyshev_poly`](https://en.wikipedia.org/wiki/Chebyshev_polynomials#First_kind) | `[-1, 1]`|

Please make sure that your data lies in these domains, checks will be run if desired.

### Contents
[1. Installation](#installation)  
[2. Simple Usage](#simple-usage)  


## Installation 
Requirements: `pip3 install numpy`

```bash
pip3 install pyfunctionbases
```


## Simple Usage
Now a simple example using standard polynomials is given. By exchanging the name parameter, you can try different functions.

```python
from pyfunctionbases import RecursiveExpansion
import numpy as np

# create some data to evaluate basis functions on<
num_samples = 1000
num_dim = 2
x = np.random.uniform(low=0.0, high=1.0, size=(num_samples, num_dim))

# create an expansion object where name can be any
# function name, that is in the table below
degree = 10
name = 'standard_poly'
expn = RecursiveExpansion(degree, recf=name)

# evaluate the function, result is of shape (num_samples, degree+1, degree+1)
f_ij = expn.execute(x, check=True)

# flatten the result if needed
f_k = f_ij.reshape(num_samples,(degree+1)**num_dim)
```


