当前位置:首页>python>Python与数学之美--摆线/旋轮线(Cycloid)

Python与数学之美--摆线/旋轮线(Cycloid)

  • 2026-09-08 21:52:16
Python与数学之美--摆线/旋轮线(Cycloid)
摆线,又称旋轮线。想象一个车轮在平坦的直路上无滑动地滚动。如果你在这个车轮的边缘(比如轮胎的气嘴位置)涂上一滴油漆,那么当车轮滚动时,这滴油漆在空中划出的轨迹,就是摆线。
设圆的半径为 r,滚动的角度为参数 t(弧度),则摆线的参数方程为:x = r(t - sin t),  y = r(1 - cos t)
  • x方向:圆心移动的距离rt减去点在水平方向的投影r*sint
  • y方向:圆心高度r减去点在垂直方向的投影r*cost

摆线的方程表达式不算太复杂,然而它的研究贯穿了整个 17 世纪,几乎那个时代所有的数学巨匠都卷入其中,可以说是天才们的角斗场:

人物

贡献/故事

伽利略 (Galileo)

命名者。他最早系统研究此曲线,用金属板制作模型测量其面积,发现拱形面积大约是生成圆面积的 3 倍(后来被证明精确为 3 倍)。他称其为"Cycloid"(源自希腊语“循环”)。

梅森 (Mersenne)

提出挑战:求摆线一拱的长度和面积。难倒了当时的无数数学家。

罗贝瓦尔 (Roberval)

首位解题者。他利用巧妙的几何方法(不可分量法)算出了面积,但为了保持优先权,长期保密解法,导致与他人发生激烈争执。

费马 & 笛卡尔

分别独立给出了求切线的方法。笛卡尔曾傲慢地说:“即使费马找到了切线,也不代表他懂几何。”

帕斯卡 (Pascal)

沉迷时期。1658 年,饱受牙痛折磨的帕斯卡试图通过思考摆线问题来转移注意力。结果他不仅没缓解疼痛,反而彻底沉迷,解决了长度、重心、体积等所有遗留问题,并举办了一场公开竞赛。

惠更斯 (Huygens)

应用之王。他发现摆线的等时性,并据此设计了世界上第一个真正的摆线钟,解决了航海经度测量的难题。

牛顿 & 莱布尼茨

微积分发明后,摆线成为验证微积分威力的最佳试金石。传说约翰·伯努利提出“最速降线”问题时,牛顿下班回家看到题目,当晚就解出来了


