
简介基于Matlab制作双曲线和摆线的程序资源面向计算机、电子信息工程、数学等专业的大学生适用于课程设计、期末大作业及毕业设计等场景。压缩包共2个文件包含m格式的Matlab源代码与txt格式的说明文档整体仅673B轻量而完整代码兼容Matlab 2014、2019a和2024a等多个版本采用参数化编程参数可灵活调整注释详细方便理解程序逻辑与按需修改优化。内置可直接运行的案例数据无需自行准备执行后即可绘制双曲线和摆线图形准确反映曲线几何特性。已有80人学习使用新手可借此掌握Matlab绘图基础与参数化编程思路有经验者也能从清晰的注释和结构中获得效率启发作为教学或自学素材适用于学术研究、工程实践等需要精确数学曲线表达的领域。1. 双曲线与摆线两条曲线在 Matlab 里为什么总被放到一起画大学物理和高等数学里双曲线和摆线是两门课几乎同时出现的曲线一个讲圆锥曲线、焦点与渐近线一个讲纯滚动运动学。把这两条曲线放进同一个 Matlab 脚本里是课程作业、论文插图和高数课件里最高频的组合之一。不少人一上来就用fimplicit画隐函数画完发现渐近线位置不对、摆线的拱被压扁、导出 PDF 后曲线发虚问题大多出在坐标轴比例和参数方程的选择上。这篇文章就从参数方程入手把双曲线和摆线从数学式子变成可反复改参数、直接交付的 m 脚本中间每一步都给出能抄着跑的命令、参数取值和容易踩的坑。2. 双曲线绘制双曲线用 cosh/sinh 参数化比 fimplicit 更可控2.1 fimplicit 适合快速预览参数化才适合继续标注双曲线的标准形式是 x²/a² − y²/b² 1。在 Matlab 里最快看到它的方法是fimplicit((x,y) x.^2/a^2 - y.^2/b^2 - 1, [-12 12 -9 9])一条命令就能出图用来验证数学关系足够了。但这条命令带来的问题同样具体默认网格步长固定曲线斜率接近渐近线时水平集会出现明显锯齿返回的ImplicitFunctionLine对象把左右两支拆成不同的线段想给两支设置不同线型、想叠加焦点和顶点都要额外处理数据段渐近线接近区域还可能出现不连续。我一般只在快速预览时用fimplicit要交给别人看、或者要继续往上加标注时一定换成参数方程手动绘制。常见做法是右支取 x a·cosh(u)y b·sinh(u)左支把 x 取相反数u 是实数域上的连续参数。cosh和sinh本身在整个实数域连续且无奇点不会碰到用sec/tan参数化时在渐近线处出现 ±Inf 的情况。这个细节直接决定了你的图在渐近线附近是否干净。2.2 最小可复现脚本参数化双曲线加渐近线标注%% hyperbola_demo.m % 双曲线参数化右支 x a*cosh(u)左支 x -a*cosh(u) a 3; b 2; % 实半轴 a虚半轴 b u linspace(-2.2, 2.2, 800); % u 控制曲线延伸程度800 点保证平滑 x_right a * cosh(u); y_right b * sinh(u); figure(Color,w,Position,[100 100 620 480]); plot(x_right, y_right, b-, LineWidth, 1.6); hold on; plot(-x_right, y_right, b-, LineWidth, 1.6); % 左支与右支关于 y 轴对称 % 渐近线两条y ±(b/a)x xl linspace(-15, 15, 2); % 2 个点就是直线 plot(xl, b/a * xl, k--, LineWidth, 1.0); plot(xl, -b/a * xl, k--, LineWidth, 1.0); % 顶点与焦点 c sqrt(a^2 b^2); plot([a -a], [0 0], ro, MarkerFaceColor, r); plot([c -c], [0 0], ks, MarkerFaceColor, k); legend({右支,左支,渐近线 ,渐近线 -,顶点,焦点}, ... Location, best, FontSize, 9); axis equal; grid on; xlabel(x); ylabel(y); title(sprintf(Hyperbola x^2/%g^2 - y^2/%g^2 1, a, b));逻辑说明u0 时 x±a、y0所以顶点一定落在参数区间正中u 取正负两部分恰好把上下两个方向的曲线都覆盖。linspace(-2.2, 2.2, 800)中 u≈2.2 时 cosh(u)≈4.57所以右支最远到 x≈3×4.57≈13.7渐近线画到 ±15 才能保证它们延伸到画布边缘而不是在曲线中间断掉。axis equal在这里不是装饰不写的话渐近线夹角会被拉伸失真。2.3 a、b 参数对形态的影响与常见误用ab离心率 ec/a渐近线斜率 ±b/a顶点坐标321.202±0.667(±3, 0)531.166±0.600(±5, 0)242.236±2.000(±2, 0)从表里能直接看出规律a 固定时 b 增大渐近线斜率变大开口更宽离心率也更大。这是做课程设计时最常用的对比维度。如果你想在同一张图上对比多组参数把上面的绘图语句封装成函数、循环调用即可不要复制粘贴整段绘图代码。提示显式解出 y ±(b/a)·sqrt(x² − a²) 再绘图时|x| a 区间会出现 NaN绘出的曲线中间断裂。这是初学者最常见的误用参数方程不存在这个问题。3. 摆线绘制参数方程、滚动圈数与 axis equal 的默认陷阱3.1 从滚动圆到摆线方程x r(t − sin t) 怎么来的摆线是一个半径为 r 的圆在 x 轴上无滑动滚动时圆上某一点留下的轨迹。滚动角为 t 时圆心从原点平移到 (rt, r)圆上起始接触点相对圆心转过了角度 t分量合成后得到 x rt − r·sin ty r − r·cos t。这就是标准摆线参数方程。t 的范围决定圆滚几圈0 到 2π 对应一个完整拱形4π 对应两个拱。与双曲线不同摆线几乎没有必要用显式函数表达y 对 x 不是单值函数同一个 x 可能对应两个 y 值强行解只会引入分支判断。参数方程是这类轨迹问题的天然选择Matlab 里直接对参数向量逐项计算即可。3.2 基本脚本两圈摆线的最小实现%% cycloid_demo.m r 1; % 滚动圆半径 t linspace(0, 4*pi, 1200); % 滚两圈1200 个采样点 x r * (t - sin(t)); y r * (1 - cos(t)); figure(Color,w); plot(x, y, b-, LineWidth, 1.6); axis equal; % 不加这句拱形会被压扁 grid on; xlabel(x); ylabel(y); title(sprintf(Cycloid r%g, 2 periods, r));linspace(0, 4*pi, 1200)让每一个拱上分布约 600 个点曲线视觉平滑且文件不会过大。axis equal是摆线绘制的生命线默认的 plot 会让坐标轴占满 figurey 方向最大只有 2rx 方向却有 4πr不设置 equal 时摆线看起来像被横向拉扁的椭圆拱。很多人拿着“为什么我的摆线不对”的图来问十有八九是少了这行。3.3 特征点核查尖点、拱顶与下一个尖点滚动角 txy位置说明000尖点与地面接触瞬时速度为零ππr2r拱顶高度最大2π2πr0下一个尖点完整周期这张表可以用来检查脚本是否正确调整 r 后拱顶坐标应该始终是 (πr, 2r)两个相邻尖点间距是 2πr。如果图上数值与表不符大概率是参数方程里把 sin t 或 cos t 的符号写反了。3.4 一帧代码看滚动关系摆线、圆与半径连线理解摆线最好的方式是把滚动圆和半径连线一起画出来。下面这段代码生成某一时刻的快照θ 是当前滚动角%% cycloid_frame.m 静态快照圆 摆线 半径连线 r 1; theta 3*pi/4; % 取一个非特殊位置便于观察 t linspace(0, 2*pi, 1024); x r*(t - sin(t)); y r*(1 - cos(t)); C [r*theta, r]; % 圆心坐标 (rt, r) M [r*(theta - sin(theta)), ... r*(1 - cos(theta))]; % 摆线上当前点坐标 th linspace(0, 2*pi, 200); figure(Color,w); plot(x, y, b-, LineWidth, 1.5); hold on; plot(C(1) r*cos(th), C(2) r*sin(th), k-, LineWidth, 0.8); plot([C(1) M(1)], [C(2) M(2)], r-, LineWidth, 1.2); plot(M(1), M(2), ro, MarkerFaceColor, r); axis equal; grid on; xlabel(x); ylabel(y);这里 C 与 M 之间的红色连线就是滚动圆的半径长度始终为 r。改 θ 为 0 时M 与地面重合红色半径竖直向下θ 为 π 时M 到达拱顶。把 θ 放进 for 循环、每帧更新后加drawnow limitrate就得到摆线生成的动画。静态快照对理解“滚动”比完整动画更直观因为你能暂停下来看半径方向。4. 双曲线与摆线同框函数封装、subplot 布局与参数演示4.1 把两条曲线的绘图逻辑封装成函数课程作业和 .rar 项目交付里最常见的组织形式是把两套绘图逻辑各自独立成函数主脚本只负责调参和排版。好处是改 a、b、r 时不需要满文件找 plot 语句换线型、改标题、调颜色都集中在函数内部别人拿到代码先读主脚本就能理解流程。Matlab 要求函数名与文件名一致所以下面两个函数必须分别保存为plotHyperbola.m和plotCycloid.m。function plotHyperbola(a, b, uRange, n) %PLOTHYPERBOLA 绘制双曲线两支与渐近线 % 输入a 实半轴b 虚半轴uRange 参数范围n 采样点数 if nargin 3 || isempty(uRange) uRange [-2.2 2.2]; end if nargin 4 n 800; end u linspace(uRange(1), uRange(2), n); x a * cosh(u); y b * sinh(u); plot(x, y, b-, LineWidth, 1.5); hold on; plot(-x, y, b-, LineWidth, 1.5); xl linspace(-1.2*a*cosh(uRange(2)), 1.2*a*cosh(uRange(2)), 2); plot(xl, b/a*xl, k--); plot(xl, -b/a*xl, k--); axis equal; grid on; endfunction plotCycloid(r, arcs, n) %PLOTCYCLOID 绘制摆线 % 输入r 滚动圆半径arcs 拱数n 采样点数 if nargin 2 || isempty(arcs) arcs 2; end if nargin 3 n 1200; end t linspace(0, 2*pi*arcs, n); plot(r*(t - sin(t)), r*(1 - cos(t)), m-, LineWidth, 1.5); axis equal; grid on; end两个函数的默认参数让调用方可以只传最关键的值比如只写plotHyperbola(3, 2)。渐近线的横向范围用系数 1.2 乘曲线端点 x 值保证渐近线一定延伸到画面边缘不会出现曲线超出渐近线范围的尴尬。4.2 主脚本左右分栏布局与矢量导出%% compare_curves.m figure(Color,w,Position,[80 80 1000 420]); subplot(1,2,1); plotHyperbola(3, 2, [-2.2 2.2], 800); title(Hyperbola: x^2/9 - y^2/4 1,FontSize,11); subplot(1,2,2); plotCycloid(1, 2, 1200); title(Cycloid: r1, 2 periods,FontSize,11); exportgraphics(gcf, hyperbola_cycloid.pdf, ContentType, vector);exportgraphics从 R2020a 开始提供矢量 PDF 用于论文插图非常合适老版本可以改用print(gcf, -dpdf, -painters)。如果用的是 R2019b 以后的版本我更推荐把subplot(1,2,1)换成tiledlayout(1,2)nexttile标题和坐标轴对齐更整齐导出的 PDF 也更干净。两条曲线尽量不要塞进同一个 axes。双曲线坐标范围动辄 ±15摆线在半径 1 时只有 0 到 12.57两边数值尺度接近但形状差异大同图叠加后必然有一条被压缩。左右分栏既保留可比性又避免比例冲突。4.3 参数演示动画固定坐标轴范围曲线才“看得见”变化课程演示里经常需要连续改变 r 或 a让人直观看到曲线形状随参数变化。这个需求用 for 循环加drawnow limitrate就能完成但有一个隐藏坑如果不固定坐标轴范围Matlab 会随数据变化自动缩放坐标轴结果 r 从 0.5 变到 3 时画面几乎看不出变化。%% cycloid_parameter_sweep.m figure(Color,w); rlist 0.5:0.2:3.0; t linspace(0, 4*pi, 1200); for r rlist x r*(t - sin(t)); y r*(1 - cos(t)); plot(x, y, m-, LineWidth, 1.4); axis equal; xlim([0 4*pi*3.0]); % 用最大半径固定范围 ylim([0 6.4]); % 最大 y 2*3 6 title(sprintf(Cycloid r %.1f, r), FontSize, 12); grid on; drawnow limitrate; end核心思路是先用参数的最大值计算坐标范围并固定再用当前值重绘。drawnow limitrate比drawnow帧率更低适合这种不追求实时交互的演示如果想更快可以把plot返回的句柄存下来循环里只更新XData和YData。5. 交付前验证技巧双曲线残差、摆线尖点速度与出图细节5.1 用隐式方程残差验证双曲线画完图不意味着数值正确。最直接的验证方式是把参数方程代回标准形式检查残差量级。%% verify_hyperbola.m a 3; b 2; u linspace(-2.2, 2.2, 1000); x a*cosh(u); y b*sinh(u); res x.^2/a^2 - y.^2/b^2 - 1; fprintf(max|res| %.3e\n, max(abs(res)));正常输出在 1e-14 量级说明参数方程与隐式方程完全一致如果出现 1e-2 量级的残差多半是 u 范围太大或采样点太少导致曲线端点未闭合。验证放在交付前一分钟跑一遍比反复目测图线可靠得多。5.2 用速度模长验证摆线尖点摆线运动学里最漂亮的结论是尖点处的瞬时速度为零。这个性质不仅可以手推也能用数值方式验证代码极其简单。%% verify_cycloid_velocity.m r 1; t linspace(0, 2*pi, 2000); vx r*(1 - cos(t)); vy r*sin(t); speed hypot(vx, vy); fprintf(t0 时速度模长 %.3e\n, speed(1)); fprintf(tpi 时速度模长 %.3f\n, speed(1001));理论速度模长是 2·r·|sin(t/2)|t0 时为零tπ 时为 2r。数值结果应当与之一致。这一步能同时证明几何形状和滚动运动学关系都没画错是作业评审时很加分的自查项。5.3 尖点附近的采样策略把摆线尖点放大后会看到 plot 折线在尖锐转角处出现几个点构成的小斜边这是因为采样点没有正好落在尖点两侧极近的位置。盲目把总采样数加到 10000 只是全局浪费正确的做法是在尖点局部加密或者直接用小半径空心圆在尖点位置做标记。双曲线渐近线附近也是同理想贴得足够近就把 u 采样点提到 4000同时不要改变渐近线的端点范围否则画面结构会变。5.4 .rar 交付时的编码与出图格式打包交作业时注意三个细节第一老版本 Matlab 在 Windows 上默认按系统编码读 .m 文件中文注释跨版本打开容易乱码稳妥做法是注释用英文或者统一把编辑器编码设为 UTF-8第二输出文件用相对路径避免出现C:\Users\张三\...这类绝对路径别人解压后直接能跑第三矢量 PDF 给论文300 DPI 的 PNG 给 PPTexportgraphics(gcf, fig.png, Resolution, 300)一条命令解决。这些细节点不会让你的曲线更漂亮但会让拿到 .rar 的人少浪费半小时猜你的环境配置。本文还有配套的精品资源点击获取