探索三维螺旋线的几何奥秘:曲率与挠率的计算与可视化

在几何学的广袤世界中,三维螺旋线以其优雅的形态和深邃的数学特性吸引着无数探索者。本文将深入剖析一段 Python 代码,它不仅绘制了三维螺旋线的曼妙身姿,还揭示了隐藏在其背后的几何密码——曲率与挠率,并通过可视化手段让这些抽象概念变得直观可感。

三维螺旋线的数学定义

三维螺旋线是一种经典的参数曲线,其位置向量 $ \mathbf{r}(t) $ 定义为:

r ( t ) = [ cos ⁡ ( t ) sin ⁡ ( t ) t ] \mathbf{r}(t) = \begin{bmatrix} \cos(t) \\ \sin(t) \\ t \end{bmatrix} r(t)= cos(t)sin(t)t

这个简单的参数方程描绘出一条既环绕 z 轴旋转又沿 z 轴方向延伸的曲线。当参数 $ t $ 在区间 $ [0, 2\pi] $ 变化时,曲线完成一个完整的螺旋循环,同时在 z 轴方向上升 $ 2\pi $ 个单位。

def r(t):
    return np.array([np.cos(t), np.sin(t), t])

运动学量的计算

为了深入理解曲线的几何性质,我们需要计算其运动学量:

速度向量$ \mathbf{v}(t) $

速度向量是位置向量对时间的一阶导数:

v ( t ) = d d t r ( t ) = [ − sin ⁡ ( t ) cos ⁡ ( t ) 1 ] \mathbf{v}(t) = \frac{d}{dt}\mathbf{r}(t) = \begin{bmatrix} -\sin(t) \\ \cos(t) \\ 1 \end{bmatrix} v(t)=dtdr(t)= sin(t)cos(t)1

def v(t):
    return np.array([-np.sin(t), np.cos(t), 1])

加速度向量 $ \mathbf{a}(t) $

加速度向量是速度向量对时间的一阶导数:

a ( t ) = d d t v ( t ) = [ − cos ⁡ ( t ) − sin ⁡ ( t ) 0 ] \mathbf{a}(t) = \frac{d}{dt}\mathbf{v}(t) = \begin{bmatrix} -\cos(t) \\ -\sin(t) \\ 0 \end{bmatrix} a(t)=dtdv(t)= cos(t)sin(t)0

def a(t):
    return np.array([-np.cos(t), -np.sin(t), 0])

加加速度向量 $ \mathbf{\alpha}(t) $

加加速度向量是加速度向量对时间的一阶导数:

α ( t ) = d d t a ( t ) = [ − sin ⁡ ( t ) cos ⁡ ( t ) 0 ] \mathbf{\alpha}(t) = \frac{d}{dt}\mathbf{a}(t) = \begin{bmatrix} -\sin(t) \\ \cos(t) \\ 0 \end{bmatrix} α(t)=dtda(t)= sin(t)cos(t)0

def alpha(t):
    return np.array([-np.sin(t), np.cos(t), 0])

曲率与挠率的计算

曲率(Curvature)

曲率衡量曲线在某点处偏离直线的程度,其计算公式为:

κ = ∣ ∣ v ( t ) × a ( t ) ∣ ∣ ∣ ∣ v ( t ) ∣ ∣ 3 \kappa = \frac{|| \mathbf{v}(t) \times \mathbf{a}(t) ||}{|| \mathbf{v}(t) ||^3} κ=∣∣v(t)3∣∣v(t)×a(t)∣∣

其中:

  • $ \mathbf{v}(t) \times \mathbf{a}(t) $ 是速度向量与加速度向量的叉乘
  • $ || \cdot ||$ 表示向量的模长
def compute_curvature(t):
    v_t = v(t)
    a_t = a(t)
    cross_product = np.cross(v_t, a_t)
    norm_v = np.linalg.norm(v_t)
    norm_cross = np.linalg.norm(cross_product)
    if norm_v == 0 or norm_cross == 0:
        return 0.0
    kappa = norm_cross / (norm_v ** 3)
    return kappa

挠率(Torsion)

挠率衡量曲线在某点处偏离平面曲线的程度,其计算公式为:

τ = ( v ( t ) × a ( t ) ) ⋅ α ( t ) ∣ ∣ v ( t ) × a ( t ) ∣ ∣ \tau = \frac{ (\mathbf{v}(t) \times \mathbf{a}(t)) \cdot \mathbf{\alpha}(t) }{ || \mathbf{v}(t) \times \mathbf{a}(t) || } τ=∣∣v(t)×a(t)∣∣(v(t)×a(t))α(t)

