Skip to main content

Orthogonal polynomials for Python

Project description

orthopy

All about orthogonal polynomials.

PyPi Version PyPI pyversions GitHub stars Downloads

Discord orthogonal

orthopy provides various orthogonal polynomial classes for lines, triangles, disks, spheres, n-cubes, the nD space with weight function exp(-r2) and more. All computations are done using numerically stable recurrence schemes. Furthermore, all functions are fully vectorized and can return results in exact arithmetic.

Installation

Install orthopy from PyPI with

pip install orthopy

How to get a license

Licenses for personal and academic use can be purchased here. You'll receive a confirmation email with a license key. Install the key with

plm add <your-license-key>

on your machine and you're good to go.

For commercial use, please contact support@mondaytech.com.

Basic usage

The main function of all submodules is the iterator Eval which evaluates the series of orthogonal polynomials with increasing degree at given points using a recurrence relation, e.g.,

import orthopy

x = 0.5

evaluator = orthopy.c1.legendre.Eval(x, "classical")
for _ in range(5):
     print(next(evaluator))
1.0          # P_0(0.5)
0.5          # P_1(0.5)
-0.125       # P_2(0.5)
-0.4375      # P_3(0.5)
-0.2890625   # P_4(0.5)

Other ways of getting the first n items are

evaluator = Eval(x, "normal")
vals = [next(evaluator) for _ in range(n)]

import itertools
vals = list(itertools.islice(Eval(x, "normal"), n))

Instead of evaluating at only one point, you can provide any array for x; the polynomials will then be evaluated for all points at once. You can also use sympy for symbolic computation:

import itertools
import orthopy
import sympy

x = sympy.Symbol("x")

evaluator = orthopy.c1.legendre.Eval(x, "classical")
for val in itertools.islice(evaluator, 5):
     print(sympy.expand(val))
1
x
3*x**2/2 - 1/2
5*x**3/2 - 3*x/2
35*x**4/8 - 15*x**2/4 + 3/8

All Eval methods have a scaling argument which can have three values:

  • "monic": The leading coefficient is 1.
  • "classical": The maximum value is 1 (or (n+alpha over n)).
  • "normal": The integral of the squared function over the domain is 1.

For univariate ("one-dimensional") integrals, every new iteration contains one function. For bivariate ("two-dimensional") domains, every level will contain one function more than the previous, and similarly for multivariate families. See the tree plots below.

Line segment (-1, +1) with weight function (1-x)α (1+x)β

Legendre Chebyshev 1 Chebyshev 2

Jacobi, Gegenbauer (α=β), Chebyshev 1 (α=β=-1/2), Chebyshev 2 (α=β=1/2), Legendre (α=β=0) polynomials.

import orthopy

orthopy.c1.legendre.Eval(x, "normal")
orthopy.c1.chebyshev1.Eval(x, "normal")
orthopy.c1.chebyshev2.Eval(x, "normal")
orthopy.c1.gegenbauer.Eval(x, "normal", lmbda)
orthopy.c1.jacobi.Eval(x, "normal", alpha, beta)

The plots above are generated with

import orthopy

orthopy.c1.jacobi.show(5, "normal", 0.0, 0.0)
# plot, savefig also exist

Recurrence coefficients can be explicitly retrieved by

import orthopy

rc = orthopy.c1.jacobi.RecurrenceCoefficients(
    "monic",  # or "classical", "normal"
    alpha=0, beta=0, symbolic=True
)
print(rc.p0)
for k in range(5):
    print(rc[k])
1
(1, 0, None)
(1, 0, 1/3)
(1, 0, 4/15)
(1, 0, 9/35)
(1, 0, 16/63)

1D half-space with weight function xα exp(-r)

(Generalized) Laguerre polynomials.

evaluator = orthopy.e1r.Eval(x, alpha=0, scaling="normal")

1D space with weight function exp(-r2)

