物理/向量模块的潜在问题/高级主题/未来功能#
本文档将描述本模块提供的一些更高级的功能,但这些功能不是“官方”界面的一部分。在这里,还将讨论将来将要实现的一些特性,以及关于适当功能的未回答问题。此外,还将讨论常见问题,并提出一些解决办法。
并矢#
在 sympy.physics.mechanics
,用并矢表示惯性 ([Kane1985], [WikiDyadics], [WikiDyadicProducts]) . 并矢是分量单位并矢的线性多项式,类似于向量是分量单位向量的线性多项式。并矢是两个向量之间的外积,它返回一个表示这两个向量并置的新量。例如:
Where \(\mathbf{\hat{a}_x}\mathbf{\hat{a}_x}\) and \(\mathbf{\hat{a}_x}\mathbf{\hat{a}_y}\) are the outer products obtained by multiplying the left side as a column vector by the right side as a row vector. Note that the order is significant.
并矢的一些附加性质是:
参考坐标系中的向量可以表示为 \(\begin{{bmatrix}}a\\b\\c\end{{bmatrix}}\) 或 \(a \mathbf{{\hat{{i}}}} + b \mathbf{{\hat{{j}}}} + c \mathbf{{\hat{{k}}}}\) . 类似地,并矢可以用张量形式表示:
或以并元形式:
与向量一样,后一种表示法可以跟踪并矢定义的帧。而且,并矢中每个项的两个分量不必在同一帧中。以下内容有效:
并矢也可以用向量交叉和点缀;同样,顺序很重要:
我们也可以取并矢的时间导数,或者用不同的帧来表示,就像向量一样。
共同问题#
这里的问题与数值积分代码,选择 \(dynamicsymbols\) 对于坐标和速度表示,将发生打印、微分和替换。
印刷#
默认打印选项是使用排序 Vector
和 Dyadic
度量数字,并具有来自 vprint
, vpprint
和 vlatex
功能。如果要打印较大的内容,请使用其中一个功能,因为排序会将打印时间从几秒增加到几分钟。
替代#
替换成大型表达式可能很慢,而且需要几分钟。
点加速度#
至少,需要定义点的速度,因为加速度可以通过在同一帧中速度的时间导数来计算。如果用1点或2点定理计算速度,速度表达式的时间导数很可能比使用加速度级1点和2点定理更复杂。使用加速级方法可能会导致表达式在这一点上缩短,这将导致稍后表达式更短(例如在形成凯恩方程时)。
高级接口#
这里我们将介绍高级选项: ReferenceFrame
, dynamicsymbols
,以及一些相关功能。
ReferenceFrame#
ReferenceFrame
表现为 .name
属性与 .x
, .y
和 .z
用于访问基本向量的属性,以及相当严格定义的打印输出。如果您希望定义一组不同的索引,可以使用此选项。这也需要一个不同的接口来访问基向量。:
>>> from sympy.physics.vector import ReferenceFrame, vprint, vpprint, vlatex
>>> N = ReferenceFrame('N', indices=['i', 'j', 'k'])
>>> N['i']
N['i']
>>> N.x
N['i']
>>> vlatex(N.x)
'\\mathbf{\\hat{n}_{i}}'
另外,latex输出可以有自定义字符串;但是,可以指定每个基向量的全部内容,而不仅仅是索引。自定义 Latex 字符串可以在没有自定义索引的情况下出现,并且还会覆盖在存在自定义索引时将使用的 Latex 字符串。:
>>> from sympy.physics.vector import ReferenceFrame, vlatex
>>> N = ReferenceFrame('N', latexs=['n1','\\mathbf{n}_2','cat'])
>>> vlatex(N.x)
'n1'
>>> vlatex(N.y)
'\\mathbf{n}_2'
>>> vlatex(N.z)
'cat'
动态符号#
这个 dynamicsymbols
函数还具有“隐藏”功能;与时间相关联的变量可以更改,以及打印导数的符号。:
>>> from sympy import symbols
>>> from sympy.physics.vector import dynamicsymbols, vprint
>>> q1 = dynamicsymbols('q1')
>>> q1
q1(t)
>>> dynamicsymbols._t = symbols('T')
>>> q2 = dynamicsymbols('q2')
>>> q2
q2(T)
>>> q1
q1(t)
>>> q1d = dynamicsymbols('q1', 1)
>>> vprint(q1d)
q1'
>>> dynamicsymbols._str = 'd'
>>> vprint(q1d)
q1d
>>> dynamicsymbols._str = '\''
>>> dynamicsymbols._t = symbols('t')
请注意,只有在更改后创建的动态符号不同。但事实并非如此 \(._str\) 属性;这只影响打印输出,因此在之前或之后创建的动态符号将以相同的方式打印。
还要注意 Vector
的 .dt
方法使用 ._t
属性 dynamicsymbols
,以及其他一些重要的函数和方法。不要混淆和匹配代表时间的符号。
Solving Vector Equations#
To solve equations involving vectors, you cannot directly use the solve functions on a vector. Instead, you must convert the vector to a set of scalar equations.
Suppose that we have two frames N
and A
, where A
is rotated 30
degrees about the z-axis with respect to N
.
>>> from sympy import pi, symbols, solve
>>> from sympy.physics.vector import ReferenceFrame
>>> N = ReferenceFrame("N")
>>> A = ReferenceFrame("A")
>>> A.orient_axis(N, pi / 6, N.z)
Suppose that we have two vectors v1
and v2
, which represent the same
vector using different symbols.
>>> v1x, v1y, v1z = symbols("v1x v1y v1z")
>>> v2x, v2y, v2z = symbols("v2x v2y v2z")
>>> v1 = v1x * N.x + v1y * N.y + v1z * N.z
>>> v2 = v2x * A.x + v2y * A.y + v2z * A.z
Our goal is to find the relationship between the symbols used in v2
and the
symbols used in v1
. We can achieve this by converting the vector to a matrix
and then solving the matrix using sympy.solvers.solvers.solve()
.
>>> solve((v1 - v2).to_matrix(N), [v2x, v2y, v2z])
{v2x: sqrt(3)*v1x/2 + v1y/2, v2y: -v1x/2 + sqrt(3)*v1y/2, v2z: v1z}