粒子,或者说质点,堪称经典物理中的核心模型了,其所具备的重要物理量,包括质量、能量、动量、角动量之类,也早已从经典力学蔓延出去,成为内涵更加深刻的物理概念。
在mechanics中定义了Particle和Point类,其中Point中包括粒子的位置、速度以及加速度信息。二者的构造方式如下。
from sympy.physics.mechanics import Particle, Point
from sympy import Symbol
m = Symbol('m')
pt = Point('pt')
p = Particle('p', pt, m)
print(p.mass) # m
print(p.point) # pt
即粒子 p p p的质量为 m m m,位置在pt。
作为经典物理对象,粒子除了质量与位置之外,还有能量、动量以及角动量,而能量又分为动能和势能。而经典物理中,动能可表示为
E = 1 2 m v 2 E=\frac{1}{2}mv^2 E=21?mv2
空间点对象Point可设置速度,但在设置速度之前,需要先设置一个坐标框架,相应地,其动能也是相对于某个坐标框架下的动能
from sympy.physics.mechanics import ReferenceFrame
v = Symbol('v')
N = ReferenceFrame('N')
p.point.set_vel(N, v * N.y)
p.kinetic_energy(N) # m*v**2/2
同理,其动量可表示如下,其N.y表示速度方向。
p.linear_momentum(N) # m*v*N.y
即
p ? = m v ? \vec p=m\vec v p?=mv
相比之下,重力势能并不是物体内在的性质,而与所在引力场有关,所以需要手动指定其表示形式。
g, h = Symbol('g'), Symbol('h')
p.potential_energy = m * g * h
P.potential_energy # g*h*m
即
V = m g h V=mgh V=mgh
和线动量相比,角动量需要设置一个旋转中心,即需要设置另一个Point,而角动量可表示为
L ? = r ? × p ? \vec L=\vec r\times \vec p L=r×p?
其中, p ? \vec p p?和 r ? \vec r r分别为其动量和到旋转中心的距离,sympy模拟如下
r = Symbol('r')
O = pt.locatenew("O", r*N.x)
p.angular_momentum(O, N) # - m*r*v*N.z
其含义是,定义一个点 O O O,距离p点为 r ? \vec r r。 r ? \vec r r是沿着 x ? \vec x x方向,而 v ? \vec v v是沿着 y y y方向,最后得到的角动量方向沿着 z z z轴,说明sympy的计算是正确的。