更多示例

在接下来的章节中,我们将给出一些使用此模块可以实现的功能示例。

量纲分析

我们将从牛顿第二定律开始

\[m a = F\]

其中 \(m, a\)\(F\) 分别是质量、加速度和力。已知 \(m\) (\(M\)) 和 \(a\) (\(L T^{-2}\)) 的量纲,我们将确定 \(F\) 的量纲;显然我们会发现它是一个力:\(M L T^{-2}\)

从那里我们将使用质量为 \(m\) 的粒子与质量为 \(M\) 的物体之间的引力表达式,距离为 \(r\)

\[F = \frac{G m M}{r^2}\]

确定牛顿常数 \(G\) 的量纲。结果应为 \(L^3 M^{-1} T^{-2}\)

>>> from sympy import symbols
>>> from sympy.physics.units.systems import SI
>>> from sympy.physics.units import length, mass, acceleration, force
>>> from sympy.physics.units import gravitational_constant as G
>>> from sympy.physics.units.systems.si import dimsys_SI
>>> F = mass*acceleration
>>> F
Dimension(acceleration*mass)
>>> dimsys_SI.get_dimensional_dependencies(F)
{Dimension(length): 1, Dimension(mass, M): 1, Dimension(time): -2}
>>> dimsys_SI.get_dimensional_dependencies(force)
{Dimension(length): 1, Dimension(mass): 1, Dimension(time): -2}

维度不能直接比较,即使按照国际单位制它们是相同的:

>>> F == force
False

维度系统对象提供了一种测试维度等价性的方法:

>>> dimsys_SI.equivalent_dims(F, force)
True
>>> m1, m2, r = symbols("m1 m2 r")
>>> grav_eq = G * m1 * m2 / r**2
>>> F2 = grav_eq.subs({m1: mass, m2: mass, r: length, G: G.dimension})
>>> F2  
Dimension(mass*length*time**-2)
>>> F2.get_dimensional_dependencies()  
{'length': 1, 'mass': 1, 'time': -2}

注意,应首先解方程,然后再代入尺寸。

带有数量的方程式

使用开普勒第三定律

\[$\frac{T^2}{a^3} = \frac{4 \pi^2}{GM}$\]

我们可以使用已知的其他变量值(来自维基百科)来计算金星的轨道周期。结果应为224.701天。

>>> from sympy import solve, symbols, pi, Eq
>>> from sympy.physics.units import Quantity, length, mass
>>> from sympy.physics.units import day, gravitational_constant as G
>>> from sympy.physics.units import meter, kilogram
>>> T = symbols("T")
>>> a = Quantity("venus_a")

以国际单位制(SI)指定尺寸和比例:

>>> SI.set_quantity_dimension(a, length)
>>> SI.set_quantity_scale_factor(a, 108208000e3*meter)

添加太阳质量作为数量:

>>> M = Quantity("solar_mass")
>>> SI.set_quantity_dimension(M, mass)
>>> SI.set_quantity_scale_factor(M, 1.9891e30*kilogram)

现在开普勒定律:

>>> eq = Eq(T**2 / a**3, 4*pi**2 / G / M)
>>> eq
Eq(T**2/venus_a**3, 4*pi**2/(gravitational_constant*solar_mass))
>>> q = solve(eq, T)[1]
>>> q
2*pi*venus_a**(3/2)/(sqrt(gravitational_constant)*sqrt(solar_mass))

要转换为天数,请使用 convert_to 函数(并可能近似输出结果):

>>> from sympy.physics.units import convert_to
>>> convert_to(q, day)
71.5112118495813*pi*day
>>> convert_to(q, day).n()
224.659097795948*day

我们也可以使用来自天体物理系统的太阳质量和天作为单位,但我们想展示如何创建一个所需的单位。

在这个例子中,我们可以看到中间维度可能定义不明确,例如 sqrt(G),但应该检查最终结果——当所有维度结合时——是否定义明确。