其中:

  • $ (\mathbf{v}(t) \times \mathbf{a}(t)) \cdot \mathbf{\alpha}(t) $ 是叉乘结果与加加速度向量的点乘
def compute_torsion(t):
    v_t = v(t)
    a_t = a(t)
    alpha_t = alpha(t)
    cross_product = np.cross(v_t, a_t)
    dot_product = np.dot(cross_product, alpha_t)
    norm_cross = np.linalg.norm(cross_product)
    if norm_cross == 0:
        return 0.0
    tau = dot_product / norm_cross
    return tau

可视化实现

为了将这些抽象的数学概念具象化,我们利用 Python 的可视化库进行绘制:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def r(t):
    return np.array([np.cos(t), np.sin(t), t])

def v(t):
    return np.array([-np.sin(t), np.cos(t), 1])

def a(t):
    return np.array([-np.cos(t), -np.sin(t), 0])

def alpha(t):
    return np.array([-np.sin(t), np.cos(t), 0])

def compute_curvature(t):
    v_t = v(t)
    a_t = a(t)
    cross_product = np.cross(v_t, a_t)
    norm_v = np.linalg.norm(v_t)
    norm_cross = np.linalg.norm(cross_product)
    if norm_v == 0 or norm_cross == 0:
        return 0.0
    kappa = norm_cross / (norm_v ** 3)
    return kappa

def compute_torsion(t):
    v_t = v(t)
    a_t = a(t)
    alpha_t = alpha(t)
    cross_product = np.cross(v_t, a_t)
    dot_product = np.dot(cross_product, alpha_t)
    norm_cross = np.linalg.norm(cross_product)
    if norm_cross == 0:
        return 0.0
    tau = dot_product / norm_cross
    return tau

t_min, t_max = 0, 2*np.pi
n_points = 100
t_values = np.linspace(t_min, t_max, n_points)

curvatures = [compute_curvature(t) for t in t_values]
torsions = [compute_torsion(t) for t in t_values]

r_values = np.array([r(t) for t in t_values])
x, y, z = r_values[:, 0], r_values[:, 1], r_values[:, 2]

fig = plt.figure(figsize=(15, 10))
ax_3d = fig.add_subplot(2, 3, 1, projection='3d')
ax_xy = fig.add_subplot(2, 3, 2)
ax_yz = fig.add_subplot(2, 3, 3)
ax_xz = fig.add_subplot(2, 3, 4)
ax_curvature = fig.add_subplot(2, 3, 5)
ax_torsion = fig.add_subplot(2, 3, 6)

ax_3d.plot(x, y, z, label='Curve')
ax_3d.set_xlabel('X'), ax_3d.set_ylabel('Y'), ax_3d.set_zlabel('Z')
ax_3d.legend()

ax_xy.plot(x, y)
ax_xy.set_xlabel('X'), ax_xy.set_ylabel('Y')

ax_yz.plot(y, z)
ax_yz.set_xlabel('Y'), ax_yz.set_ylabel('Z')

ax_xz.plot(x, z)
ax_xz.set_xlabel('X'), ax_xz.set_ylabel('Z')

ax_curvature.plot(t_values, curvatures, label='Curvature')
ax_curvature.set_xlabel('t'), ax_curvature.set_ylabel('Curvature')
ax_curvature.legend()

ax_torsion.plot(t_values, torsions, label='Torsion')
ax_torsion.set_xlabel('t'), ax_torsion.set_ylabel('Torsion')
ax_torsion.legend()

plt.tight_layout()
plt.show()

深入理解几何意义

通过这段代码,我们不仅绘制出三维螺旋线的完整形态,还在不同平面上进行投影,从多个视角观察曲线的特性。更重要的是,我们计算并可视化了曲线的曲率和挠率,这两个几何量深刻揭示了曲线的内在性质:

  1. 曲率的变化:曲率曲线显示了螺旋线在不同位置的弯曲程度。对于标准螺旋线,曲率是一个常数,这表明其弯曲程度在整条曲线上保持一致。

  2. 挠率的变化:挠率曲线揭示了螺旋线偏离平面曲线的程度。对于标准螺旋线,挠率也是一个常数,表明其扭曲程度均匀。

这些几何量不仅在纯数学领域具有重要意义,在工程、物理、计算机图形学等多个学科中也有广泛应用。例如,在机器人路径规划中,曲率和挠率可以帮助设计平滑的运动轨迹;在计算机图形学中,它们可以用于生成自然的曲线和曲面。

你可能感兴趣的:(python,曲率,挠率)