面向Autolev用户的SymPy Mechanism#
介绍#
Autolev(现在被MotionGenesis取代)是一种特定于领域的编程语言,用于符号多体动力学。SymPy mechanics模块现在有足够的能力和功能,可以成为一个功能齐全的符号动力学模块。PyDy软件包将SymPy的输出扩展到数值领域,用于模拟、分析和可视化。Autolev和SymPy Mechanism有许多共同之处,但它们之间也有许多不同之处。这一页将详述他们的分歧。这是一个前往参考的Autolev用户谁想过渡到交响力学。
在翻阅这一页之前,最好对共线和共线力学有一个基本的了解。如果您对Python完全陌生,可以查看 Python Tutorial . 查看 SymPy Documentation ,尤其是让你感受到sypy的教程。对于Python中多体动力学的介绍, this 讲座很有帮助。
你也可以找到 Autolev Parser 这是同情的一部分。
一些关键区别#
Autolev |
共线力学 |
---|---|
Autolev是一种特定于领域的编程语言,用于执行多体动力学。由于它是一种自己的语言,它有一个非常严格的语言规范。它根据输入代码预定义、假设和计算许多事情。因此,它的代码更加简洁明了。
|
SymPy是一个用通用语言Python编写的库。尽管Autolev的代码更紧凑,但SymPy(作为Python的附加组件)更灵活。用户对他们能做的事情有更多的控制权。例如,我们可以在他们的代码中创建一个类,比如一类具有公共属性的rigibody。大量的科学Python库也是一大优势。
|
Autolev从一小部分符号数学中生成Matlab、C或Fortran代码。
|
SymPy从用sypy创建的大量符号数学集合生成Python、C或Octave/Matlab代码。它还建立在流行的科学Python堆栈之上,如NumPy、SciPy、IPython、matplotlib、Cython和Theano。
|
Autolev使用基于1(一)的索引。序列的初始元素使用 [1] .
|
python使用基于0(零)的索引。序列的初始元素使用 [0] .
|
Autolev不区分大小写。
|
SymPy代码是Python代码,区分大小写。
|
人们可以在Autolev中定义自己的命令,方法是生成可以在程序中使用的.R和.A文件。
|
SymPy代码是Python代码,因此可以在代码中定义函数。这样方便多了。
|
Autolev是专有的。
|
SymPy是开源的。
|
粗略的Autolev SymPy等价物#
下表给出了一些常见的Autolev表达式的粗略等价物。 这些不是确切的等价物 ,但应该被视为提示,让你朝着正确的方向前进。有关更多详细信息,请阅读 SymPy vectors , SymPy mechanics 和 PyDy .
在下表中,假设您已经在Python中执行了以下命令:::
import sympy.physics.mechanics as me
import sympy as sm
数学等价物#
Autolev |
SymPy |
Notes |
---|---|---|
Constants A, B |
a, b =
sm.symbols(‘a
b’, real=True) |
请注意,符号的名称可以不同于它们被指定给的变量的名称。我们可以定义
a, b = symbols(‘b a’) 但遵循惯例是很好的做法。 |
Constants C+ |
c = sm.symbols(‘c’,
real=True,
nonnegative=True) |
参考SymPy assumptions 更多信息。
|
Constants D- |
d = sm.symbols(‘d’,
real=True,
nonpositive=True) |
|
Constants K{4} |
k1, k2, k3, k4 =
sm.symbols('k1 k2 k3
k4', real=True) |
|
Constants a{2:4} |
a2, a3, a4 =
sm.symbols('a2 a3 a4',
real=True) |
|
Constants
b{1:2, 1:2} |
b11, b12, b21, b22 =
sm.symbols('b11 b12
b21 b22', real=True) |
|
Specified Phi |
phi =
me.dynamicsymbols(‘phi
') |
|
Variables q, s |
q, s =
me.dynamicsymbols(q,
s) |
|
|
|
|
|
|
|
|
|
在声明过程中,SymPy不区分变量、运动变量和指定项。相反,它将这些元素的不同列表作为KanesMethod等对象的参数。 |
|
|
我是一个共形物体,代表想象单位。我们可以用它来定义复数。
其中x、y和z是符号。 |
|
|
使用 |
abs(x)^3 + sin(x)^2
+ acos(x) |
sm.abs(x)**3
+ sm.sin(x)**2 +
sm.acos(x) |
|
|
|
有关更多信息,请参阅 simplification. 这些sypy函数不能正常工作。它们只是返回表达式。如果要覆盖原始表达式,则必须执行以下操作:
|
|
如果表达式由dynamicsymbols组成,则有效。
|
有关更多信息,请参阅 calculus. |
|
|
有关更多信息,请参阅 series. |
|
要从数值表达式中获取浮点数,请使用
|
|
|
|
有关更多信息,请参阅 polys. |
|
|
For more information refer to 解算器. For numerical computation related to polynomials and roots refer to mpmath/calculus. |
其中A是表示线性方程组的增广矩阵,x1、x2是要求解的变量。 |
其中A是增广矩阵 |
有关更多信息,请参阅 :ref:` solvers/solveset. <solveset>` For non linear solvers
refer to
|
|
|
有关更多信息,请参阅 matrices. |
物理等效物#
Autolev |
SymPy |
Notes |
---|---|---|
它的法向量A3>A,和它的法向量A1>A3>A。 |
Af.x、Af.y和Af.z相当于A1>、A2>和A3>。 |
第四和第五个论点是关于质量和惯性的。它们在Autolev中的声明之后指定。 可以为参数传递一个伪参数并使用setter 有关更多信息,请参阅 mechanics/masses . |
|
|
有关更多信息,请参阅 physics/vectors. |
|
|
SymPy并没有指定一个帧在声明过程中是惯性的。许多功能,如 |
|
|
第二个和第三个参数是点和质量。在Autolev中,这些是在声明之后指定的。 一个人可以通过一个假人和使用二传手 ( |
|
|
|
|
|
|
|
利用向量外积也可以形成惯性并矢。
|
有关更多信息,请参阅 mechanics api. |
|
|
有关更多信息,请参阅 physics/vectors. |
|
其中A是参考坐标系。
|
有关更多信息,请参阅 kinematics api. 所有这些矢量和运动学函数都将用于 |
|
|
吸气剂应该是 |
参考坐标系N中O点的加速度。 |
|
吸气剂应该是 |
参考系F中物体B的角速度。 |
其中Bf是与主体B相关联的框架。 |
吸气剂应该是 |
参考系N中物体B的角加速度。 |
|
吸气剂应该是 |
|
在SymPy中,应该有一个包含所有力和力矩的列表。
其中fL是力。
|
|
|
|
|
|
|
|
|
|
|
|
|
假设P和Q为 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在SymPy中,我们必须使用一个包含元组形式的forceList(这里是fL) |
|
|
|
|
|
|
|
|
|
|
|
|
|
后接一个或多个实体的参考框架
点,后接一个或多个实体的参考坐标系 |
|
|
后接一个或多个实体的参考框架 |
|
|
这些列表被传递给KanesMethod对象。 |
有关详细信息,请参阅 mechanics/kane 以及 kane api. |
|
KanesMethod对象接受后跟多个列表的参考帧作为参数。
|
有关详细信息,请参阅 mechanics/kane 以及 kane api. |
数值计算与可视化#
Autolev的CODE Option()命令允许生成Matlab、C或Fortran代码,以便进行数值计算和可视化。选项可以是动力学、ODE、非线性或代数。
动力学数值计算可以用PyDy实现。可以将KanesMethod对象与常量、指定值、初始条件和时间点的值一起传递给System类。然后就可以积分运动方程了。绘图是使用matlplotlib实现的。下面是来自 PyDy Documentation 关于如何做到这一点:
from numpy import array, linspace, sin
from pydy.system import System
sys = System(kane,
constants = {mass: 1.0, stiffness: 1.0,
damping: 0.2, gravity: 9.8},
specifieds = {force: lambda x, t: sin(t)},
initial_conditions = {position: 0.1, speed:-1.0},
times = linspace(0.0, 10.0, 1000))
y = sys.integrate()
import matplotlib.pyplot as plt
plt.plot(sys.times, y)
plt.legend((str(position), str(speed)))
plt.show()
有关PyDy可以完成的所有事情的信息,请参阅 PyDy Documentation .
PyDy工作流中的工具包括:
- SymPy: SymPy是一个Python库,用于
符号计算。它提供计算机代数功能,可以作为独立应用程序,也可以作为其他应用程序的库,或者以SymPy live或SymPy Gamma的形式在线运行。
- NumPy: NumPy is a library for the
Python编程语言,增加了对大型多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数集合。
- SciPy: SciPy is an open source
用于科学计算和技术计算的Python库。SciPy包含优化、线性代数、积分、插值、特殊函数、FFT、信号和图像处理、ODE解算器以及其他科学和工程中常见任务的模块。
- IPython: IPython是一个命令shell
对于多编程语言的交互式计算,最初是为Python编程语言开发的,它提供了自省、富媒体、shell语法、制表符补全和历史记录。
- Aesara: Aesara is
a numerical computation library for Python. In Aesara, computations are expressed using a NumPy-esque syntax and compiled to run efficiently on either CPU or GPU architectures.
- Cython: Cython is a superset of the
Python编程语言,用于在代码中提供类C性能,这些代码主要是用Python编写的。Cython是一种编译语言,它生成CPython扩展模块。
- matplotlib: matplotlib是一个
Python编程语言的绘图库及其数值数学扩展NumPy。
人们将能够使用这些科学计算工具编写相当于Autolev生成的Matlab、C或Fortran代码的代码。我们建议您先了解一下Python的计算模块。