Hermite polynomials come in two standardizations:

  • "physicists" (against the weight function exp(-x ** 2)
  • "probabilists" (against the weight function 1 / sqrt(2 * pi) * exp(-x ** 2 / 2)
evaluator = orthopy.e1r2.Eval(
    x,
    "probabilists",  # or "physicists"
    "normal"
)

Associated Legendre "polynomials"

Not all of those are polynomials, so they should really be called associated Legendre functions. The kth iteration contains 2k+1 functions, indexed from -k to k. (See the color grouping in the above plot.)

evaluator = orthopy.c1.associated_legendre.Eval(
    x, phi=None, standardization="natural", with_condon_shortley_phase=True
)

Triangle (T2)

orthopy's triangle orthogonal polynomials are evaluated in terms of barycentric coordinates, so the X.shape[0] has to be 3.

import orthopy

bary = [0.1, 0.7, 0.2]
evaluator = orthopy.t2.Eval(bary, "normal")

Disk (S2)

Xu Zernike Zernike 2

orthopy contains several families of orthogonal polynomials on the unit disk: After Xu, Zernike, and a simplified version of Zernike polynomials.

import orthopy

x = [0.1, -0.3]

evaluator = orthopy.s2.xu.Eval(x, "normal")
# evaluator = orthopy.s2.zernike.Eval(x, "normal")
# evaluator = orthopy.s2.zernike2.Eval(x, "normal")

Sphere (U3)

Complex-valued spherical harmonics, (black=zero, green=real positive, pink=real negative, blue=imaginary positive, yellow=imaginary negative). The functions in the middle are real-valued. The complex angle takes n turns on the nth level.

evaluator = orthopy.u3.EvalCartesian(
    x,
    scaling="quantum mechanic"  # or "acoustic", "geodetic", "schmidt"
)

evaluator = orthopy.u3.EvalSpherical(
    theta_phi,  # polar, azimuthal angles
    scaling="quantum mechanic"  # or "acoustic", "geodetic", "schmidt"
)

n-Cube (Cn)

C1 (Legendre) C2 C3

Jacobi product polynomials. All polynomials are normalized on the n-dimensional cube. The dimensionality is determined by X.shape[0].

evaluator = orthopy.cn.Eval(X, alpha=0, beta=0)
values, degrees = next(evaluator)

nD space with weight function exp(-r2) (Enr2)

E1r2 E2r2 E3r2

Hermite product polynomials. All polynomials are normalized over the measure. The dimensionality is determined by X.shape[0].

evaluator = orthopy.enr2.Eval(
    x,
    standardization="probabilists"  # or "physicists"
)
values, degrees = next(evaluator)

Other tools

  • Generating recurrence coefficients for 1D domains with Stieltjes, Golub-Welsch, Chebyshev, and modified Chebyshev.

  • The the sanity of recurrence coefficients with test 3 from Gautschi's article: computing the weighted sum of orthogonal polynomials:

    orthopy.tools.gautschi_test_3(moments, alpha, beta)
    
  • Clenshaw algorithm for computing the weighted sum of orthogonal polynomials:

    vals = orthopy.c1.clenshaw(a, alpha, beta, t)
    

Relevant publications

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

orthopy-0.10.10a1-cp314-none-any.whl (168.6 kB view details)

Uploaded CPython 3.14

orthopy-0.10.10a1-cp313-none-any.whl (158.0 kB view details)

Uploaded CPython 3.13

orthopy-0.10.10a1-cp312-none-any.whl (157.3 kB view details)

Uploaded CPython 3.12

orthopy-0.10.10a1-cp311-none-any.whl (177.0 kB view details)

Uploaded CPython 3.11

orthopy-0.10.10a1-cp310-none-any.whl (98.2 kB view details)

Uploaded CPython 3.10

File details

Details for the file orthopy-0.10.10a1-cp314-none-any.whl.

File metadata

  • Download URL: orthopy-0.10.10a1-cp314-none-any.whl
  • Upload date:
  • Size: 168.6 kB
  • Tags: CPython 3.14
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orthopy-0.10.10a1-cp314-none-any.whl
Algorithm Hash digest
SHA256 4b3a3998d9dbec74080725b87f80f65ebdb91308d1c10c217a93180a7423f9ba
MD5 08048cf2dc5614d416c7e8b5bbee2ec0
BLAKE2b-256 e46e321b96a9779a35aecda7047ee66908d302c4f459039ae4a382757da5ce28

See more details on using hashes here.

Provenance

The following attestation bundles were made for orthopy-0.10.10a1-cp314-none-any.whl:

Publisher: release.yml on sigma-py/orthopy-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orthopy-0.10.10a1-cp313-none-any.whl.

File metadata

  • Download URL: orthopy-0.10.10a1-cp313-none-any.whl
  • Upload date:
  • Size: 158.0 kB
  • Tags: CPython 3.13
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orthopy-0.10.10a1-cp313-none-any.whl
Algorithm Hash digest
SHA256 0cf953ab81125839ab7b428cb1b05cc195145da338b32a93eb0119d0d014d058
MD5 444ad686c7b6799e7c9021cef3d311c5
BLAKE2b-256 e6375575687c4c1b38ac803314cb361d68bb328c329527da57e00359b3183655

See more details on using hashes here.

Provenance

The following attestation bundles were made for orthopy-0.10.10a1-cp313-none-any.whl:

Publisher: release.yml on sigma-py/orthopy-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orthopy-0.10.10a1-cp312-none-any.whl.

File metadata

  • Download URL: orthopy-0.10.10a1-cp312-none-any.whl
  • Upload date:
  • Size: 157.3 kB
  • Tags: CPython 3.12
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orthopy-0.10.10a1-cp312-none-any.whl
Algorithm Hash digest
SHA256 a676a997060c38057ab78925d63401eca0d97b91f3a9bd2fc61b29bff4aa0450
MD5 7f9f3ad237e9ea43598ed47eae73549b
BLAKE2b-256 fc2d6330fea1ab9fd1fbe91ee76ceb493c7489e3a6161d2bfa33cf9c0cdb9c42

See more details on using hashes here.

Provenance

The following attestation bundles were made for orthopy-0.10.10a1-cp312-none-any.whl:

Publisher: release.yml on sigma-py/orthopy-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orthopy-0.10.10a1-cp311-none-any.whl.

File metadata

  • Download URL: orthopy-0.10.10a1-cp311-none-any.whl
  • Upload date:
  • Size: 177.0 kB
  • Tags: CPython 3.11
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orthopy-0.10.10a1-cp311-none-any.whl
Algorithm Hash digest
SHA256 46fdbbac7d611ae3b9afcf55e793583b3ad2ef8f993dea865f2c5ef93ba91b6e
MD5 191114c1bb916fbdd892d8a0a6c7fd2b
BLAKE2b-256 78b7d80c6dd8a51ab755f884022f9aca631d40afbe4087b633354dbd74ef44c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for orthopy-0.10.10a1-cp311-none-any.whl:

Publisher: release.yml on sigma-py/orthopy-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orthopy-0.10.10a1-cp310-none-any.whl.

File metadata

  • Download URL: orthopy-0.10.10a1-cp310-none-any.whl
  • Upload date:
  • Size: 98.2 kB
  • Tags: CPython 3.10
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for orthopy-0.10.10a1-cp310-none-any.whl
Algorithm Hash digest
SHA256 cf6a43426b8a11dbff48677f725143033e966374a301124d7accd620549fc523
MD5 694f6c196a24af0c760980bad259a3cb
BLAKE2b-256 293ea08e0446e52d630f81f875f9fdef10a560c0d27616f2a2f7cfda765fbe77

See more details on using hashes here.

Provenance

The following attestation bundles were made for orthopy-0.10.10a1-cp310-none-any.whl:

Publisher: release.yml on sigma-py/orthopy-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page