多体动力学系统的代码生成。
pydy-code-gen的Python项目详细描述
Pydy代码生成
此发行版为PyDy提供代码生成工具。现在,它 生成可以计算普通函数右侧的函数 用sympy.physics.mechanics生成的微分方程 不同的后端:sympy的lambdify、Theano和Cython。
依赖关系
必需
- python:2.7(python 3+可以工作)
- 设置工具
- 纽比:>;=1.6.1
- sympy:>;=0.7.3
可选
- cython:>;=0.15.1
- 序号:>;=0.6.0
- scipy:>;=0.9(仅用于完整示例)
- matplotlib:>;=0.99(仅用于完整示例)
安装这些软件包的方法多种多样。参考scipy 有关详细信息,请参阅堆栈安装说明。
安装
一旦安装了依赖项,就可以从pypi安装包 使用:
$ easy_install pydy-code-gen
或:
$ pip install pydy-code-gen
您还可以获取源代码,然后安装[1]。
使用zip下载:
$ 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 install
使用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/releases or by checking out a tag with Git. |
用法
这是一个简单的1自由度系统的例子:质量,弹簧, 重力和力作用下的阻尼系统:
/ / / / / / / / / ----------------- | | | | g \ | | | V k / --- c | | | | x, v -------- V | m | ----- -------- | F V
导出系统:
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)
将表达式和符号按顺序存储以生成代码:
mass_matrix = kane.mass_matrix_full forcing_vector = kane.forcing_full constants = (mass, stiffness, damping, gravity) coordinates = (position,) speeds = (speed,) specified = (force,)
现在生成数值计算odes所需的函数。这个 生成器可以使用各种后端:lambdify、theano或cython:
from pydy_code_gen.code import generate_ode_function evaluate_ode = generate_ode_function(mass_matrix, forcing_vector, constants, coordinates, speeds, specified, generator='lambdify')
在特定正弦曲线影响下积分运动方程 力:
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,))
绘制结果:
import matplotlib.pyplot as plt plt.plot(t, y) plt.legend((str(position), str(speed))) plt.show()
开发环境
发展依赖性
- 鼻子:1.3.0
安装
以下安装假定您拥有virtualenvwrapper和 生成包所需的依赖项:
$ 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 develop
运行测试:
(pydy-dev)$ nosetests
运行基准测试N连杆摆问题。
(pydy-dev)$ python bin/benchmark_pydy_code_gen.py <max # of links> <# of time steps>
发行说明
0.1.0
- 初始版本。