SymPy 力学 适用于 Autolev 用户¶
介绍¶
Autolev(现已被MotionGenesis取代)是一种用于符号多体动力学的特定领域编程语言。SymPy力学模块现在具有足够的功能和能力,可以成为一个功能齐全的符号动力学模块。PyDy包扩展了SymPy的输出,使其适用于数值模拟、分析和可视化。Autolev和SymPy力学有很多共同点,但它们之间也存在许多差异。本页将详细阐述这些差异。它旨在为希望过渡到SymPy力学的Autolev用户提供参考。
在阅读此页面前,最好对 SymPy 和 SymPy 力学有一个基本的了解。如果你完全不熟悉 Python,可以查看官方的 Python 教程。查看 SymPy 文档,特别是教程,以了解 SymPy 的使用。对于 Python 中多体动力学的介绍,这个 讲座非常有帮助。
您可能还会发现 Autolev 解析器 ,这是 SymPy 的一部分,对您有所帮助。
一些关键差异¶
Autolev |
SymPy 力学 |
---|---|
Autolev 是一种专门用于多体动力学的编程语言。由于它是一种独立的语言,因此具有非常严格的语言规范。它根据输入代码预定义、假设并计算许多内容。因此,其代码非常简洁。
|
SymPy 是一个用通用语言 Python 编写的库。尽管 Autolev 的代码更紧凑,但 SymPy(由于是 Python 的附加组件)更加灵活。用户对其所能做的事情有更多的控制权。例如,可以在他们的代码中为某种具有共同属性的刚体创建一个类。可用的广泛的科学 Python 库也是一个很大的优势。
|
Autolev 从一小部分符号数学中生成 Matlab、C 或 Fortran 代码。
|
SymPy 从使用 SymPy 创建的大量符号数学中生成数值 Python、C 或 Octave/Matlab 代码。它还基于流行的科学 Python 堆栈,如 NumPy、SciPy、IPython、matplotlib、Cython 和 Theano。
|
Autolev 使用基于 1 的索引。序列的初始元素通过 a[1] 找到。
|
Python 使用 0(零)为基础的索引。序列的初始元素通过 a[0] 找到。
|
Autolev 是不区分大小写的。
|
SymPy 代码作为 Python 代码是区分大小写的。
|
在Autolev中,用户可以通过创建 .R 和 .A 文件来定义自己的命令,这些文件可以在他们的程序中使用。
|
SymPy 代码是 Python 代码,因此可以在代码中定义函数。这非常方便。
|
Autolev 是专有的。
|
SymPy 是开源的。
|
粗略的 Autolev-SymPy 等价物¶
下表给出了一些常见 Autolev 表达式的粗略等价物。这些并不是精确的等价物,而是应该作为提示,帮助你朝着正确的方向前进。更多细节请阅读内置文档中关于 SymPy 向量、SymPy 力学 和 PyDy 的内容。
在下面的表格中,假设您已经在Python中执行了以下命令:
import sympy.physics.mechanics as me
import sympy as sm
数学等价物¶
Autolev |
SymPy |
注释 |
---|---|---|
常量 A, B |
a, b =
sm.symbols(‘a
b’, real=True) |
请注意,符号的名称可以与它们所赋值的变量名称不同。我们可以定义
a, b = symbols(‘b a’) 但遵循约定是一个好的做法。 |
常量 C+ |
c = sm.symbols(‘c’,
real=True,
nonnegative=True) |
更多信息请参考 SymPy 假设。
|
常量 D- |
d = sm.symbols(‘d’,
real=True,
nonpositive=True) |
|
常量 K{4} |
k1, k2, k3, k4 =
sm.symbols('k1 k2 k3
k4', real=True) |
|
常量 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) |
|
指定的Phi |
phi =
me.dynamicsymbols(‘phi
') |
|
变量 q, s |
q, s =
me.dynamicsymbols(q,
s) |
|
|
|
|
|
|
|
|
|
SymPy 在声明时不区分变量、运动变量和指定变量。相反,它在 KanesMethod 等对象中将这些变量的不同列表作为参数。 |
|
|
I 是一个代表虚数单位的 sympy 对象。可以使用它来定义复数。
其中 x、y 和 z 是符号。 |
|
|
使用 |
abs(x)^3 + sin(x)^2
+ acos(x) |
sm.abs(x)**3
+ sm.sin(x)**2 +
sm.acos(x) |
|
|
|
更多信息请参考 简化。 这些 SymPy 函数不会就地工作。它们只是返回表达式。如果你想覆盖原始表达式,你需要做类似的事情:
|
|
如果表达式由dynamicsymbols组成,则该方法有效。
|
更多信息请参考 微积分。 |
|
|
更多信息请参考 系列。 |
|
要从数值表达式中获取浮点数,请使用
|
|
|
|
更多信息请参考 polys. |
|
|
更多信息请参考 求解器。 关于与多项式和根相关的数值计算,请参考 mpmath/calculus. |
其中 A 是一个表示线性方程的增广矩阵,x1, x2 是待求解的变量。 |
其中 A 是一个增广矩阵 |
更多信息请参考 :ref:` solvers/solveset. <solveset>` 对于非线性求解器,请参考 求解器文档 中的 |
|
|
更多信息请参考 矩阵。 |
物理等效物¶
Autolev |
SymPy |
注释 |
---|---|---|
声明 A,其质心 Ao,以及在 A 中固定的正交向量 A1>、A2> 和 A3>。 |
Af.x、Af.y 和 Af.z 等同于 A1>、A2> 和 A3>。 |
第4和第5个参数用于质量和惯性。这些在Autolev中的声明之后指定。 可以使用参数的占位符,并通过设置器 更多信息请参考 mechanics/masses . |
|
|
更多信息请参考 物理/向量。 |
|
|
SymPy 在声明时并不指定框架是否为惯性。许多函数,如 |
|
|
第二个和第三个参数用于点和质量。在Autolev中,这些是在声明之后指定的。 可以使用一个虚拟对象并通过设置器( |
|
|
|
|
|
|
|
惯性二元组也可以使用向量的外积来形成。
|
更多信息请参考 mechanics api. |
|
|
更多信息请参考 物理/向量。 |
|
其中 A 是一个参考系。
|
更多信息请参考 运动学 API。 所有这些向量和运动学函数都应作用于 |
|
|
获取器将是 |
参考系N中点O的加速度。 |
|
获取器将是 |
参考系F中物体B的角速度。 |
其中 Bf 是与物体 B 相关联的框架。 |
获取器将是 |
参考系N中物体B的角加速度。 |
|
获取器将是 |
|
在 SymPy 中,应该有一个包含所有力和力矩的列表。
其中 fL 是力列表。
|
|
|
|
|
|
|
|
|
|
|
|
|
这里假设 P 和 Q 是 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 SymPy 中,我们必须使用一个包含形式为 |
|
|
|
|
|
|
|
|
|
|
|
|
|
参考系后跟随一个或多个物体
点,参考系后跟一个或多个物体 |
|
|
参考系后跟随一个或多个物体 |
|
|
这些列表被传递给 KanesMethod 对象。 |
更多详情请参阅 mechanics/kane 和 kane api. |
|
KanesMethod 对象接受一个参考系,后跟多个列表作为参数。
|
更多详情请参阅 mechanics/kane 和 kane api. |
数值评估与可视化¶
Autolev 的 CODE Option() 命令允许用户生成用于数值评估和可视化的 Matlab、C 或 Fortran 代码。选项可以是 Dynamics、ODE、Nonlinear 或 Algebraic。
可以使用 PyDy 进行动力学的数值评估。可以将 KanesMethod 对象与常量、指定量、初始条件和时间步长的值一起传递给 System 类。然后可以对运动方程进行积分。绘图使用 matlplotlib 实现。以下是来自 PyDy 文档 的一个示例,展示了如何完成:
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 文档。
PyDy 工作流程中的工具有:
- SymPy: SymPy 是一个用于
符号计算。它提供了计算机代数功能,既可以作为一个独立应用程序,也可以作为其他应用程序的库,或者在网络上作为 SymPy Live 或 SymPy Gamma 实时运行。
- NumPy: NumPy 是一个用于
Python 编程语言,增加了对大型、多维数组和矩阵的支持,以及大量用于操作这些数组的高级数学函数。
- SciPy: SciPy 是一个开源项目
用于科学计算和技术计算的Python库。SciPy包含用于优化、线性代数、积分、插值、特殊函数、FFT、信号和图像处理、ODE求解器以及其他科学和工程中常见任务的模块。
- IPython: IPython 是一个命令行 shell
用于多种编程语言的交互式计算,最初为 Python 编程语言开发,提供内省、丰富的媒体、shell 语法、Tab 补全和历史记录。
- Aesara: Aesara 是一个
一个用于Python的数值计算库。在Aesara中,计算使用类似NumPy的语法表达,并编译为在CPU或GPU架构上高效运行。
- Cython: Cython 是 Python 的超集
Python 编程语言,旨在以主要用 Python 编写的代码提供类似 C 的性能。Cython 是一种编译语言,生成 CPython 扩展模块。
- matplotlib: matplotlib 是一个
用于Python编程语言及其数值数学扩展NumPy的绘图库。
通过这些科学计算工具,人们将能够编写与Autolev生成的Matlab、C或Fortran代码等效的代码。建议浏览这些模块,以深入理解使用Python进行科学计算。