Neumann - A Python Library for Applied Mathematics in Physical Sciences#
Important
Neumann is in the early stages of it’s lifetime, and some concepts may change in the future. If you want long-term stability, wait until version 1.0, which is planned to be released if the core concepts all seem to sit. Nonetheless, the library is well tested with a coverage value above 90%, so if something catches your eye use it with confidence, just don’t forget to pin down the version of Neumann in your ‘requirements.txt’.
Features#
Linear Algebra
A mechanism that guarantees to maintain the property of objectivity of tensorial quantities.
A
ReferenceFrameclass for all kinds of frames, and dedicatedRectangularFrameandCartesianFrameclasses as special cases, all NumPy compliant.NumPy compliant classes like
TensorandVectorto handle various kinds of tensorial quantities efficiently.A
JaggedArrayand a Numba-jittablecsr_matrixto handle sparse data.
Operations Research
Classes to define and solve linear and nonlinear optimization problems.
A
LinearProgrammingProblemclass to define and solve any kind of linear optimization problem.A
BinaryGeneticAlgorithmclass to tackle more complicated optimization problems.
Graph Theory
Algorithms to calculate rooted level structures and pseudo peripheral nodes of a
networkxgraph, which are useful if you want to minimize the bandwidth of sparse symmetrix matrices.
Important
Be aware, that the library uses JIT-compilation through Numba, and as a result, first calls to these functions may take longer, but pay off in the long run.
Tip
Create a minimal example that best describes a typical usage scenario of yours and name it like ‘compile.py’ or so. You can integrate this file into your CI/CD workflow.
A Quick Guide#
Installation#
Neumann can be installed (either in a virtual enviroment or globally) from PyPI using pip on Python >= 3.7:
>>> pip install neumann
or chechkout with the following command using GitHub CLI
>>> gh repo clone dewloosh/Neumann
and install from source by typing
>>> python install setup.py
Motivating Examples#
Linear Algebra#
Define a reference frame $\mathbf{B}$ relative to the frame $\mathbf{A}$:
>>> from neumann.linalg import ReferenceFrame, Vector, Tensor
>>> A = ReferenceFrame(name='A', axes=np.eye(3))
>>> B = A.orient_new('Body', [0, 0, 90*np.pi/180], 'XYZ', name='B')
Get the DCM matrix of the transformation between two frames:
>>> B.dcm(target=A)
Define a vector $\mathbf{v}$ in frame $\mathbf{A}$ and show the components of it in frame $\mathbf{B}$:
>>> v = Vector([0.0, 1.0, 0.0], frame=A)
>>> v.show(B)
Define the same vector in frame $\mathbf{B}$:
>>> v = Vector(v.show(B), frame=B)
>>> v.show(A)
Linear Programming#
Solve the following Linear Programming Problem (LPP) with one unique solution:
>>> from neumann.optimize import LinearProgrammingProblem as LPP
>>> from neumann.function import Function, Equality
>>> import sympy as sy
>>> variables = ['x1', 'x2', 'x3', 'x4']
>>> x1, x2, x3, x4 = syms = sy.symbols(variables, positive=True)
>>> obj1 = Function(3*x1 + 9*x3 + x2 + x4, variables=syms)
>>> eq11 = Equality(x1 + 2*x3 + x4 - 4, variables=syms)
>>> eq12 = Equality(x2 + x3 - x4 - 2, variables=syms)
>>> problem = LPP(cost=obj1, constraints=[eq11, eq12], variables=syms)
>>> problem.solve()['x']
array([0., 6., 0., 4.])
NonLinear Programming#
Find the minimizer of the Rosenbrock function:
>>> from neumann.optimize import BinaryGeneticAlgorithm
>>> def Rosenbrock(x):
... a, b = 1, 100
... return (a-x[0])**2 + b*(x[1]-x[0]**2)**2
>>> ranges = [[-10, 10], [-10, 10]]
>>> BGA = BinaryGeneticAlgorithm(Rosenbrock, ranges, length=12, nPop=200)
>>> BGA.solve()
...