Package: neumann
Neumann- A Python Library for Applied Mathematics in Physical SciencesNeumannis a Python library that provides tools to formulate and solve problems related to all kinds of scientific disciplines. It is a part of the DewLoosh ecosystem which is designed mainly to solve problems related to computational solid mechanics, but if something is general enough, it ends up here. A good example is the included vector and tensor algebra modules, or the various optimizers, which are applicable in a much broader context than they were originally designed for.The most important features:Linear AlgebraA mechanism that guarantees to maintain the property of objectivity of tensorial quantities.AReferenceFrameclass for all kinds of frames, and dedicatedRectangularFrameandCartesianFrameclasses as special cases, all NumPy compliant.NumPy compliant classes likeTensorandVectorto handle various kinds of tensorial quantities efficiently.AJaggedArrayand a Numba-jittablecsr_matrixto handle sparse data.Operations ResearchClasses to define and solve linear and nonlinear optimization problems.ALinearProgrammingProblemclass to define and solve any kind of linear optimization problem.ABinaryGeneticAlgorithmclass to tackle more complicated optimization problems.Graph TheoryAlgorithms to calculate rooted level structures and pseudo peripheral nodes of anetworkxgraph, which are useful if you want to minimize the bandwidth of sparse symmetrix matrices.NoteBe 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.DocumentationThe documentation is hosted onReadTheDocs.InstallationNeumanncan be installed (either in a virtual enviroment or globally) from PyPI usingpipon Python >= 3.7:>>> pip install neumannor chechkout with the following command using GitHub CLIgh repo clone dewloosh/Neumannand install from source by typing>>> python install setup.pyMotivating ExamplesLinear AlgebraDefine a reference frame $\mathbf{B}$ relative to the frame $\mathbf{A}$:>>>fromneumann.linalgimportReferenceFrame,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 theDCM matrixof 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 ProgrammingSolve the following Linear Programming Problem (LPP) with one unique solution:>>>fromneumann.optimizeimportLinearProgrammingProblemasLPP>>>fromneumann.functionimportFunction,Equality>>>importsympyassy>>>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 ProgrammingFind the minimizer of the Rosenbrock function:>>>fromneumann.optimizeimportBinaryGeneticAlgorithm>>>defRosenbrock(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()...LicenseThis package is licensed under the MIT license.