Package: pydy-code-gen
PyDy Code GenerationThis distribution provides code generation facilities forPyDy. For now, it
generates functions that can evaluate the right hand side of the ordinary
differential equations generated withsympy.physics.mechanicswith three
different backends: SymPy’slambdify,Theano, andCython.DependenciesRequiredPython: 2.7 (Python 3+ may work)setuptoolsNumPy: >=1.6.1SymPy: >=0.7.3OptionalCython: >=0.15.1Theano: >=0.6.0SciPy: >=0.9 (only for full examples)matplotlib: >=0.99 (only for full examples)There are a variety of methods to install these packages. Refer to the SciPy
Stack installation instructions for details.InstallationOnce the dependencies are installed, the package can be installed from PyPi
using:$ easy_install pydy-code-genor:$ pip install pydy-code-genYou can also grab the source and then install[1].Using the zip download:$ wget https://github.com/PythonDynamics/pydy-code-gen/archive/master.zip
$ unzip pydy-code-gen-master.zip
$ cd pydy-code-gen-master
$ python setup.py installUsing Git:$ git clone https://github.com/PythonDynamics/pydy-code-gen.git
$ cd pydy-code-gen
$ python setup.py install[1]Note that this is the latest development version. Specific releases
can be found here:https://github.com/PythonDynamics/pydy-code-gen/releasesor by checking out a tag with Git.UsageThis is an example of a simple 1 degree of freedom system: a mass, spring,
damper system under the influence of gravity and a force:/ / / / / / / / /
-----------------
  |    |     |   | g
  \   | |    |   V
k /   --- c  |
  |    |     | x, v
 --------    V
 |  m   | -----
 --------
    | F
    VDerive the system:from sympy import symbols
import sympy.physics.mechanics as me

mass, stiffness, damping, gravity = symbols('m, k, c, g')

position, speed = me.dynamicsymbols('x v')
positiond = me.dynamicsymbols('x', 1)
force = me.dynamicsymbols('F')

ceiling = me.ReferenceFrame('N')

origin = me.Point('origin')
origin.set_vel(ceiling, 0)

center = origin.locatenew('center', position * ceiling.x)
center.set_vel(ceiling, speed * ceiling.x)

block = me.Particle('block', center, mass)

kinematic_equations = [speed - positiond]

force_magnitude = mass * gravity - stiffness * position - damping * speed + force
forces = [(center, force_magnitude * ceiling.x)]

particles = [block]

kane = me.KanesMethod(ceiling, q_ind=[position], u_ind=[speed],
                     kd_eqs=kinematic_equations)
kane.kanes_equations(forces, particles)Store the expressions and symbols in sequences for the code generation:mass_matrix = kane.mass_matrix_full
forcing_vector = kane.forcing_full
constants = (mass, stiffness, damping, gravity)
coordinates = (position,)
speeds = (speed,)
specified = (force,)Now generate the function needed for numerical evaluation of the ODEs. The
generator can use various back ends:lambdify,theano, orcython:from pydy_code_gen.code import generate_ode_function

evaluate_ode = generate_ode_function(mass_matrix, forcing_vector, constants,
                                     coordinates, speeds, specified,
                                     generator='lambdify')Integrate the equations of motion under the influence of a specified sinusoidal
force:from numpy import array, linspace, sin
from scipy.integrate import odeint

x0 = array([0.1, -1.0])
args = {'constants': array([1.0, 1.0, 0.2, 9.8]),
        'specified': lambda x, t: sin(t)}
t = linspace(0.0, 10.0, 1000)

y = odeint(evaluate_ode, x0, t, args=(args,))Plot the results:import matplotlib.pyplot as plt

plt.plot(t, y)
plt.legend((str(position), str(speed)))
plt.show()Development EnvironmentDevelopment Dependenciesnose: 1.3.0InstallationThe following installation assumes you havevirtualenvwrapperand all the
dependencies needed to build the packages:$ mkvirtualenv pydy-dev
(pydy-dev)$ pip install numpy scipy cython nose theano sympy
(pydy-dev)$ pip install matplotlib # make sure to do this after numpy
(pydy-dev)$ git clone git@github.com:PythonDynamics/pydy-code-gen.git
(pydy-dev)$ cd pydy-code-gen
(pydy-dev)$ python setup.py developRun the tests:(pydy-dev)$ nosetestsRun the benchmark to test the n-link pendulum problem.:(pydy-dev)$ python bin/benchmark_pydy_code_gen.py <max # of links> <# of time steps>Release Notes0.1.0Initial version.