物理学/力学中的潜在问题/高级主题/未来特性

本文档将描述该模块提供的一些更高级的功能,但这些功能不属于“官方”接口的一部分。在这里,还将涵盖未来将实现的一些功能,以及关于适当功能的未解答问题。此外,还将讨论常见问题及其一些解决方案。

常见问题

这里会出现数值积分代码的问题,坐标和速度表示的 dynamicsymbols 选择,打印,微分和替换的问题。

数值积分代码

查看未来功能:代码输出

区分

在 SymPy 中,对非常大的表达式进行微分可能需要一些时间;对于大型表达式,求导可能需要几分钟才能完成。这种情况最常见于线性化过程中。

坐标和速度的选择

Kane 对象的设置基于一个假设,即广义速度与广义坐标的时间导数不是同一个符号。这并不是说它们不能相同,只是它们必须有不同的符号。如果你这样做:

>> KM.coords([q1, q2, q3])
>> KM.speeds([q1d, q2d, q3d])

你的代码将无法工作。目前,需要提供运动学微分方程。正是在这一点上,我们希望用户会发现他们不应该尝试上述代码所示的行为。

不过,这种行为可能不适用于其他形成运动方程的方法。

打印

默认的打印选项是对 VectorDyad 度量编号进行排序,并且 mprintmpprintmlatex 函数的输出不排序。如果你打印的内容较大,请使用这些函数之一,因为排序可能会使打印时间从几秒增加到几分钟。

替换

在力学中,替换有两个常见问题:

  • 当在表达式中替换 dynamicsymbols 时,sympy 的普通 subs 也会替换动态符号的导数:::

    >>> from sympy.physics.mechanics import dynamicsymbols
    >>> x = dynamicsymbols('x')
    >>> expr = x.diff() + x
    >>> sub_dict = {x: 1}
    >>> expr.subs(sub_dict)
    Derivative(1, t) + 1
    

    在这种情况下,xDerivative 内部也被替换为 1,这是不希望的。

  • 代入大型表达式可能会很慢。

如果你的替换是简单的(直接用其他表达式替换表达式,例如在某个操作点进行评估时),建议使用提供的 msubs 函数,因为它显著更快,并且适当地处理了导数问题:

>>> from sympy.physics.mechanics import msubs
>>> msubs(expr, sub_dict)
Derivative(x(t), t) + 1

线性化

目前,线性化方法不支持在“动态方程”之外存在非坐标、非速度动态符号的情况。它也不支持这些类型的动态符号的时间导数出现的情况。这意味着如果你有包含非坐标、非速度动态符号的运动学微分方程,它将无法工作。这也意味着如果你将一个系统参数(比如长度、距离或质量)定义为动态符号,它的时间导数很可能会出现在动态方程中,这将阻止线性化。

点的加速度

至少,点需要定义其速度,因为加速度可以通过在同一框架中对速度进行时间导数来计算。如果使用1点或2点定理来计算速度,速度表达式的时间导数可能会比使用加速度级别的1点和2点定理更复杂。使用加速度级别的方法可以在此阶段产生更短的表达式,这将导致后续更短的表达式(例如在形成Kane方程时)。

高级接口

高级功能

请记住,Kane 对象支持具有随时间变化的质和惯性的物体,尽管此功能与线性化方法不完全兼容。

操作符在前面讨论过,作为一种对 VectorDyad 对象进行数学运算的可能方式。该模块中的大部分代码实际上是用它们编写的,因为它们(主观上)可以产生更简洁、更短、更易读的代码。如果在代码中使用此接口,请记住要小心并使用括号;Python 中的默认运算顺序会导致加法在某些向量积之前发生,因此请自由使用括号。

未来功能

这将涵盖计划添加到此子模块的功能。

代码输出

生成数值积分代码输出的函数是下一个要实现的最高优先级功能。这里有许多需要考虑的因素。

C 语言(使用 GSL 库)、Fortran 90(使用 LSODA)、MATLAB 和 SciPy 的代码输出是目标。需要考虑的事项包括:在 MATLAB 和 SciPy 中对大型表达式使用 cse,因为它们是解释型语言。目前尚不清楚编译型语言是否会从公共子表达式消除中受益,特别是考虑到它通常是编译器优化的一个组成部分,并且在调用 cse 时可能会有显著的时间惩罚。

在构建这些表达式的字符串时,以及处理输入参数和其他动态符号时,需要小心谨慎。在积分时如何处理输出量也需要决定,可能会考虑多种选项。