资讯动态

MATLAB仿真万花尺:从旋轮线数学到异形齿轮设计原理

发布时间:2026/8/13 12:43:50 来源:尧图企业网站定制
1. 项目概述当数学玩具遇上工程仿真小时候玩过万花尺吗就是那种由一个带齿的大圆盘和几个带孔的小齿轮组成的绘图玩具用笔穿过小齿轮的孔让小齿轮沿着大圆盘内壁滚动就能画出各种繁复而美丽的曲线。这玩意儿看似简单背后却藏着深刻的数学原理——圆内旋轮线。更妙的是这种几何运动与机械工程中的异形齿轮传动有着异曲同工之妙。这次我们不玩实物而是用MATLAB这个强大的数学与仿真工具来一场从趣味数学到工程原理的深度探索。这个项目的核心就是用代码“仿真”出万花尺的绘图过程并借此深入理解圆内旋轮线的参数化方程。更进一步我们可以将这种几何关系映射到非圆齿轮也就是异形齿轮的齿廓设计思路上。你会发现MATLAB不仅仅是处理矩阵和画函数图的工具它更是一个绝佳的“思想实验”平台能让你直观地看到参数如何影响最终形态这对于理解复杂运动学和进行概念设计至关重要。无论你是MATLAB的初学者想找个有趣的项目练手还是机械相关专业的学生希望直观理解齿轮啮合原理甚至是算法爱好者对生成艺术感兴趣这个项目都能给你带来扎实的收获。2. 核心原理从旋轮线方程到齿轮啮合2.1 圆内旋轮线的数学建模万花尺画出的曲线在数学上称为“圆内旋轮线”或“内摆线”。它的定义非常清晰一个小圆动圆在一个固定的大圆定圆内部无滑动地滚动小圆上或小圆内外某一点所描绘出的轨迹就是旋轮线。要仿真它第一步就是建立其参数方程。我们设定定圆半径R动圆半径r绘图点笔尖到动圆圆心的距离d。当d r时点在动圆内部d r时点在动圆边缘d r时点在动圆外部就像万花尺的笔孔在齿轮臂上。动圆滚动的角度参数theta经过推导核心是考虑纯滚动条件和坐标变换绘图点P的坐标(x, y)可以表示为x (R - r) * cos(theta) d * cos(((R - r) / r) * theta) y (R - r) * sin(theta) - d * sin(((R - r) / r) * theta)这个方程是仿真的灵魂。(R - r) * cos(theta), (R - r) * sin(theta)这部分描述了动圆圆心的运动轨迹它是一个半径为(R - r)的圆。后面加上d * cos(...)和d * sin(...)则描述了绘图点相对于动圆圆心的旋转运动。两个运动的合成便产生了千变万化的图案。注意公式中y坐标的符号为负这是因为在MATLAB的笛卡尔坐标系中角度通常从正X轴逆时针测量。为了保证动圆是“沿着”定圆内壁顺时针滚动符合物理直觉和万花尺实际运动需要在y分量的旋转项前取负号以实现坐标系的匹配。这是第一个容易出错的细节。2.2 参数比与图案的周期性图案是否闭合、有多少个“花瓣”或循环取决于动圆滚动多少圈后绘图点能回到起始位置。这由半径比R/r决定。如果R/r是一个有理数即可以表示为两个整数的比如5/2,7/3那么动圆滚动若干圈后图案会闭合形成周期性曲线。闭合所需的动圆滚动圈数等于R/r化简后的分母。如果R/r是一个无理数如π,√2那么图案将永不重复理论上可以画出无限不循环的密集图案在有限绘图步数下会看到非常密集的填充。例如当R5,r2时R/r 2.5 5/2这是一个有理数。动圆需要滚动2圈分母的值其圆心才能绕定圆圆心转5圈分子的值此时绘图点才回到起点图案闭合。这个“2圈”也常常对应图案的“花瓣”数量或对称重数。2.3 与异形齿轮的关联为什么说这和异形齿轮有关传统的圆形齿轮传动比是恒定的。而非圆齿轮异形齿轮的节曲线不是圆因此传动比是变化的可以实现特殊的运动规律。想象一下如果把万花尺中的定圆看作一个大齿轮的节曲线只是这里是圆形特例动圆看作与之啮合的小齿轮的节曲线。那么动圆圆心在大圆内的运动就模拟了两个齿轮节曲线纯滚动接触点的运动。而绘图点的轨迹则可以启发我们思考如果我要设计一个齿轮使其上某一点比如一个执行器的端点能走出特定的轨迹比如一段旋轮线我该如何反推出这个齿轮的齿廓形状当然真实的异形齿轮设计要复杂得多涉及共轭齿廓的求解、根切判断、强度校核等。但万花尺模型提供了一个极其直观的切入点让我们理解“两个轮廓纯滚动”这一核心约束条件以及运动轨迹与轮廓形状之间的深刻联系。通过调整R,r,d我们相当于在探索无数种可能的“节曲线”组合所产生的输出运动这正是概念设计阶段所需要的灵感。3. MATLAB仿真实现详解理论清晰后我们开始用MATLAB将其实现。整个过程将分为几个清晰的步骤并附上完整的代码块和详细注释。3.1 环境准备与参数设置首先我们明确需要用户交互输入的几个核心参数并为它们设置合理的默认值方便快速测试。% 万花尺圆内旋轮线MATLAB仿真 % 清除工作区、命令窗口关闭所有图形窗口 clear; clc; close all; % 参数设置区 (用户可修改) R 100; % 定圆外圆半径 r 31; % 动圆内圆半径 d 65; % 绘图点距离动圆圆心的距离 num_rotations 10; % 动圆滚动的圈数为了画出完整图案 num_points_per_circle 1000; % 每圈采样的点数影响曲线光滑度 % 检查参数合理性 if r R error(错误动圆半径r必须小于定圆半径R否则无法在内部滚动。); end if d 0 error(错误绘图距离d应为非负数。); end这里有几个关键点参数检查加入了基本的错误检查。如果r R动圆无法在定圆内纯滚动模型不成立。d通常为正但理论上也可以为零点就在动圆圆心我们允许非负。采样点数num_points_per_circle决定了绘图的精细程度。点数太少曲线会显得棱角分明点数太多计算量增大但超过屏幕分辨率后视觉提升有限。1000是一个在平滑度和性能间取得良好平衡的默认值。滚动圈数num_rotations需要足够大以确保图案能完整闭合。对于R/r为有理数的情况我们至少需要滚动其分母对应的圈数。设置为10是一个比较保险的值能应对大多数有理数情况对于无理数比也能画出足够复杂的图案。3.2 核心计算与坐标生成接下来根据参数方程计算绘图点的轨迹坐标。这是计算的核心部分。% 计算轨迹坐标 % 计算动圆需要滚动的总角度弧度 % 滚动一圈是 2*pi 弧度滚动 num_rotations 圈 total_theta num_rotations * 2 * pi; % 生成从0到total_theta的等间距参数数组 theta linspace(0, total_theta, num_points_per_circle * num_rotations); % 根据圆内旋轮线参数方程计算坐标 % 公式: x (R-r)*cos(theta) d*cos(((R-r)/r)*theta) % y (R-r)*sin(theta) - d*sin(((R-r)/r)*theta) x (R - r) * cos(theta) d * cos(((R - r) / r) * theta); y (R - r) * sin(theta) - d * sin(((R - r) / r) * theta);代码非常直接地翻译了数学公式。使用linspace生成参数数组比用循环逐点计算效率高得多这是MATLAB向量化运算的优势。注意((R - r) / r) * theta这一项它代表了绘图点相对于动圆圆心转过的角度其系数(R-r)/r正是动圆与定圆的角速度比。3.3 可视化与动画制作静态图像能展示结果但动画能揭示运动过程理解更深。我们将同时实现静态绘图和动态动画。% 绘制静态完整轨迹 figure(Position, [100, 100, 1200, 500]); % 设置大图窗 % 子图1完整轨迹 subplot(1, 2, 1); plot(x, y, b-, LineWidth, 1.5); axis equal; % 重要保证x,y轴比例相同图形不变形 grid on; title(sprintf(圆内旋轮线 (R%.1f, r%.1f, d%.1f), R, r, d)); xlabel(X坐标); ylabel(Y坐标); % 绘制定圆和动圆初始位置作为参考 hold on; rectangle(Position, [-R, -R, 2*R, 2*R], Curvature, [1, 1], ... EdgeColor, k, LineWidth, 1, LineStyle, --); rectangle(Position, [R-r, -r, 2*r, 2*r], Curvature, [1, 1], ... EdgeColor, r, LineWidth, 1, LineStyle, --); hold off; legend(旋轮线轨迹, 定圆(R), 动圆初始位置(r), Location, best); % 创建绘制过程的动画 subplot(1, 2, 2); axis equal; grid on; title(绘制过程动画); xlabel(X坐标); ylabel(Y坐标); % 设置坐标轴范围以定圆为基准并留些边距 axis_limit R * 1.2; xlim([-axis_limit, axis_limit]); ylim([-axis_limit, axis_limit]); hold on; % 绘制静态的定圆 rectangle(Position, [-R, -R, 2*R, 2*R], Curvature, [1, 1], ... EdgeColor, k, LineWidth, 1, LineStyle, --); % 初始化动画对象 h_trace plot(NaN, NaN, b-, LineWidth, 1.5); % 轨迹线 h_point plot(NaN, NaN, ro, MarkerSize, 8, MarkerFaceColor, r); % 当前绘图点笔尖 h_arm plot(NaN, NaN, r-, LineWidth, 1); % 动圆圆心到笔尖的“臂” h_circle rectangle(Position, [NaN, NaN, 2*r, 2*r], Curvature, [1, 1], ... EdgeColor, r, LineWidth, 1.5); % 动圆 hold off; legend([h_trace, h_point, h_arm, h_circle], ... {轨迹, 笔尖, 臂, 动圆}, Location, best); % 动画循环 fprintf(正在生成动画...\n); % 为了动画流畅不需要每一帧都画可以跳帧采样 frame_skip max(1, floor(length(theta) / 300)); % 目标约300帧 for i 1:frame_skip:length(theta) % 更新轨迹线从起点到当前点 set(h_trace, XData, x(1:i), YData, y(1:i)); % 计算当前动圆圆心位置 center_x (R - r) * cos(theta(i)); center_y (R - r) * sin(theta(i)); % 更新动圆位置 set(h_circle, Position, [center_x - r, center_y - r, 2*r, 2*r]); % 更新“臂”从动圆圆心到笔尖 set(h_arm, XData, [center_x, x(i)], YData, [center_y, y(i)]); % 更新笔尖位置 set(h_point, XData, x(i), YData, y(i)); drawnow; % 刷新图形 pause(0.01); % 控制动画速度可根据性能调整 end fprintf(动画完成\n);实操心得动画部分的性能是关键。如果总点数num_points_per_circle * num_rotations很大比如超过5万点逐帧更新会非常慢。这里采用了frame_skip跳帧逻辑通过计算一个间隔只绘制大约300帧在流畅度和完整性之间取得平衡。drawnow命令强制MATLAB立即更新图形而不是等到循环结束。pause(0.01)引入微小延迟让动画肉眼可见。如果觉得动画太快或太慢可以调整这个值。3.4 结果分析与参数探索运行上述代码后你会得到一幅并排的图。左边是最终生成的完整旋轮线图案右边是绘制过程的动画。动画能清晰展示动圆如何滚动以及“臂”如何摆动从而画出复杂曲线。现在我们可以像玩真正的万花尺一样通过修改参数来探索无穷的图案宇宙经典星形图案尝试R100, r33, d65。因为R/r ≈ 3.03接近整数比3会形成近似三角形的星形图案。多瓣花朵尝试R100, r25, d60。R/r4会形成具有4重对称性的花朵状图案。密集编织感尝试R100, r29, d70。R/r ≈ 3.448这是一个非简单整数比会形成更复杂、看似无序但实则结构精密的编织图案。改变臂长d固定R100, r31分别尝试d20点在动圆内、d31点在动圆上、d80点在动圆外。你会发现d的大小直接影响图案的“膨胀”程度和尖锐度。d越小图案越收缩、平滑d越大图案越扩张并可能出现尖点或环状结构。为了方便这种探索我们可以将上面的脚本改造成一个带参数的函数或者使用MATLAB的实时脚本.mlx文件这样可以交互式地修改变量并立即看到图形更新。4. 从仿真到设计异形齿轮的启发4.1 运动学映射万花尺模型为我们提供了一个现成的“运动发生器”。如果我们把动圆圆心O2到绘图点P的连线看作一个连杆那么定圆和动圆的纯滚动提供了连杆底座动圆的一个已知的、周期性的平面运动圆心轨迹是圆自身有旋转。绘图点P的输出轨迹就是这个复合运动的结果。在机构学中这类似于一个行星轮系动圆是行星轮定圆是中心轮绘图点就是行星轮上的一个点。我们通过仿真直观地得到了这个点的轨迹。反过来思考如果我想要某个特定的、周期性的输出轨迹比如一段特定的曲线我能否通过调整R,r,d这三个参数来近似实现这就是一个简单的机构综合问题。对于异形齿轮思路类似但更复杂。异形齿轮的节曲线不再是圆形而是根据所需的输入输出运动关系传动比函数设计出的任意封闭曲线。两个异形齿轮的节曲线在啮合过程中必须满足纯滚动条件。万花尺的圆形节曲线是其中最特殊、最简单的一种情况传动比恒定。我们的仿真告诉我们即使在这种最简单的情况下输出运动已经如此丰富。那么如果节曲线是椭圆、卵形或其他复杂形状输出运动将拥有更大的设计自由度。4.2 在MATLAB中延伸思考我们可以利用现有的仿真框架做一些思维拓展1. 绘制节曲线接触点轨迹在万花尺模型中两个圆的接触点切点的轨迹是一条直线对于内切圆是定圆的一条直径。但在非圆齿轮中这个接触点在两个齿轮上的轨迹称为“啮合线”就不是直线了。我们可以修改代码计算并绘制这个接触点的运动轨迹初步感受非圆啮合与圆形啮合的不同。% 在动画部分添加接触点的绘制 % 接触点坐标从定圆圆心指向动圆圆心取定圆上的点 contact_theta theta; % 接触点相对于定圆的角度参数 contact_x R * cos(contact_theta); contact_y R * sin(contact_theta); % 然后像绘制笔尖一样在动画循环中更新这个接触点2. 尝试非圆“定圆”这是一个更大的跳跃。我们可以把定圆的半径R从一个常数改为一个随角度变化的函数R(theta)。例如让定圆变成一个椭圆。那么动圆半径r不变在这个椭圆内部“滚动”的定义就需要重新数学定义——此时不再是简单的纯滚动而是要求两个轮廓的弧长增量相等。这需要求解微分方程但我们可以先做一个简化假设进行近似仿真观察效果这能强烈激发对非圆齿轮设计挑战的直观认识。4.3 工程应用的注意事项虽然从万花尺到异形齿轮的联想很有启发性但在实际工程设计中必须跨越巨大的鸿沟共轭齿廓设计节曲线只决定了齿轮的“骨架”。要在节曲线上实现连续、平稳的传动需要在节曲线两侧设计出特定的齿廓如渐开线、摆线等对于非圆齿轮的推广形式使得一对齿廓在任何接触点都满足啮合基本定律。这需要复杂的微分几何和数值计算。根切与干涉非圆齿轮上不同位置的曲率半径变化很大在曲率半径较小的凹侧很容易发生根切加工时刀具切掉齿根有用部分或齿廓干涉。必须在设计阶段进行校验和避免。动平衡与加工非圆齿轮的质量分布不均匀高速转动时会产生巨大的离心力和振动需要进行动平衡设计。其加工也需要专用的数控机床或特种加工方法成本远高于标准齿轮。传动比函数异形齿轮的核心设计输入是传动比函数i12(φ1)即输入轴转角φ1与输出轴转角φ2之间的关系。需要从这个函数出发反推出两个齿轮的节曲线。万花尺模型对应的是传动比恒为(R-r)/r的简单情况。尽管如此这个MATLAB仿真项目仍然价值巨大。它用一个可视化的、可交互的模型将抽象的数学方程和复杂的机构学概念变成了屏幕上生动有趣的图案和动画。它培养的是一种“参数化思维”和“仿真验证思维”这是现代工程设计尤其是基于模型设计MBD的核心能力。5. 常见问题与技巧实录在实际编写和运行这个仿真时你可能会遇到一些问题。以下是一些典型问题及解决方法问题1画出来的图是空白的或者只有一个点。检查1坐标轴范围。最可能的原因是坐标轴范围设置不当图形画在了视野之外。在plot语句后使用axis equal和axis auto或axis([xmin xmax ymin ymax])手动设置合适的范围。在我们的代码中动画部分已经用axis_limit进行了设置。检查2参数方程符号。再次核对y坐标公式中的符号是否为减号-。如果错写为加号图形可能会扭曲到意想不到的位置。检查3参数取值。确保R r 0,d 0。如果d0那么所有点都重合在动圆圆心的轨迹上即一个半径为(R-r)的圆。问题2动画非常卡顿像幻灯片一样。降低帧数增大代码中的frame_skip变量值。如果总点数是10万frame_skipfloor(100000/300)≈333意味着每333个点才画一帧总共约300帧会流畅很多。简化图形对象在动画循环中只更新必要的数据XData,YData避免在循环内创建或删除图形对象。我们的代码已经做到了这一点。关闭抗锯齿对于非常复杂的图形可以在figure属性中尝试关闭抗锯齿但通常效果不明显。更有效的是减少num_points_per_circle。问题3我想保存动画为GIF或视频文件。使用getframe捕获图形帧然后利用VideoWriter对象写入视频文件如AVI、MP4这是最标准的方法。也可以使用第三方函数如gif写入函数保存为GIF。这需要在动画循环中增加捕获和写入的代码会进一步降低实时显示速度通常建议先调试好动画最后再运行一次专门用于录制的脚本。% 示例保存为AVI视频 v VideoWriter(spirograph.avi); open(v); for i 1:frame_skip:length(theta) % ... (更新图形的代码与之前相同) frame getframe(gcf); % 捕获当前图窗 writeVideo(v, frame); end close(v);问题4如何生成一系列参数下的图案并拼图对比使用subplot或tiledlayout功能。你可以写一个循环遍历多组(r, d)参数在同一个图窗的不同子图中绘制。这对于参数化研究非常有用。注意每次循环前要用cla清除当前子图或者为每个子图创建独立的坐标轴对象。问题5公式中的角度参数theta为什么取负号这是坐标系和旋转方向约定导致的结果。在我们的模型和MATLAB默认坐标系X轴向右Y轴向上角度逆时针为正中为了让动圆顺时针沿着定圆内壁滚动这是万花尺的物理运动方式需要在计算绘图点相对于动圆圆心位置时对其旋转角度取负号即- d * sin(...)。你可以尝试改为正号观察动画会发现动圆变成了逆时针滚动画出的图案是镜像的。理解这个符号的物理意义比死记硬背公式更重要。这个项目就像一把钥匙打开了一扇连接数学之美、编程之趣和工程之思的大门。通过调整几个简单的参数你能创造出令人惊叹的图案而透过这些图案你又可以窥见机械传动世界的精密与巧妙。在MATLAB的环境里这一切都变得可触摸、可交互、可探索。不妨就从修改代码中的几个数字开始看看下一次运行会诞生出怎样意想不到的曲线。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价