Generate orthogonal set of functions

## Project description

A python package to generate a set of orthogonal functions.

## Description

This package generates a set of orthonormal functions, called , based on the set of non-orthonormal functions defined by the inverse-monomials

The orthonormalized functions are the linear combination of the functions by

The functions are orthonormal in the interval with respect to the weight function . That is,

where is the Kronecker delta function. The orthogonal functions are generated by Gram-Schmidt orthogonalization process. This script produces the symbolic functions using Sympy, a Python computer algebraic package. An application of these orthogonal functions can be found in [1].

## Build and Test Status

Platform

Arch

Python Version

Continuous Integration

3.9

3.10

3.11

Linux

X86-64

macOS

X86-64

Windows

X86-64

## Install

Install using either of the following three methods.

### 1. Install from PyPi

Install using the package available on PyPi by

pip install ortho

### 2. Install from Anaconda Cloud

Install using Anaconda cloud by

conda install -c s-ameli ortho

### 3. Install from Source Code

Install directly from the source code by

git clone https://github.com/ameli/ortho.git
cd ortho
pip install .

## Testing

To test the package, download the source code and use one of the following methods in the directory of the source code:

• Method 1: test locally by:

python setup.py test
• Method 2: test in a virtual environment using tox:

pip install tox
tox

## Usage

The package can be used in two ways:

### 1. Import as a Module

>>> from ortho import OrthogonalFunctions

>>> # Generate object of orthogonal functions
>>> OF = OrthogonalFunctions(
...        start_index=1,
...        num_func=9,
...        end_interval=1,
...        verbose=True)

>>> # Get numeric coefficients alpha[i] and a[i][j]
>>> alpha = OF.alpha
>>> a = OF.coeffs

>>> # Get symbolic coefficients alpha[i] and a[i][j]
>>> sym_alpha = OF.sym_alpha
>>> sym_a = OF.sym_coeffs

>>> # Get symbolic functions phi[i]
>>> sym_phi = OF.sym_phi

>>> # Print Functions
>>> OF.print()

>>> # Check mutual orthogonality of Functions
>>> status = OF.check(verbose=True)

>>> # Plot Functions
>>> OF.plot()

The parameters are:

• start_index: the index of the starting function, . Default is 1.

• num_func: number of orthogonal functions to generate, . Default is 9.

• end_interval: the right interval of orthogonality, . Default is 1.

### 2. Use As Standalone Application

The standalone application can be executed in the terminal in two ways:

1. If you have installed the package, call ortho executable in terminal:

ortho [options]

The optional argument [options] will be explained in the next section. When the package ortho is installed, the executable ortho is located in the /bin directory of the python.

2. Without installing the package, the main script of the package can be executed directly from the source code by

# Download the package
git clone https://github.com/ameli/ortho.git

# Go to the package source directory
cd ortho

# Execute the main script of the package
python -m ortho [options]

### Optional arguments

When the standalone application (the second method in the above) is called, the executable accepts some optional arguments as follows.

Option

Description

-h, --help

Prints a help message.

-v, --version

Prints version.

Prints author info, citation and license.

-n, --num-func[=int]

Number of orthogonal functions to generate. Positive integer. Default is 9.

-s, --start-func[=int]

Starting function index. Non-negative integer. Default is 1.

-e, --end-interval[=float]

End of the interval of functions domains. A real number greater than zero. Default is 1.

-c,--check

Checks orthogonality of generated functions.

-p, --plot

Plots generated functions, also saves the plot as pdf file in the current directory.

### Parameters

The variables , , and can be set in the script by the following arguments,

Variable

Variable in script

Option

start_index

-s, or --start-func

num_func

-n, or --num-func

end_interval

-e, or --end-interval

### Examples

1. Generate nine orthogonal functions from index 1 to 9 (defaults)

ortho
2. Generate eight orthogonal functions from index 1 to 8

ortho -n 8
3. Generate nine orthogonal functions from index 0 to 8

ortho -s 0
4. Generate nine orthogonal functions that are orthonormal in the interval [0,10]

ortho -e 10
5. Check orthogonality of each two functions, plot the orthonormal functions and save the plot to pdf

ortho -c -p
6. A complete example:

ortho -n 9 -s 1 -e 1 -c -p

## Output

• Displays the orthogonal functions as computer algebraic symbolic functions. An example a set of generated functions is shown below.

phi_1(t) =  sqrt(x)
phi_2(t) =  sqrt(6)*(5*x**(1/3) - 6*sqrt(x))/3
phi_3(t) =  sqrt(2)*(21*x**(1/4) - 40*x**(1/3) + 20*sqrt(x))/2
phi_4(t) =  sqrt(10)*(84*x**(1/5) - 210*x**(1/4) + 175*x**(1/3) - 50*sqrt(x))/5
phi_5(t) =  sqrt(3)*(330*x**(1/6) - 1008*x**(1/5) + 1134*x**(1/4) - 560*x**(1/3) + 105*sqrt(x))/3
phi_6(t) =  sqrt(14)*(1287*x**(1/7) - 4620*x**(1/6) + 6468*x**(1/5) - 4410*x**(1/4) + 1470*x**(1/3) - 196*sqrt(x))/7
phi_7(t) =  5005*x**(1/8)/2 - 10296*x**(1/7) + 17160*x**(1/6) - 14784*x**(1/5) + 6930*x**(1/4) - 1680*x**(1/3) + 168*sqrt(x)
phi_8(t) =  sqrt(2)*(19448*x**(1/9) - 90090*x**(1/8) + 173745*x**(1/7) - 180180*x**(1/6) + 108108*x**(1/5) - 37422*x**(1/4) + 6930*x**(1/3) - 540*sqrt(x))/3
phi_9(t) =  sqrt(5)*(75582*x**(1/10) - 388960*x**(1/9) + 850850*x**(1/8) - 1029600*x**(1/7) + 750750*x**(1/6) - 336336*x**(1/5) + 90090*x**(1/4) - 13200*x**(1/3) + 825*sqrt(x))/5
• Displays readable coefficients, and of the functions. For instance,

  i      alpha_i                                    a_[ij]
------  ----------   -----------------------------------------------------------------------
i = 1:  +sqrt(2/2)   [1                                                                    ]
i = 2:  -sqrt(2/3)   [6,   -5                                                              ]
i = 3:  +sqrt(2/4)   [20,  -40,    21                                                      ]
i = 4:  -sqrt(2/5)   [50,  -175,   210,   -84                                              ]
i = 5:  +sqrt(2/6)   [105, -560,   1134,  -1008,   330                                     ]
i = 6:  -sqrt(2/7)   [196, -1470,  4410,  -6468,   4620,   -1287                           ]
i = 7:  +sqrt(2/8)   [336, -3360,  13860, -29568,  34320,  -20592,   5005                  ]
i = 8:  -sqrt(2/9)   [540, -6930,  37422, -108108, 180180, -173745,  90090,  -19448        ]
i = 9:  +sqrt(2/10)  [825, -13200, 90090, -336336, 750750, -1029600, 850850, -388960, 75582]
• Displays the matrix of the mutual inner product of functions to check orthogonality (using option -c). An example of the generated matrix of the mutual inner product of functions is shown below.

[[1 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 1]]
• Plots the set of functions (using option -p) and saves the plot in the current directory. An example of a generated plot is shown below.

## Project details

Uploaded Source
Uploaded Python 3