简介:这份资源是2022年全国大学生数学建模竞赛本科组B题的完整研究论文,聚焦无人机纯方位无源定位问题,适合备战数模竞赛的本科生、指导教师及对编队控制建模感兴趣的读者参考。论文围绕圆形与锥形两种编队展开,涵盖被动接收信号无人机的定位模型、发射信号无人机数量的确定、初始位置偏差下的逐步调整方案,并借助二维直角坐标系、余弦定理与“三圆共点”思想求解,配套MATLAB编程实现数值计算与轨迹可视化。资源包共1个PDF文件,大小约2.63MB,内容完整、排版规范,可直接用于赛题复盘与方法迁移。该论文曾获河北省一等奖,目前已有8040人学习下载,读者可从中获取建模思路、公式推导过程与MATLAB求解框架,理解如何将几何关系转化为可计算模型,对提升竞赛论文写作与算法实现能力有较高参考价值。
1. 从一道国赛B题说起:纯方位无源定位到底难在哪
2022年全国大学生数学建模竞赛本科组B题,题目背景是无人机集群编队飞行。编队要保持队形,但飞行中又不能靠主动雷达或电磁波持续通信——信号本身就是暴露源。于是问题落到一个很实际的工程约束上:只靠无人机之间互相“看”到的方位角,能不能把位置算出来、把队形调回来。这道题当年让不少队伍卡在问题一第二小问,因为它考的不是套公式,而是“信息够不够”的判断。这篇方案把整道题的建模链路拆开:定位模型怎么建、额外发射机数量怎么定、圆形和锥形两种编队的调整方案怎么落地,最后给出用 MATLAB 复现和答辩验收的完整路径。适合正在做数模毕设、课程设计,或者需要交一份完整建模方案的人直接参考结构。
2. 需求拆解与总体建模框架:四问对应四层模型
2.1 把题目翻译成可计算的四个子问题
拿到题先别急着写公式,先把四问拆成四个可以独立验证的子任务。问题一第一小问是“已知三架无偏差发射机,求一架有偏差接收机的实际位置和理想位置”,本质是一个几何反解问题;第二小问是“0号和1号已发射,还要几架才能唯一确定”,本质是信息量判定问题;第三小问是“给定初始偏差,怎么一步步调回理想位置”,本质是迭代搜索问题;问题二是“换成锥形编队,调整方案怎么改”,本质是模型迁移问题。
这四层是递进的:第一层解决“能不能算”,第二层解决“信息够不够”,第三层解决“怎么动”,第四层解决“换个队形还成不成立”。我一般会建议队伍在论文里就把这个递进关系画成一张框架图,答辩时评委一眼就能看出你不是四问各写各的,而是共用一套几何内核。
从技术选型看,整道题的核心工具只有三样:二维直角坐标系、余弦定理、枚举加遍历。听起来朴素,但难在每一步的坐标系约定要前后一致。题目里九架无人机均匀分布在半径 r 的圆周上,相邻夹角 40 度,这个 40 度是后面所有角度计算的基准,一旦某一步把编号和角度对应错了,后面全盘皆输。所以建模第一步不是写方程,而是先把编号、角度、坐标三者的对照表钉死。
2.2 坐标系与编号约定:所有公式的地基
圆形编队里 0 号在圆心,1 到 9 号均匀分布在圆周上。把 1 号固定在 x 轴正方向,那么第 k 号无人机的理想坐标就是 (r·cos((k-1)·40°), r·sin((k-1)·40°))。这个约定看起来是小事,但它是后面余弦定理能直接套用的前提。很多队伍翻车就翻在这里:正文里说 1 号在 x 轴,代码里却按 0 号起算,算出来的角度整体偏了 40 度,图上一看轨迹是歪的,还以为是模型错了。
% 圆形编队理想坐标生成:1号固定在x轴正方向,相邻夹角40度 r = 100; % 编队半径,单位米 theta = 0:40:320; % 1到9号对应的极角 ideal = zeros(9, 2); for k = 1:9 ideal(k, :) = [r*cosd(theta(k)), r*sind(theta(k))]; end % ideal(k,:) 即第k号无人机的理想直角坐标这段代码把“编号到坐标”的映射一次性生成,后面所有定位和调整都引用这张表,避免手写坐标出错。参数 r 在问题一第三小问里明确是 100 米,前两小问可以先用符号 r 推导,最后再代入数值。注意 theta 用 0 到 320 而不是 40 到 360,是因为 1 号对应 0 度,这个偏移量必须在全文统一。
2.3 定位模型的两层含义:实际位置与理想位置
题目里“定位模型”其实有两种读法,方案里必须分开写清楚,否则评委会觉得你概念混淆。第一种是“根据接收到的方位信息反解自己当前在哪”,也就是实际位置;第二种是“根据三架已知无偏差发射机,算出自己应该在哪”,也就是理想位置。这两层在数学上是同一套余弦定理的两次使用,但输入输出不同。
实际位置的求解思路是:设接收机为 P,两架发射机为 A、B,圆心发射机为 O。已知三条边的部分长度和三个夹角,用余弦定理联立方程组解出 P 到各发射机的距离,再转成坐标。理想位置的求解思路更巧妙:一个动点到两个定点的夹角是定值,它的轨迹是上下对称的两段圆弧;三架已知发射机给出三条这样的轨迹,三圆共点,交点就是理想位置。这个“三圆共点”是整道题最漂亮的一步,也是答辩时最值得讲的一点。
提示:实际位置和理想位置在论文里要用不同的符号体系,比如实际位置用 (x_p, y_p),理想位置用 (x_p*, y_p*),否则读者分不清你算的是哪一个。
3. 定位模型与发射机数量判定:从余弦定理到枚举搜索
3.1 用余弦定理反解接收机坐标
先看实际位置的求解。设三架发射机编号为 i、j、k,接收机为 p。已知编队半径 r,任意两架圆周上无人机的弦长可以用 2r·sin(Δθ/2) 算,其中 Δθ 是编号差乘 40 度。三个方位角 α1、α2、α3 是接收机测到的、分别对应三对发射机的夹角。设接收机到三架发射机的距离为 d_i、d_j、d_k,对每个三角形用余弦定理列方程:
% 已知三架发射机编号与三个方位角,反解接收机坐标 syms di dj dk % 发射机之间的弦长,编号差转角度差 a_ij = 2*r*sind(abs(i-j)*40/2); a_ik = 2*r*sind(abs(i-k)*40/2); a_jk = 2*r*sind(abs(j-k)*40/2); % 三个余弦定理方程 eq1 = (di^2 + dk^2 - a_ik^2)/(2*di*dk) - cosd(alpha2); eq2 = (di^2 + dj^2 - a_ij^2)/(2*di*dj) - cosd(alpha1); eq3 = (dj^2 + dk^2 - a_jk^2)/(2*dj*dk) - cosd(alpha3); sol = solve([eq1, eq2, eq3], [di, dj, dk]);三个未知数三个方程,理论上可解。实际编程时要注意 solve 可能返回多组解,需要按“距离为正、且落在编队合理范围内”筛掉增根。解出距离后,再用一次余弦定理求接收机相对某架发射机的极角,转成直角坐标。这一步的坑在于角度象限判断:余弦定理只能给出 0 到 180 度的角,接收机可能在发射机连线的两侧,必须结合方位角的符号或几何位置确定象限,否则坐标会镜像翻转。
3.2 三圆共点:理想位置的几何本质
理想位置的求解不依赖接收机自己测到的距离,只依赖三架已知无偏差发射机的位置和三个方位角。核心引理是:平面上到两个定点张角为定值的点,轨迹是过这两点的一段圆弧(定角为锐角时是“葫芦”形,钝角时是“眼睛”形,这是原方案里的形象说法)。三架发射机两两组合给出三条轨迹,三条轨迹的公共交点就是唯一理想位置。
这个引理的证明在论文里值得单独写一小节,因为它把“解方程”提升成了“几何构造”,答辩时更有说服力。实现上不必真的去画圆弧求交,而是回到余弦定理:把三个方位角用已知边和未知边表示,联立求解。原方案里用多次余弦定理把三条轨迹方程化成关于接收机坐标的方程组,本质和三圆共点是一回事,只是用代数方式落地。
注意:三圆共点要求三架发射机不共线。圆形编队里 0 号在圆心、另外两架在圆周上,只要不是正好对径,就不会共线,这个条件在选题号时要检查。
3.3 额外发射机数量:枚举 56 种组合找最小残差
问题一第二小问是整道题的分水岭。0 号和 1 号已经发射,接收机只测到一个方位角,轨迹是一整条圆弧,位置不唯一。再加一架发射机,接收机就有三个方位角(对应三对发射机),理论上可唯一确定。题目问“需要额外增加几架”,答案是 1 架,但论文不能只写结论,必须证明“1 架够、0 架不够”。
证明“0 架不够”很直接:一个方位角对应一条轨迹,轨迹上每一点都满足,无法唯一。证明“1 架够”需要枚举:除 0、1 号外还有 8 架候选发射机,接收机也有 8 种选择,组合起来是 8×7=56 种情况。对每种情况算出三个方位角的准确值,再和实测偏差值比较,取平方和最小的一组,对应的那架就是需要额外加入的发射机。
% 枚举额外发射机:遍历候选机,找方位角残差平方和最小者 best = inf; best_j = -1; for j = 2:9 if j == p, continue; end % 接收机自己不能当发射机 % 计算以 0、1、j 为发射机时,接收机 p 的三个理论方位角 [a1, a2, a3] = theory_angles(0, 1, j, p, r); residual = (a1-beta1)^2 + (a2-beta2)^2 + (a3-beta3)^2; if residual < best best = residual; best_j = j; end end % best_j 即需要额外增加的发射机编号这段枚举的逻辑说明:theory_angles 内部用弦长加余弦定理算出三个理论角,beta1 到 beta3 是实测值。残差平方和最小意味着这组发射机组合最符合观测,也就确定了额外发射机。参数上要注意,接收机 p 不能等于候选机 j,否则自己给自己发信号没有意义,这个 continue 不能漏。原方案里给了两个具体算例验证,一个解出 9 号、一个解出 5 号,论文里保留这种算例能显著增加可信度。
4. 圆形与锥形编队的位置调整:步长遍历与分轮定位
4.1 圆形编队:0.01 米步长全方位搜索
问题一第三小问要求给出调整方案。已知 0 号和 1 号已在理想位置,飞行中保持相对关系不变,所以它们始终无偏差。2 号先根据 0、1 号的方位信息定位,然后调整;调好后 0、1、2 都无偏差,再用它们定位 3 号,依次推进。这个“滚雪球”式的顺序是方案的关键,不能所有无人机同时调,否则没有足够的无偏差参考点。
调整的具体做法是步长遍历:设定步长 0.01 米,从当前位置向四周全方位试探,每走一步重新计算方位角,与理想位置的方位角比较,当位置误差小于 0.01 米时认为到位。原方案里把调整方向分成向北和向南两类,用余弦定理算出移动一步后的极坐标,再和理想极坐标比对。
% 圆形编队单机调整:0.01米步长全方位搜索 step = 0.01; % 步长,米 tol = 0.01; % 到位阈值,米 while true best_err = inf; best_dir = [0, 0]; for ang = 0:5:355 % 全方位试探,5度一个方向 dx = step*cosd(ang); dy = step*sind(ang); % 试探位置相对理想位置的方位角误差 err = angle_error(pos + [dx, dy], ideal_pos, emitters); if err < best_err best_err = err; best_dir = [dx, dy]; end end pos = pos + best_dir; % 走最优的一步 if norm(pos - ideal_pos) < tol, break; end end这段代码的设计说明:外层 while 控制迭代,内层 for 做方向试探,每步选方位角误差最小的方向走。参数 step 取 0.01 米是题目精度要求决定的,tol 同样取 0.01 米,两者一致才能保证“到位即停”。ang 的粒度取 5 度是精度和速度的折中,取太细计算量大,取太粗可能错过最优方向。实际跑的时候要防止死循环,可以加一个最大迭代次数保护。
4.2 锥形编队:两机无偏差假设与分轮定位
问题二换成锥形编队,直线上相邻无人机等距,相邻三架构成等边三角形。这里有个现实约束:如果只有 0 架或 1 架无偏差,根本无法启动定位,所以方案假设 1 号和 5 号无偏差且距离保持。定位 2 号的思路是:先以 1、2 为发射机、5 为接收机得到一个方位角,再以 2、5 为发射机、1 为接收机得到另一个方位角,三角形 1-2-5 里两个角已知,第三个角和 2 号位置就确定了。
调好 2 号后,1、2、5 都无偏差,用它们去定位其他机。但有个几何陷阱:当某架无人机正好落在 1、2、5 构成三角形的边的延长线上时,它只能收到一个有效方位信息,无法定位。原方案里第二轮因此漏掉了 4、7、9、11、13、14 号,第三轮改选 2、6、8 为发射机,剩下的才全部可定位。
% 锥形编队分轮定位:检查候选机是否落在发射机三角形延长线上 function ok = can_locate(p, emitters) % emitters 为三架无偏差发射机编号 ok = true; for m = 1:3 for n = m+1:3 % 若 p 与某两架发射机共线,则无法唯一定位 if abs(cross2(pos(p)-pos(emitters(m)), ... pos(emitters(n))-pos(emitters(m)))) < 1e-6 ok = false; return; end end end end这段判定的逻辑说明:cross2 是二维叉积,叉积接近零说明三点共线,共线时方位角退化,定位方程不满秩。参数 1e-6 是数值容差,实际坐标量级是百米,这个容差足够区分共线和非共线。分轮策略的意义在于:每轮尽量多定位一些机,把它们加入无偏差集合,下一轮可用的发射机就更多,整体收敛更快。论文里把每轮定位了哪些机列成表,答辩时一目了然。
5. 避坑与排查:这道题最容易翻车的五个点
5.1 编号与角度偏移错位
现象是算出来的轨迹整体旋转了一个固定角度,或者理想坐标表和图上对不上。原因几乎都是编号到角度的映射没统一:有的地方按 0 号起算 40 度,有的地方按 1 号起算。解决办法是在论文开头就钉死“1 号在 x 轴、第 k 号极角 (k-1)×40 度”,代码里只保留一个生成函数,所有模块调用它,不手写角度。
5.2 余弦定理解出增根未筛除
现象是 solve 返回多组距离,其中出现负值或明显超出编队范围的值,代进去坐标飞到图外。原因是余弦定理的方程是平方形式,天然有增根。解决办法是解完后加筛选条件:距离必须为正,且接收机坐标必须落在以发射机为圆心的合理半径内。这一步不做,后面所有图都是错的。
5.3 三圆共点前提未检查共线
现象是某些发射机组合下方程组无解或解不唯一。原因是选的三架发射机共线,三条轨迹退化成两条甚至一条。解决办法是在选题号时先做共线检查,圆形编队里避开对径组合,锥形编队里用 4.2 节的叉积判定。这个检查写成一个函数,每次选发射机前调用一次。
5.4 步长遍历陷入局部最优或死循环
现象是无人机在理想位置附近来回震荡,或者迭代几百次还不收敛。原因是步长固定、方向粒度太粗,或者到位阈值和步长不匹配。解决办法是让 tol 不小于 step,方向粒度先粗后细,再加最大迭代次数保护。我一般会先跑一个小规模算例确认收敛,再上全编队。
5.5 锥形编队延长线漏判
现象是第二轮定位时某些机残差很大却仍被当成已定位,导致后续轮次全错。原因是没检查接收机是否落在发射机三角形延长线上。解决办法就是 4.2 节的共线判定,把不能定位的机明确标记为“本轮跳过”,留到下一轮换发射机再处理,而不是硬算。
6. 验收与答辩:怎么证明这套方案真的能跑
验收这套方案,我一般分三步走,每一步都有可检查的产出。第一步是单元验证:拿问题一第一小问的解析解,随机生成若干组无偏差发射机和有偏差接收机,用定位模型反解,看解出的坐标和预设坐标的误差是否在 1e-6 量级。这一步过了,说明余弦定理那套方程没写错。第二步是数量判定验证:对 56 种组合逐一跑枚举,检查每种组合下残差最小的那架是否唯一,如果出现两架残差接近,说明角度精度不够或组合本身退化,要单独说明。第三步是调整过程验证:画一张位置误差随迭代次数下降的曲线,圆形编队应该单调收敛,锥形编队分轮下降,每轮结束误差跳一次。
答辩时最容易被问的三个问题,提前准备好答案。第一个是“为什么额外一架就够”,回答要点是信息量:一个方位角对应一条轨迹,两个方位角对应两条轨迹可能有两个交点,三个方位角三条轨迹才唯一,所以从一到三至少加一架。第二个是“步长 0.01 米会不会太慢”,回答要点是调整时间不计是题目假设,实际工程里可以用变步长或梯度法加速,方案里给的是满足精度要求的最简实现。第三个是“锥形编队为什么假设两架无偏差”,回答要点是启动条件:零架或一架无法建立方程组,两架是能启动定位的最小假设,这个假设在论文的模型假设里要明确写出并说明合理性。
下面这张表可以作为答辩时的验收清单,逐项打勾:
| 验收项 | 检查方法 | 合格标准 |
|---|---|---|
| 坐标约定一致性 | 抽查 3 个编号的坐标 | 与理想坐标表误差 < 1e-6 |
| 定位模型正确性 | 随机 20 组反解 | 坐标误差 < 1e-6 |
| 额外机数量判定 | 56 种组合全跑 | 每种组合残差最小唯一 |
| 圆形调整收敛 | 误差-迭代曲线 | 单调下降至 0.01 米内 |
| 锥形分轮完整性 | 每轮定位清单 | 无漏判、无延长线误判 |
最后说个血泪经验:这道题我见过太多队伍在论文里把公式写得漂漂亮亮,但代码跑出来的图和正文对不上,答辩时被要求现场跑一遍就露馅。从那以后我每次交方案前,都强制把正文里每一个数值算例用代码重跑一遍,图从代码直接导出,不手画、不估算。希望帮到你。
本文还有配套的精品资源,点击获取