简介:这份资源是2022年全国大学生数学建模竞赛本科组B题的完整论文,聚焦无人机纯方位无源定位问题,适合备战数模竞赛的本科生、指导教师及对编队控制与几何定位建模感兴趣的读者参考。论文获河北省一等奖,围绕圆形与锥形编队,系统建立被动接收信号无人机的定位模型与位置调整模型,运用二维直角坐标系、余弦定理与“三圆共点”思想,讨论额外发射信号无人机数量的确定及步长遍历调整方案,并附MATLAB编程实现思路。资源包共1个PDF文件,大小约2.63MB,内容涵盖问题重述、模型假设、符号说明、模型建立与求解及总结,结构完整,可直接作为赛题复盘与论文写作范本。目前已有8040人学习下载,便于读者快速理解纯方位无源定位的建模脉络与MATLAB求解流程。
1. 纯方位无源定位:为什么三个角度就能锁死一架无人机的位置
一架无人机在编队里飞偏了几米,它自己不知道偏在哪,也不能开雷达主动测距——电磁信号会暴露编队。它唯一能拿到的信息,是其他无人机发来的“你在我这个方向”的方位角。只有角度、没有距离,这在直觉上几乎等于无解:一个角度对应一条射线,无穷多个点都满足。可现实是,只要凑齐三个方位角,位置就被唯一钉死了。这背后的几何机制,正是纯方位无源定位最反直觉、也最值得拆开看的地方。搞懂它,不只是会做一道建模题,而是理解一类“只测角不测距”的定位系统为什么能 work、在什么条件下会翻车。这份 2022 年全国大学生数学建模竞赛本科组 B 题的完整解答,把从定位模型到编队调整的全链路都摊开了,正好拿来当解剖样本。
2. 方位角定位的几何本质:一个角为什么画出一段圆弧
2.1 从“一个角对应一条射线”到“一个角对应一段圆弧”
很多人第一反应是:接收机测到一个方位角,就得到一条从发射机出发的射线,接收机在这条射线上。这个理解只在“发射机知道自己的朝向、接收机也知道自己相对发射机的绝对方位”时成立。纯方位无源定位里没有这个前提,接收机测到的是“信号来向相对于某个参考方向的角度”,本质是一个圆周角。
关键几何事实是:平面上到两个定点张角为定值的动点,轨迹是一段圆弧(严格说是关于两定点连线对称的两段圆弧拼成的封闭曲线)。这就是圆周角定理的逆命题。所以一个方位角不是一条射线,而是一整段圆弧——接收机可能在这段弧上的任何一点。这解释了为什么“只增加一个发射机、只多一个角度”仍然不够:两条弧一般有两个交点,位置有歧义。
2.2 三圆共点:三个角度如何消掉歧义
当编队里有三架位置已知且无偏差的无人机同时发射信号,接收机就拿到三个方位角,对应三段圆弧。三段圆弧若交于同一点,这个点就是唯一解。原文把这个机制叫“三圆共点”,并在问题一第二小问里用枚举法验证了它的可行性。
这里有个容易被忽略的细节:三段弧两两相交最多产生多个候选点,真正让解唯一的不是“弧多”,而是“弧的约束互相独立”。如果三架发射机恰好共线,或者接收机落在某两架发射机连线的延长线上,圆弧会退化成直线或出现相切,约束就塌了。原文在问题二里专门点出了这个退化情形——位于三角形边延长线上的无人机“只能传送一个方向信息,无法实现准确定位”。这不是数值精度问题,是几何结构本身丢了秩。
2.3 钝角“眼睛”与锐角“葫芦”:轨迹形状的代数来源
原文对轨迹形状给了一个很形象的说法:定值夹角为钝角时轨迹像“眼睛”,为锐角时像“葫芦”。这不是修辞,是方程配平后的直接结果。以两定点 $A$、$B$ 为例,设接收点为 $P$,夹角 $\angle APB=\theta$ 固定,用余弦定理写出
$$\cos\theta=\frac{PA^2+PB^2-AB^2}{2\cdot PA\cdot PB}$$
把 $PA$、$PB$ 用坐标展开、移项配方,会得到一个二次曲线方程。$\theta$ 为钝角时 $\cos\theta<0$,配方后两段弧在 $AB$ 两侧外凸,形似眼睛;$\theta$ 为锐角时 $\cos\theta>0$,两段弧内凹,形似葫芦。原文给出的式 (18)(19) 就是这个配平结果。理解这一点很重要:轨迹形状决定了两个候选交点分得多开,也就决定了数值求解时容差该设多小,否则会把“葫芦”的两个瓣误判成同一个解。
3. 定位模型的源码级拆解:余弦定理怎么一步步反解坐标
3.1 建模思路:把“定位”拆成两个子问题
原文有一个很清醒的处理:题目说的“定位模型”其实包含两件事——一是根据方位信息算出无人机当前的实际位置,二是算出它应该到达的准确位置。这两件事用的是同一套几何,但已知量不同。实际位置求解时,三个方位角是测量值;准确位置求解时,利用的是“九架无人机均匀分布在圆周上”这一先验,相邻间隔 40 度,坐标可以直接写出来。
原文表 1 给出了半径 $r$ 下九架圆周无人机的准确坐标,例如 FY01 为 $(r,0)$,FY02 为 $(0.77r,0.64r)$,FY03 为 $(0.17r,0.98r)$。这些系数就是 $\cos40^\circ$、$\sin40^\circ$ 一类的三角函数值。把准确坐标当已知,再用余弦定理反解接收机到各发射机的距离,就能锁定准确位置。
3.2 核心代码:符号求解三个未知边长
附录一的 MATLAB 程序是整个定位模型的心脏。它先用已知的两架发射机编号差算出它们之间的弦长,再建立三个余弦定理方程,用符号求解器解出三条边,最后转成直角坐标。
% 已知两架发射信号无人机编号,算它们之间的弦长 % 相邻编号间隔 40 度,编号差乘 40 即圆心角 a1 = sqrt(2*r^2 - cosd(abs(FY0i-FY0j)*40)*2*r^2); % 三个未知量:k0 为接收机到圆心的距离,a2、a3 为到两发射机的距离 syms k0 a2 a3 % 方程一:接收机、圆心、发射机 i 构成的三角形,用余弦定理 eq1 = (k0^2 + a3^2 - r^2)/(2*k0*a3) - cosd(alpha1); % 方程二:接收机、圆心、发射机 j 构成的三角形 eq2 = (k0^2 + a2^2 - r^2)/(2*k0*a2) - cosd(alpha2); % 方程三:接收机与两发射机构成的三角形,a1 为两发射机间距 eq3 = (a2^2 + a3^2 - a1^2)/(2*a2*a3) - cosd(alpha3); [X,Y,Z] = solve(eq1, eq2, eq3, k0, a2, a3); K0 = double(X); % 解出 k0,即接收机到圆心的距离 k0i = acosd(1 - 2*cosd(alpha1)^2); % 由方位角反推极角 k01 = k0i - 40*abs(i-1); % 扣除参考方向偏移 x = real(K0*cosd(k01)); % 转直角坐标 y = real(K0*sind(k01));这段代码有几个值得说透的点。第一,cosd用的是角度制,和题目里 40 度间隔一致,换成cos会直接算错,这是血泪经验级别的坑。第二,三个方程对应三个三角形,eq1、eq2把圆心当作一个已知顶点,eq3用两发射机间距闭合,这样未知量刚好三个、方程刚好三个,可解。第三,real()取实部是在兜底:符号求解可能吐出复数根,几何上无意义的复根要丢掉。第四,k0i = acosd(1-2*cosd(alpha1)^2)这一步是从圆周角反推圆心角,本质是圆心角等于同弧圆周角的两倍再做个三角恒等变形,参数alpha1就是接收机对“圆心—发射机 i”这条弦的张角。
3.3 参数怎么改、失败时看什么
如果要把这套模型迁移到别的编队,改的是三处:r是编队半径,直接换;40是相邻无人机圆心角,锥形或其它队形要按实际几何重算;abs(FY0i-FY0j)*40这个“编号差乘间隔”的写法只对均匀圆周编队成立,换队形必须改成按实际坐标算弦长。失败时优先看两件事:solve是否返回空解(说明三个方程矛盾,通常是方位角输入顺序和发射机编号对不上),以及解出的K0是否为负或虚数(说明参考方向偏移量40*abs(i-1)的符号搞反了)。
4. 从“能不能定位”到“要几架发射机”:枚举法背后的可观测性判断
4.1 为什么一架额外发射机就够
问题一第二小问问的是:0 号和 1 号已经发射信号,还要额外加几架才能让其余无人机准确定位。原文的推理链很干净:不加额外发射机时,某架接收机只能收到一个方位信息,轨迹是一段弧,位置不唯一;加一架后,接收机拿到三个方位信息(0 号、1 号、新增那架),三段弧共点,位置唯一。既然一架就够,两架三架当然更够,所以答案是“额外 1 架”。
这个结论的底层是可观测性:未知量是二维坐标两个自由度,每个独立方位角提供一个约束,理论上两个约束就够,但两个约束在几何上常出现双解,需要第三个约束消歧。所以“三架发射机”不是拍脑袋,是自由度计数加退化情形排除后的最小配置。
4.2 枚举 56 种组合:用平方和最小找那架“对的”发射机
实际飞行中,接收机并不知道哪架额外发射机在给它发信号,它只有三个带偏差的方位角测量值。原文的做法是把所有可能组合枚举出来:除 0、1 号外还有 8 架,任选一架当额外发射机,共 $C_8^2=56$ 种情况(原文表 2 列的就是这 56 组理论方位角)。然后对每组算理论值与实测值之差的平方和
$$S=(\alpha_1-\alpha_1')^2+(\alpha_2-\alpha_2')^2+(\alpha_3-\alpha_3')^2$$
取 $S$ 最小的那组,对应的发射机就是实际在发信号的那架。附录二的核心循环就是干这个:
min = 1000; mini = 0; for i = 2:9 if i == FY0k continue; % 接收机自己不会给自己发信号,跳过 end % 三角度偏差平方和 m = (beta1-alpha1(i,FY0k))^2 + (beta2-alpha2(i,FY0k))^2 ... + (beta3-alpha3(i,FY0k))^2; if m <= min min = m; mini = i; % 记录平方和最小时对应的发射机编号 end endbeta1、beta2、beta3是实测方位角,alpha1/2/3(i,FY0k)是“假设 i 号发射、FY0k 接收”时的理论角。continue那行不能省,否则接收机会把自己算成发射机,平方和被人为压低,直接选错。这套“最小二乘匹配”的思路在工程上很常见,本质是用残差最小做信号源识别,比硬解方程鲁棒,因为实测角总有噪声。
4.3 一个容易翻车的边界:钝角优角与余弦恒等
原文专门讨论了一种特殊情况:当接收机处于某个位置使夹角成为优角(大于 180 度)时,余弦值不变。因为 $\cos(360^\circ-\theta)=\cos\theta$,所以模型里用余弦定理算出来的边长不受影响。这个性质保证了定位模型在整圈上都成立,不用分段讨论。但反过来说,如果代码里用acos反求角度,它会只返回 $[0,180^\circ]$ 的主值,优角会被压成锐角,导致方位判断错位。这是纯方位定位里最隐蔽的坑之一,后面排查章节会再展开。
5. 编队调整:0.01 米步长遍历为什么能收敛
5.1 调整模型的极坐标增量思路
问题一第三小问要求把有偏差的无人机调回理想位置。原文的方案是:0 号和 1 号保持相对关系不动,先定位 2 号并调整,再把 2 号加入“无偏差集合”,用 0、1、2 去定位下一架,逐架推进。调整本身用极坐标增量:无人机向北或向南移动一个微小步长,用余弦定理算出移动后到圆心的距离和极角,和理想位置比,没进误差带就继续走。
附录三的循环结构体现了这个迭代:
njl = 0.01; % 最小距离阈值,即误差带 r = 100; % 圆形编队半径 jl = 100; % 初始距离,故意设大以进入循环 while (jl > njl) mjl = 10000; for j = 0:359 % 全方位遍历 360 个方向 % 每个方向试走一步,算新位置到理想位置的距离 % 保留距离最小的方向作为本步移动方向 end jl = mjl; % 更新当前偏差,进入下一轮 endnjl=0.01是收敛判据,for j=0:359是方向枚举,mjl记录本步最优方向的距离。这个结构本质是贪心下降:每步选让偏差最小的方向走一小步,直到偏差小于 1 厘米。原文假设调整时间不计,所以可以理解为“知道该往哪调就瞬间到位”,这让迭代在数学上等价于逐步逼近。
5.2 步长与收敛性的取舍
步长 0.01 米不是随便定的。步长太大,可能在理想位置附近来回震荡、永远进不了误差带;步长太小,迭代次数暴涨。0.01 米配合 0.01 米的误差带,相当于“走一步就够到判据”,收敛最快且不震荡。这里有个隐含前提:每步移动方向是离散的 360 个方向之一,真实最优方向可能落在两个离散方向之间,所以最终位置会有不超过步长量级的残差——这正是把判据设成和步长同量级的原因。如果读者要把这套逻辑用到更高精度场景,步长和判据要同步缩小,否则残差会卡在判据边缘反复触发。
5.3 锥形编队的复用:换队形不换机制
问题二把圆形换成锥形,机制没变,变的是“哪些无人机位置已知”和“哪些点会退化”。原文假设 1 号和 5 号无偏差,先用 1、2、5 构成的三角形互相测角定位 2 号,再逐轮扩展。关键约束还是那条:位于已定位三架无人机三角形边延长线上的无人机无法定位,所以第二轮只能定位 3、6、8、10、12、15 号,第三轮再选 2、6、8 发射信号把剩下的补齐。这说明纯方位定位的可行性完全由“发射机几何构型是否让接收机脱离退化线”决定,队形只是改变了退化线的分布。
6. 避坑与排查:纯方位定位建模里最容易翻车的五件事
6.1 现象:解出的坐标是虚数或负数
原因:符号求解返回了复根,或者参考方向偏移量符号写反。纯方位模型里极角是从某个基准方向量的,40*abs(i-1)这种写法默认编号递增对应角度递增,一旦发射机编号顺序和坐标系定义不一致,偏移量就反了。解决:先固定一架发射机在 x 轴上(原文就是把 FY01 固定在 $(r,0)$),所有角度都相对它量,再检查real()取实部后坐标是否落在合理半径内。
6.2 现象:三个方位角明明很准,枚举法却选错发射机
原因:continue漏写,接收机把自己算进候选发射机,平方和被压低。或者理论角表alpha1/2/3的行列索引和“发射机—接收机”对应关系搞反。解决:打印 56 组平方和排序,看最小值那组的发射机编号是否等于接收机编号,若是则一定是自匹配没排除。
6.3 现象:优角位置定位结果偏到对称的另一侧
原因:用acos反求角度只返回主值,优角被压成锐角,导致方位判断镜像翻转。解决:不要用acos单独反角,直接用余弦定理算边长(余弦对优角不变),坐标由边长和已知基准方向合成,绕开反角的主值陷阱。
6.4 现象:调整迭代在理想位置附近来回跳,永不收敛
原因:步长大于误差带,或方向枚举粒度过粗导致最优方向落在两个离散方向之间。解决:让步长小于等于误差带,或把方向枚举从 360 个加密,再不行就改用连续优化而非离散贪心。
6.5 现象:锥形编队第二轮总有一批无人机定不了位
原因:这些无人机恰好落在已定位三架无人机三角形边的延长线上,方位约束退化。解决:这不是 bug,是几何退化,必须换一组发射机重新组网,原文第三轮选 2、6、8 就是这个思路。建模时要显式判断“接收机是否在发射机三角形边的延长线上”,命中就跳过该组合。
7. 设计取舍:为什么这套模型选择“几何反解”而不是“数值优化”
这套解答最值得琢磨的取舍,是它几乎全程用几何反解(余弦定理加符号求解)而不是一上来就做数值优化。几何反解的好处是每一步都有明确的物理含义,解出来对不对能靠图形直觉校验;代价是对退化情形极其敏感,一旦发射机共线或接收机落在延长线上,方程直接病态。数值优化(比如最小二乘拟合位置)对退化更鲁棒,但会引入初值依赖和局部极小,反而更难解释“为什么这架定不了位”。
原文的选择是把两者结合:定位用几何反解保证可解释性,发射机识别用平方和最小做残差匹配保证鲁棒性,调整用离散贪心保证收敛可控。这个组合不是最优的,但是在“要写清楚、要能复现、要能讲明白为什么”的竞赛约束下的合理折中。我一般会这么理解:纯方位定位的工程价值不在于算得多快,而在于你能不能说清“在什么几何构型下它必然失效”——退化线判断比求解精度更重要。
如果要验证这套模型是否真的 work,最直接的办法是拿附录程序跑一遍:固定半径 100 米,输入一组理论方位角,看反解坐标是否回到表 1 的准确位置;再把某架无人机人为偏移几米,看枚举法能否选出正确的额外发射机、调整循环能否在几十步内收敛到 1 厘米内。跑通这两步,机制就算真正吃透了。从那以后我每次碰只测角不测距的定位问题,都会先画一遍发射机三角形、标出所有退化线,再动手写方程——这个习惯帮我省掉了大量“解出来是虚数”的返工。希望帮到你。
本文还有配套的精品资源,点击获取