
人物 | 贡献/故事 |
|---|---|
伽利略 (Galileo) | 命名者。他最早系统研究此曲线,用金属板制作模型测量其面积,发现拱形面积大约是生成圆面积的 3 倍(后来被证明精确为 3 倍)。他称其为"Cycloid"(源自希腊语“循环”)。 |
梅森 (Mersenne) | 提出挑战:求摆线一拱的长度和面积。难倒了当时的无数数学家。 |
罗贝瓦尔 (Roberval) | 首位解题者。他利用巧妙的几何方法(不可分量法)算出了面积,但为了保持优先权,长期保密解法,导致与他人发生激烈争执。 |
费马 & 笛卡尔 | 分别独立给出了求切线的方法。笛卡尔曾傲慢地说:“即使费马找到了切线,也不代表他懂几何。” |
帕斯卡 (Pascal) | 沉迷时期。1658 年,饱受牙痛折磨的帕斯卡试图通过思考摆线问题来转移注意力。结果他不仅没缓解疼痛,反而彻底沉迷,解决了长度、重心、体积等所有遗留问题,并举办了一场公开竞赛。 |
惠更斯 (Huygens) | 应用之王。他发现摆线的等时性,并据此设计了世界上第一个真正的摆线钟,解决了航海经度测量的难题。 |
牛顿 & 莱布尼茨 | 微积分发明后,摆线成为验证微积分威力的最佳试金石。传说约翰·伯努利提出“最速降线”问题时,牛顿下班回家看到题目,当晚就解出来了 |
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 * ty_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:让动画速度变快(数值越小越快)。theta_circle + ... - t 就是为了实现这个旋转效果。update 函数):line_traj 绘制的是从 circle_plot 和 radius_line 实时跟随,展示几何构造过程。ax.set_aspect('equal'):非常重要,否则圆会被压扁成椭圆,破坏物理真实感。blit=True:只重绘变化的部分,让动画更流畅。合集 | 文章 |
|---|---|