用python绘制摆线的代码如下,采用动态展示方式(可直接运行,将得到上图效果)
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimation# --- 1. 参数设置 ---r = 1.0              # 圆的半径t_max = 4 * np.pi    # 滚动的总角度 (2π是一圈,这里展示两圈)frames = 100         # 动画帧数t_vals = np.linspace(0, t_max, frames) # 时间/角度序列# --- 2. 初始化画布 ---fig, ax = plt.subplots(figsize=(8, 4))ax.set_aspect('equal')ax.set_xlim(-1, t_max + 1)ax.set_ylim(-0.5, 2.5 * r)ax.grid(True, linestyle='--', alpha=0.3)ax.set_title(f'Cycloid Generation (r={r})', fontsize=14)# 创建绘图对象 (初始为空)line_traj, = ax.plot([], [], 'r-', lw=2, label='Cycloid Path') # 红色轨迹circle_plot, = ax.plot([], [], 'b-', lw=1)                     # 蓝色滚动圆radius_line, = ax.plot([], [], 'g--', lw=1)                    # 绿色半径连线point_dot, = ax.plot([], [], 'ko', markersize=6)               # 黑色动点# 添加一条地平线ax.axhline(0, color='black', lw=2)# --- 3. 动画更新函数 ---def update(frame_idx):    t = t_vals[frame_idx]    # A. 计算当前时刻动点 P 的坐标 (摆线方程)    x_p = r * (t - np.sin(t))    y_p = r * (1 - np.cos(t))    # B. 计算当前时刻圆心 C 的坐标    # 圆心高度恒为 r,水平位置随 t 线性移动    x_c = r * t    y_c = r    # C. 生成当前时刻圆的轮廓点 (用于画那个滚动的圆)    theta_circle = np.linspace(0, 2*np.pi, 50)    # 圆的参数方程:中心在 (x_c, y_c),注意角度偏移以匹配滚动状态    x_circ = x_c + r * np.cos(theta_circle + np.pi/2 - t)     y_circ = y_c + r * np.sin(theta_circle + np.pi/2 - t)    # D. 更新数据    # 1. 更新轨迹 (从 0 到当前 t 的所有点)    t_history = t_vals[:frame_idx+1]    x_hist = r * (t_history - np.sin(t_history))    y_hist = r * (1 - np.cos(t_history))    line_traj.set_data(x_hist, y_hist)    # 2. 更新滚动圆    circle_plot.set_data(x_circ, y_circ)    # 3. 更新半径连线 (圆心 -> 动点)    radius_line.set_data([x_c, x_p], [y_c, y_p])    # 4. 更新动点位置    point_dot.set_data([x_p], [y_p])    return line_traj, circle_plot, radius_line, point_dot# --- 4. 创建并播放动画 ---ani = FuncAnimation(fig, update, frames=frames, interval=50, blit=True)plt.legend(loc='upper right')plt.show()

如果你想修改展示效果,只需调整下面几个参数:

  • 改 r = 2.0:圆变大,波浪更高更宽。
  • 改 t_max = 10 * np.pi:让它滚得更远,画出更多周期。
  • 改 interval = 20:让动画速度变快(数值越小越快)。

代码原理解析

  1. 数学核心:
    • 轨迹点:直接套用摆线方程表达式 x=r(t−sin⁡t),y=r(1−cos⁡t)
    • 圆心:因为圆是无滑动滚动,圆心水平移动距离等于弧长s=rt,高度始终是半径r。所以圆心坐标是(rt, r)
    • 滚动圆的绘制:这是最关键的一步。为了让圆看起来在“滚”而不是“滑”,圆上的点必须随着圆心移动的同时进行反向旋转。代码中 theta_circle + ... - t 就是为了实现这个旋转效果。
  2. 动画逻辑 (update 函数):
    • 每一帧只计算当前时刻 t 的状态。
    • line_traj 绘制的是从 0 到当前 t 的历史轨迹,形成那条优美的波浪线。
    • circle_plot 和 radius_line 实时跟随,展示几何构造过程。
  3. 可视化细节:
    • ax.set_aspect('equal'):非常重要,否则圆会被压扁成椭圆,破坏物理真实感。
    • blit=True:只重绘变化的部分,让动画更流畅。
数学不只是枯燥的公式,而是描述宇宙运行规律的优美语言。摆线便是数学美学的巅峰代表之一:只是一个滚动的圆,却集最速降线和等时曲线这两大特性于一身~

过往文章/合集

合集

文章

Python编程小技巧

Python编程小技巧--用Python查询天气

Python编程小技巧--‌自制简易系统监控

Python--数据/图像可视化

Python编程小技巧--雷达图

Python编程小技巧--新年倒计时小工具2.0版

Python编程小技巧--桑基图(Sankey Diagram)

Python编程基础算法

Python编程基础算法--斐波那契数列的矩阵算法

Python编程基础算法--LeetCode编辑距离问题

细数那些经典教材

细数那些经典教材--算法与数据结构

细数那些经典教材--编程竞赛

Python库巡礼

Python库巡礼--Polars

Python库巡礼--Dask

Python与数学之美

Python与数学之美--黄金螺线

Python与数学之美--李萨如曲线(Lissajous)

Python与办公自动化
Python与办公自动化--批量生成报告/通知

最新文章

随机文章