ortho documentation#

license deploy-docs

A python package to generate a set of orthogonal functions.

Overview#

This package generates a set of orthonormal functions, called \(\phi_i^{\perp}\), based on the set of non-orthonormal functions \(\phi_i\) defined by the inverse-monomials

\[\phi_i(t) = t^{\frac{1}{i+1}}, \qquad i = i_0,\dots,i_0+n.\]

The orthonormalized functions \(\phi_i^{\perp}\) are the linear combination of the functions \(\phi_i\) by

\[\phi_i^{\perp}(t) = \alpha_i \sum_{j = i_0}^{i_0+n} a_{ij} \phi_j(t), \qquad i = i_0,\dots,i_0+n.\]

The functions \(\phi_i^{\perp}\) are orthonormal in the interval \(t \in [0,L]\) with respect to the weight function \(w(t) = t^{-1}\). That is,

\[\langle \phi_i^{\perp},\phi_j^{\perp} \rangle_{L^2([0,L],\mathrm{d}t/t)} = \int_0^L \phi_i^{\perp}(t) \phi_j^{\perp}(t) \frac{\mathrm{d}t}{t} = \delta_{ij},\]

where \(\delta_{ij}\) 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#

codecov-devel

Platform

Arch

Python Version

Continuous Integration

3.9

3.10

3.11

3.12

Linux

X86-64

build-linux

AARCH-64

macOS

X86-64

build-macos

ARM-64

Windows

X86-64

build-windows

ARM-64

Install#

Install using either of the following three methods.

1. Install from PyPi#

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#

release

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, \(i_0\). Default is 1.

  • num_func: number of orthogonal functions to generate, \(n\). Default is 9.

  • end_interval: the right interval of orthogonality, \(L\). 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.

-l, --license

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 \(i_0\), \(n\), and \(L\) can be set in the script by the following arguments,

Variable

Variable in script

Option

\(i_0\)

start_index

-s, or --start-func

\(n\)

num_func

-n, or --num-func

\(L\)

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, \(\alpha_i\) and \(a_{ij}\) 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.

https://raw.githubusercontent.com/ameli/ortho/main/docs/source/images/orthogonal_functions.svg

Citation#