物理/力学的潜在问题/高级主题/未来特征#
本文档将描述本模块提供的一些更高级的功能,但这些功能不是“官方”界面的一部分。在这里,还将讨论将来将要实现的一些特性,以及关于适当功能的未回答问题。此外,还将讨论常见问题,并提出一些解决办法。
共同问题#
这里的问题与数值积分代码,选择 dynamicsymbols
对于坐标和速度表示,将发生打印、微分和替换。
数值积分代码#
参见未来的输出特性
区分#
在SymPy中对非常大的表达式进行微分可能需要一些时间;对于大型表达式,可能需要几分钟的时间来计算导数。这通常会出现在线性化中。
坐标和速度的选择#
Kane对象是在假定广义速度与广义坐标的时间导数不是同一符号的情况下建立的。这并不是说它们不能相同,只是它们必须有不同的符号。如果你这么做了:::
>> KM.coords([q1, q2, q3])
>> KM.speeds([q1d, q2d, q3d])
你的代码行不通。目前需要提供运动学微分方程。在这一点上,我们希望用户会发现他们不应该尝试上面代码中显示的行为。
不过,对于其他形成运动方程的方法来说,这种行为可能并不正确。
印刷#
默认打印选项是使用排序 Vector
和 Dyad
度量数字,并具有来自 mprint
, mpprint
和 mlatex
功能。如果要打印较大的内容,请使用其中一个功能,因为排序会将打印时间从几秒增加到几分钟。
替代#
力学中有两个常见的替代问题:
在表达式中为
dynamicsymbols
正常的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
在这种情况下,
x
被替换为Derivative
同样,这是不受欢迎的。替换成大型表达式可能很慢。
如果替换很简单(用其他表达式直接替换表达式,例如在操作点求值时),建议使用提供的 msubs
函数,因为它速度明显更快,并适当地处理派生问题:::
>>> from sympy.physics.mechanics import msubs
>>> msubs(expr, sub_dict)
Derivative(x(t), t) + 1
线性化#
目前,线性化方法不支持在“动力学方程”之外存在非坐标、非速度动态符号的情况。它也不支持这些类型的动态符号的时间导数出现的情况。这意味着如果你有一个非坐标,非速度动态符号的运动微分方程,它将不起作用。这也意味着,如果将系统参数(例如长度、距离或质量)定义为动态符号,则其时间导数可能会出现在动力学方程中,这将阻止线性化。
点加速度#
至少,需要定义点的速度,因为加速度可以通过在同一帧中速度的时间导数来计算。如果用1点或2点定理计算速度,速度表达式的时间导数很可能比使用加速度级1点和2点定理更复杂。使用加速级方法可能会导致表达式在这一点上缩短,这将导致稍后表达式更短(例如在形成凯恩方程时)。
高级接口#
高级功能#
记住 Kane
对象支持具有时变质量和惯性的物体,尽管此功能与线性化方法不完全兼容。
运算符在前面讨论过,作为对 Vector
和 Dyad
物体。这个模块中的大多数代码实际上都是用它们来编码的,因为它可以(主观地)生成更简洁、更短、更可读的代码。如果在代码中使用此接口,请记住要注意并使用括号;Python中的默认操作顺序会导致在某些向量乘积之前发生加法,因此请大量使用括号。
未来特色#
这将涵盖要添加到此子模块的计划功能。
代码输出#
生成用于数值积分的代码输出的函数是下一步要实现的最高优先级特性。这里有许多考虑因素。
目标是C(使用GSL库)、Fortran 90(使用LSODA)、MATLAB和SciPy的代码输出。要考虑的事项包括:使用 cse
关于MATLAB和SciPy的大型表达式,它们是解释性的。目前还不清楚编译语言是否会从公共子表达式消除中获益,特别是考虑到它是编译器优化的一个常见部分,并且在调用时可能会有很大的时间损失 cse
.
在为这些表达式构造字符串以及处理输入参数和其他动态符号时,需要小心。集成时如何处理输出量也需要决定,同时考虑多种选择的可能性。